From 47c3472c412b79ccd9df9b1461910127df0d1d97 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Fri, 9 Mar 2018 11:58:59 +0000 Subject: [DebugInfo/AccelTable] Fix inconsistency in getDIEOffset implementations Summary: Even though the getDIEOffset offset function was common for the two accelerator table implementations, it was doing two different things: for the Apple tables, it was returning the die offset relative to the start of the section, whereas for DWARF v5 tables, it was relative to the start of the CU. I resolve this by renaming the function to getDIESectionOffset to make it obvious what the function returns, and change the DWARF implementation to return the section offset. I also keep the CU-relative accessor, but only in the DWARF implementation (there is no way to get this information for the Apple tables). This was not caught by existing tests because the hand-written inputs also erroneously used section offsets instead of CU-relative ones. While looking at this, I noticed that the Apple implementation was not fully correct either -- the header contains a DIEOffsetBase field, which should be added to offsets encoded with the DW_FORM_ref*** family, but this was not being used. This went unnoticed because all current writers set this field to zero anyway. I fix this as well and add a hand-written test which demonstrates the issue. Reviewers: JDevlieghere, dblaikie Subscribers: aprantl, llvm-commits Differential Revision: https://reviews.llvm.org/D44202 llvm-svn: 327116 --- llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp') diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index 1795172ae5a..2a9af874d22 100644 --- a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -340,7 +340,7 @@ template static llvm::Optional getDIEOffset(const AccelTable &Accel, StringRef Name) { for (const auto &Entry : Accel.equal_range(Name)) - if (llvm::Optional Off = Entry.getDIEOffset()) + if (llvm::Optional Off = Entry.getDIESectionOffset()) return *Off; return None; } -- cgit v1.2.3