]> granicus.if.org Git - llvm/commit
[DWARFFormValue] Don't consider DW_FORM_data4/8 to be section offsets.
authorJonas Devlieghere <jonas@devlieghere.com>
Tue, 5 Mar 2019 23:47:22 +0000 (23:47 +0000)
committerJonas Devlieghere <jonas@devlieghere.com>
Tue, 5 Mar 2019 23:47:22 +0000 (23:47 +0000)
commit4eb768f03d7ff70031429f2d78bb85da8fc38da9
tree3545db2353e01eaeaaf908c44bcf92e688675b97
parent82f3d1cfab02d9228981bffd60f77b97ca2e34ca
[DWARFFormValue] Don't consider DW_FORM_data4/8 to be section offsets.

When dumping ToT clan's debug info with dwarfdump, we were seeing an
error saying that that the location list overflows the debug_loc
section. After reducing the testcase we figured out that we were
interpreting the DW_FORM_data4 as a section offset.

In DWARF3 DW_FORM_data4 and DW_FORM_data8 served also as a section
offset. Until now we didn't check check for the DWARF version, because
some producers (read old versions of clang) were still emitting this.
The relevant code/comment was added in 2013, and I believe it's now
reasonable to start checking the version.

The FormValue class is a little bit of a mess because it cashes the
DWARF unit and context when it extracted the value itself. Several
methods of the class rely on it being present, or return an Optional for
the code path that needs it. At the same time the FormValue class also
used in places where there's no DWARF unit.

For this patch I went with the least invasive change: checking the
version from the CU when it's available. If it's not (because the form
value was created from a value directly) we default to the old behavior.

Differential revision: https://reviews.llvm.org/D58698

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355456 91177308-0d34-0410-b5e6-96231b3b80d8
lib/DebugInfo/DWARF/DWARFFormValue.cpp
test/tools/llvm-dwarfdump/X86/formclass2.s [new file with mode: 0644]
test/tools/llvm-dwarfdump/X86/formclass4.s [new file with mode: 0644]