[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)
commit4cc567bb9e358ff997ebc37453607f90ed71e1fd
treea9f417d19eee49381d5965b069f2240a81f003fe
parent74fea3665ffbae57611df32ed4d2b5f308cb9484
[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

llvm-svn: 355456
llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp
llvm/test/tools/llvm-dwarfdump/X86/formclass2.s [new file with mode: 0644]
llvm/test/tools/llvm-dwarfdump/X86/formclass4.s [new file with mode: 0644]