[build] Generate DW_AT_variables for bin_to_assembly data outputs.

This lets bloaty attribute the data symbol to its source file, allowing the binary size visualization to nest it appropriately.

TEST=runtime/tools/binary_size
Change-Id: I683ad6729d2fe2e1730dd3be70c6cce15bdf0003
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/486524
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
This commit is contained in:
Ryan Macnak
2026-03-10 09:14:30 -07:00
committed by Commit Queue
parent e5e4677962
commit a74e0132e8
2 changed files with 68 additions and 7 deletions
+2 -2
View File
@@ -678,13 +678,13 @@ template("bin_to_assembly") {
invoker.symbol,
"--target_os",
current_os,
"--target_arch",
current_cpu,
]
if (defined(invoker.size_symbol)) {
args += [
"--size_symbol_name",
invoker.size_symbol,
"--target_arch",
current_cpu,
]
}
if (invoker.executable) {
+66 -5
View File
@@ -109,17 +109,17 @@ def Main():
if options.target_os not in ["mac", "ios", "watchos", "win", "win_gnu"]:
output_file.write(".size {0}, .-{0}\n".format(options.symbol_name))
is64bit = 0
if options.target_arch:
if options.target_arch in ["arm64", "x64", "riscv64"]:
is64bit = 1
if options.size_symbol_name:
if not options.target_arch:
sys.stderr.write("--target_arch not specified\n")
parser.print_help()
return -1
is64bit = 0
if options.target_arch:
if options.target_arch in ["arm64", "x64", "riscv64"]:
is64bit = 1
if options.target_os in ["win"]:
output_file.write("public %s\n" % options.size_symbol_name)
output_file.write("%s label byte\n" % options.size_symbol_name)
@@ -140,6 +140,67 @@ def Main():
else:
output_file.write(".long %d\n" % size)
# For text symbols, with -g the assembler will generate the
# DW_TAG_subprogram/label (gcc/clang) for us.
if not options.executable and options.target_arch != None and options.target_os not in [
"mac", "ios", "watchos", "win", "win_gnu"
]:
output_file.write(".section .debug_abbrev,\"\"\n")
output_file.write(".uleb128 1 // define abbreviation code\n")
output_file.write(".uleb128 0x11 // DW_TAG_compile_unit\n")
output_file.write(".byte 1 // DW_CHILDREN_yes\n")
output_file.write(".uleb128 0x3 // DW_AT_name\n")
output_file.write(".uleb128 0x8 // DW_FORM_string\n")
output_file.write(".uleb128 0x1b // DW_AT_comp_dir\n")
output_file.write(".uleb128 0x8 // DW_FORM_string\n")
output_file.write(".uleb128 0 // End of attributes\n")
output_file.write(".uleb128 0 // End of attributes\n")
output_file.write(".uleb128 2 // define abbreviation code\n")
output_file.write(".uleb128 0x34 // DW_TAG_variable\n")
output_file.write(".byte 0 // DW_CHILDREN_no\n")
output_file.write(".uleb128 0x3 // DW_AT_name\n")
output_file.write(".uleb128 0x8 // DW_FORM_STRING\n")
output_file.write(".uleb128 0x3f // DW_AT_external\n")
output_file.write(".uleb128 0xc // DW_FORM_flag\n")
output_file.write(".uleb128 0x2 // DW_AT_location\n")
output_file.write(".uleb128 0x18 // DW_FORM_exprloc\n")
output_file.write(".uleb128 0 // End of attributes\n")
output_file.write(".uleb128 0 // End of attributes\n")
output_file.write(".uleb128 0 // End abbreviations\n")
output_file.write(".section .debug_info,\"\"\n")
output_file.write(".4byte .Ldebug_info_end - .Ldebug_info_start\n")
output_file.write(".Ldebug_info_start:\n")
output_file.write(".2byte 5 // DWARF version 5\n")
output_file.write(".byte 1 // DW_UT_compile\n")
output_file.write(".byte %s // address size\n" %
(8 if (is64bit == 1) else 4))
output_file.write(".4byte .debug_abbrev // debug_abbr_offset\n")
output_file.write(".uleb128 1 // use abbreviation code\n")
output_file.write(".string \"%s\" // DW_AT_name\n" % options.output)
output_file.write(".string \"\" // DW_AT_comp_dir\n")
output_file.write(".uleb128 2 // use abbreviation code\n")
output_file.write(".string \"%s\" // DW_AT_name\n" %
options.symbol_name)
output_file.write(".byte 1 // DW_AT_external\n")
if (is64bit == 1):
output_file.write(".uleb128 9 // DW_AT_location\n")
output_file.write(".uleb128 0x3 // DW_OP_addr \n")
output_file.write(".8byte %s\n" % options.symbol_name)
else:
output_file.write(".uleb128 5 // DW_AT_location\n")
output_file.write(".uleb128 0x3 // DW_OP_addr \n")
output_file.write(".4byte %s\n" % options.symbol_name)
output_file.write(".uleb128 0 // end children\n")
output_file.write(".uleb128 0 // end entries\n")
output_file.write(".Ldebug_info_end:\n")
if options.target_os in ["win"]:
output_file.write("end\n")