[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