[PATCH] D37214: Another prototype fix for lld DWARF parsing of base address selection entries in range lists

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 31 01:08:10 PDT 2017


grimar added inline comments.


================
Comment at: include/llvm/DebugInfo/DWARF/DWARFUnit.h:271-272
+  void setBaseAddress(BaseAddress BaseAddr) {
+    if (!BaseAddr.Address && BaseAddr.SectionIndex == -1ULL)
+      return;
+    this->BaseAddr = BaseAddr;
----------------
dblaikie wrote:
> So why is this bit necessary? Should callers just not try to set a base address if they don't want to, rather than having setBaseAddress ignore the request?
It is for dwarfdump-ranges-unrelocated.s testcase. It is based on following code:

```
test.cpp:
   void foo1() { }  
   void foo2() { }  
clang test.cpp -S -o test.s -gmlt -ffunction-sections
```

And output produced is:

```
	.section	.debug_info,"", at progbits
.Lcu_begin0:
	.long	38                      # Length of Unit
	.short	4                       # DWARF version number
	.long	.debug_abbrev           # Offset Into Abbrev. Section
	.byte	8                       # Address Size (in bytes)
	.byte	1                       # Abbrev [1] 0xb:0x1f DW_TAG_compile_unit
	.long	.Linfo_string0          # DW_AT_producer
	.short	4                       # DW_AT_language
	.long	.Linfo_string1          # DW_AT_name
	.long	.Lline_table_start0     # DW_AT_stmt_list
	.long	.Linfo_string2          # DW_AT_comp_dir
	.quad	0                       # DW_AT_low_pc
	.long	.Ldebug_ranges0         # DW_AT_ranges
	.section	.debug_ranges,"", at progbits
.Ldebug_ranges0:
	.quad	.Lfunc_begin0
	.quad	.Lfunc_end0
	.quad	.Lfunc_begin1
	.quad	.Lfunc_end1
	.quad	0
	.quad	0
```

So it has ranges but also unrelocated zero base address is emited in debug info. Since it has no
corresponding relocation (`SectionIndex` == -1ULL), I am ignoring it to prevent using
-1ULL as section index name. That looks a bit hacky, but I currently see no other way to distinguish
between such "dummy" base address and real one.
In testcase it is shown that base address can be 0 after relocation is applied, so I think we need
to check both `SectionIndex` and relocated value, just like I do.


I moved that code to caller side, thats probably a bit more clear and localizes the hack.


================
Comment at: lib/DebugInfo/DWARF/DWARFDebugRangeList.cpp:71
     if (RLE.isBaseAddressSelectionEntry(AddressSize)) {
-      BaseAddress = RLE.EndAddress;
-    } else {
-      Res.push_back({BaseAddress + RLE.StartAddress,
-                     BaseAddress + RLE.EndAddress, RLE.SectionIndex});
+      BaseAddr = { RLE.EndAddress, RLE.SectionIndex };
+      continue;
----------------
dblaikie wrote:
> Is this clang-formatted? I'd expect no spaces inner sides of the {}
You right, fixed.


https://reviews.llvm.org/D37214





More information about the llvm-commits mailing list