[llvm] r342713 - [dwarfdump] Verify DW_AT_type is set and points to a compatible DIE.
Andrea Di Biagio via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 2 03:11:15 PDT 2018
Ping.
```
/home/andrea/cllvm/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp: In member
function ‘unsigned int llvm::DWARFVerifier::verifyDebugInfoAttribute(const
llvm::DWARFDie&, llvm::DWARFAttribute&)’:
/home/andrea/cllvm/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp:477:5:
warning: this statement may fall through [-Wimplicit-fallthrough=]
}
^
/home/andrea/cllvm/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp:479:3: note:
here
case DW_AT_type: {
^~~~
```
On Fri, Sep 21, 2018 at 10:34 AM Andrea Di Biagio <andrea.dibiagio at gmail.com>
wrote:
> Hi Jonas,
>
> ```
> + case DW_AT_type: {
> + DWARFDie TypeDie = Die.getAttributeValueAsReferencedDie(DW_AT_type);
> + if (TypeDie && !isType(TypeDie.getTag())) {
> + ReportError("DIE has " + AttributeString(Attr) +
> + " with incompatible tag " +
> TagString(TypeDie.getTag()));
> + break;
> + }
> + }
> default:
> break;
> }
> ```
>
> gcc generates a (quite pedantic) warning for that particular case because
> it may fall-through ([-Wimplicit-fallthrough]).
> You can suppress that warning if you use macro LLVM_FALLTHROUGH at the
> end of ` case DW_AT_type`
>
> Cheers,
> -Andrea
>
>
> On Fri, Sep 21, 2018 at 8:50 AM, Jonas Devlieghere via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: jdevlieghere
>> Date: Fri Sep 21 00:50:21 2018
>> New Revision: 342713
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=342713&view=rev
>> Log:
>> [dwarfdump] Verify DW_AT_type is set and points to a compatible DIE.
>>
>> This extends the verifier to catch three new errors:
>>
>> * Missing DW_AT_type attributes for DW_TAG_formal_parameter,
>> DW_TAG_variable and DW_TAG_array_type.
>>
>> * Valid references for DW_AT_type pointing to a non-type tag.
>>
>> Differential revision: https://reviews.llvm.org/D52223
>>
>> Modified:
>> llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
>> llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_debug_info.s
>>
>> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp?rev=342713&r1=342712&r2=342713&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp (original)
>> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp Fri Sep 21 00:50:21
>> 2018
>> @@ -175,11 +175,24 @@ unsigned DWARFVerifier::verifyUnitConten
>> unsigned NumDies = Unit.getNumDIEs();
>> for (unsigned I = 0; I < NumDies; ++I) {
>> auto Die = Unit.getDIEAtIndex(I);
>> +
>> if (Die.getTag() == DW_TAG_null)
>> continue;
>> +
>> + bool HasTypeAttr = false;
>> for (auto AttrValue : Die.attributes()) {
>> NumUnitErrors += verifyDebugInfoAttribute(Die, AttrValue);
>> NumUnitErrors += verifyDebugInfoForm(Die, AttrValue);
>> + HasTypeAttr |= (AttrValue.Attr == DW_AT_type);
>> + }
>> +
>> + if (!HasTypeAttr && (Die.getTag() == DW_TAG_formal_parameter ||
>> + Die.getTag() == DW_TAG_variable ||
>> + Die.getTag() == DW_TAG_array_type)) {
>> + error() << "DIE with tag " << TagString(Die.getTag())
>> + << " is missing type attribute:\n";
>> + dump(Die) << '\n';
>> + NumUnitErrors++;
>> }
>> }
>>
>> @@ -463,6 +476,14 @@ unsigned DWARFVerifier::verifyDebugInfoA
>> TagString(RefTag));
>> }
>> }
>> + case DW_AT_type: {
>> + DWARFDie TypeDie = Die.getAttributeValueAsReferencedDie(DW_AT_type);
>> + if (TypeDie && !isType(TypeDie.getTag())) {
>> + ReportError("DIE has " + AttributeString(Attr) +
>> + " with incompatible tag " +
>> TagString(TypeDie.getTag()));
>> + break;
>> + }
>> + }
>> default:
>> break;
>> }
>>
>> Modified: llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_debug_info.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_debug_info.s?rev=342713&r1=342712&r2=342713&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_debug_info.s
>> (original)
>> +++ llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_debug_info.s Fri Sep
>> 21 00:50:21 2018
>> @@ -11,6 +11,24 @@
>> # CHECK-NEXT: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x0000003f]
>> = "/Users/sgravani/Development/tests")
>> # CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
>> # CHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]
>> (0x00000016){{[[:space:]]}}
>> +# CHECK-NEXT: error: DIE has DW_AT_type with incompatible tag
>> DW_TAG_null{{[[:space:]]}}
>> +# CHECK-NEXT: 0x0000002b: DW_TAG_subprogram [2] *
>> +# CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
>> +# CHECK-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000016)
>> +# CHECK-NEXT: DW_AT_frame_base [DW_FORM_exprloc] (DW_OP_reg6)
>> +# CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000061] =
>> "main")
>> +# CHECK-NEXT: DW_AT_decl_file [DW_FORM_data1] (0x01)
>> +# CHECK-NEXT: DW_AT_decl_line [DW_FORM_data1] (1)
>> +# CHECK-NEXT: DW_AT_prototyped [DW_FORM_flag_present] (true)
>> +# CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x0052 => {0x00000052} "")
>> +# CHECK-NEXT: DW_AT_external [DW_FORM_flag_present]
>> (true){{[[:space:]]}}
>> +# CHECK-NEXT: error: DIE with tag DW_TAG_variable is missing type
>> attribute:{{[[:space:]]}}
>> +# CHECK-NEXT: 0x00000044: DW_TAG_variable [3]
>> +# CHECK-NEXT: DW_AT_location [DW_FORM_exprloc] (DW_OP_fbreg -8)
>> +# CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000006a] = "a")
>> +# CHECK-NEXT: DW_AT_decl_file [DW_FORM_data1] (0x01)
>> +# CHECK-NEXT: DW_AT_decl_line [DW_FORM_data1] (2)
>> +# CHECK-NEXT: DW_AT_use_location [DW_FORM_ref4] (cu + 0x0053 =>
>> {0x00000053}){{[[:space:]]}}
>> # CHECK-NEXT: error: Compilation unit root DIE is not a unit DIE:
>> DW_TAG_null.
>> # CHECK-NEXT: error: Compilation unit type (DW_UT_compile) and root DIE
>> (DW_TAG_null) do not match.
>> # CHECK-NEXT: error: Units[2] - start offset: 0x00000068
>> @@ -107,7 +125,7 @@ Lsection_abbrev:
>> .byte 11 ## DW_FORM_data1
>> .byte 59 ## DW_AT_decl_line
>> .byte 11 ## DW_FORM_data1
>> - .byte 73 ## DW_AT_type
>> + .byte 74 ## DW_AT_type
>> .byte 19 ## DW_FORM_ref4
>> .byte 0 ## EOM(1)
>> .byte 0 ## EOM(2)
>> @@ -152,7 +170,7 @@ Lset3 = Lfunc_end0-Lfunc_begin0
>> .byte 1 ## DW_AT_decl_file
>> .byte 1 ## DW_AT_decl_line
>> ## DW_AT_prototyped
>> - .long 83 ## DW_AT_type
>> + .long 82 ## DW_AT_type
>> ## DW_AT_external
>> .byte 3 ## Abbrev [3] 0x44:0xe
>> DW_TAG_variable
>> .byte 2 ## DW_AT_location
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181002/0b21532f/attachment.html>
More information about the llvm-commits
mailing list