DWARF4 relative DW_AT_high_pc values are now displayed as absolute
addresses. The relative value is only shown when explicitly dumping the
forms, i.e. in show-form or verbose mode.
```
DW_AT_low_pc (0x0000000000000049)
DW_AT_high_pc (0x00000019)
```
becomes
```
DW_AT_low_pc (0x0000000000000049)
DW_AT_high_pc (0x0000000000000062)
```
Differential revision: https://reviews.llvm.org/D40317
rdar://
35416943
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319044
91177308-0d34-0410-b5e6-
96231b3b80d8
WithColor(OS, Color) << Name;
else if (Attr == DW_AT_decl_line || Attr == DW_AT_call_line)
OS << *formValue.getAsUnsignedConstant();
- else if (Attr == DW_AT_location || Attr == DW_AT_frame_base ||
- Attr == DW_AT_data_member_location ||
- Attr == DW_AT_GNU_call_site_value)
+ else if (Attr == DW_AT_high_pc && !DumpOpts.ShowForm && !DumpOpts.Verbose &&
+ formValue.getAsUnsignedConstant()) {
+ // Print the actual address rather than the offset.
+ uint64_t LowPC, HighPC, Index;
+ if (Die.getLowAndHighPC(LowPC, HighPC, Index))
+ OS << format("0x%016" PRIx64, HighPC);
+ else
+ formValue.dump(OS, DumpOpts);
+ } else if (Attr == DW_AT_location || Attr == DW_AT_frame_base ||
+ Attr == DW_AT_data_member_location ||
+ Attr == DW_AT_GNU_call_site_value)
dumpLocation(OS, formValue, U, sizeof(BaseIndent) + Indent + 4, DumpOpts);
else
formValue.dump(OS, DumpOpts);
CHECK: DW_AT_stmt_list (0x00000000)
CHECK: DW_AT_comp_dir ("/Inputs")
CHECK: DW_AT_low_pc (0x0000000100000f40)
-CHECK: DW_AT_high_pc (0x0000000b)
+CHECK: DW_AT_high_pc (0x0000000100000f4b)
CHECK: DW_TAG_subprogram
CHECK: DW_AT_low_pc (0x0000000100000f40)
-CHECK: DW_AT_high_pc (0x0000000b)
+CHECK: DW_AT_high_pc (0x0000000100000f4b)
CHECK: DW_AT_frame_base (DW_OP_reg6 RBP)
CHECK: DW_AT_name ("main")
CHECK: DW_AT_decl_file ("/Inputs{{[/\\]}}basic1.c")
CHECK: DW_AT_name ("basic2.c")
CHECK: DW_AT_stmt_list (0x00000044)
CHECK: DW_AT_low_pc (0x0000000100000f50)
-CHECK: DW_AT_high_pc (0x00000037)
+CHECK: DW_AT_high_pc (0x0000000100000f87)
CHECK: DW_TAG_base_type
CHECK: DW_AT_name ("int")
CHECK: DW_TAG_variable
CHECK: DW_AT_inline (DW_INL_inlined)
CHECK: DW_TAG_subprogram
CHECK: DW_AT_low_pc (0x0000000100000f50)
-CHECK: DW_AT_high_pc (0x00000037)
+CHECK: DW_AT_high_pc (0x0000000100000f87)
CHECK: DW_AT_frame_base (DW_OP_reg6 RBP)
CHECK: DW_AT_name ("foo")
CHECK: DW_AT_decl_file ("/Inputs{{[/\\]}}basic2.c")
CHECK: DW_TAG_inlined_subroutine
CHECK: DW_AT_abstract_origin (cu + 0x005b "inc")
CHECK: DW_AT_low_pc (0x0000000100000f61)
-CHECK: DW_AT_high_pc (0x0000000f)
+CHECK: DW_AT_high_pc (0x0000000100000f70)
CHECK: NULL
CHECK: NULL
CHECK: DW_AT_name ("basic3.c")
CHECK: DW_AT_stmt_list (0x0000009a)
CHECK: DW_AT_low_pc (0x0000000100000f90)
-CHECK: DW_AT_high_pc (0x00000024)
+CHECK: DW_AT_high_pc (0x0000000100000fb4)
CHECK: DW_TAG_variable
CHECK: DW_AT_name ("val")
CHECK: DW_AT_decl_file ("/Inputs{{[/\\]}}basic3.c")
CHECK: DW_AT_inline (DW_INL_inlined)
CHECK: DW_TAG_subprogram
CHECK: DW_AT_low_pc (0x0000000100000f90)
-CHECK: DW_AT_high_pc (0x00000024)
+CHECK: DW_AT_high_pc (0x0000000100000fb4)
CHECK: DW_AT_frame_base (DW_OP_reg6 RBP)
CHECK: DW_AT_name ("bar")
CHECK: DW_TAG_formal_parameter
# This test verifies that DWARF form types are printed in verbose mode and when
-# passing -F but not in brief mode.
+# passing -F but not in brief mode. Additionally we check that the high pc is
+# not printed as an address in verbose or show-form mode.
# RUN: llvm-mc %S/brief.s -filetype obj -triple x86_64-apple-darwin -o - \
# RUN: | llvm-dwarfdump -v --debug-info - \
# CHECK: DW_AT_stmt_list [DW_FORM_sec_offset]
# CHECK: DW_AT_comp_dir [DW_FORM_strp]
# CHECK: DW_AT_low_pc [DW_FORM_addr]
-# CHECK: DW_AT_high_pc [DW_FORM_data4]
+# CHECK: DW_AT_high_pc [DW_FORM_data4] (0x00000008)
# CHECK: DW_TAG_subprogram
# CHECK: DW_AT_low_pc [DW_FORM_addr]
-# CHECK: DW_AT_high_pc [DW_FORM_data4]
+# CHECK: DW_AT_high_pc [DW_FORM_data4] (0x00000008)
# CHECK: DW_AT_frame_base [DW_FORM_exprloc]
# CHECK: DW_AT_name [DW_FORM_strp]
# CHECK: DW_AT_decl_file [DW_FORM_data1]
# CHECK: DW_AT_byte_size [DW_FORM_data1]
# NO-FORM-NOT: DW_FORM_
+# NO-FORM: DW_AT_high_pc (0x0000000000000008)
+# NO-FORM-NOT: DW_FORM_
+# NO-FORM: DW_AT_high_pc (0x0000000000000008)
+# NO-FORM-NOT: DW_FORM_
# CHECK-NEXT: DW_AT_name ("fn4")
# CHECK-NEXT: DW_AT_linkage_name ("test")
# CHECK-NEXT: DW_AT_low_pc (0x0000000000000000)
-# CHECK-NEXT: DW_AT_high_pc (0x00000000)
+# CHECK-NEXT: DW_AT_high_pc (0x0000000000000000)
# CHECK-NEXT: DW_AT_frame_base (DW_OP_call_frame_cfa)
# CHECK-NEXT: DW_AT_GNU_all_call_sites (true)
# CHECK: DW_AT_name ("foo.c")
# CHECK: DW_AT_stmt_list (0x00000000)
# CHECK: DW_AT_low_pc (0x0000000000000000)
-# CHECK: DW_AT_high_pc (0x00000016)
+# CHECK: DW_AT_high_pc (0x0000000000000016)
# CHECK: DW_TAG_subprogram
# CHECK: DW_AT_low_pc (0x0000000000000000)
-# CHECK: DW_AT_high_pc (0x00000016)
+# CHECK: DW_AT_high_pc (0x0000000000000016)
# CHECK: DW_AT_name ("foo")
# LEX: DW_TAG_lexical_block
# LEX: DW_AT_low_pc (0x0000000000000004)
-# LEX: DW_AT_high_pc (0x00000010)
+# LEX: DW_AT_high_pc (0x0000000000000014)
# A: Line info: file 'foo.c', line 3, column 9, start line 1
# B: Line info: file 'foo.c', line 4, column 6, start line 1