<div dir="ltr"><div dir="ltr"><div>Ping.</div><div><br></div><div>```<br>/home/andrea/cllvm/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp: In member function ‘unsigned int llvm::DWARFVerifier::verifyDebugInfoAttribute(const llvm::DWARFDie&, llvm::DWARFAttribute&)’:<br>/home/andrea/cllvm/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp:477:5: warning: this statement may fall through [-Wimplicit-fallthrough=]<br>     }<br>     ^<br>/home/andrea/cllvm/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp:479:3: note: here<br>   case DW_AT_type: {<br>   ^~~~<br>```<br></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 21, 2018 at 10:34 AM Andrea Di Biagio <<a href="mailto:andrea.dibiagio@gmail.com">andrea.dibiagio@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">
<div>Hi Jonas,</div><div><br>
</div><div>```<br></div><div>+  case DW_AT_type: {</div>
+    DWARFDie TypeDie = Die.getAttributeValueAsReferencedDie(DW_AT_type);<br>
+    if (TypeDie && !isType(TypeDie.getTag())) {<br>
+      ReportError("DIE has " + AttributeString(Attr) +<br>
+                  " with incompatible tag " + TagString(TypeDie.getTag()));<br>
+      break;<br>
+    }<br>
+  }<br>
   default:<br>
     break;<br><div>
   } <br></div><div>```</div><div><br></div><div>gcc generates a (quite pedantic) warning for that particular case because it may fall-through ([-Wimplicit-fallthrough]).</div><div>You can suppress that warning if you use macro  
<span class="m_-6014879455076527625gmail-preprocessor">LLVM_FALLTHROUGH at the end of `
case DW_AT_type`<br></span></div><br><div><span class="m_-6014879455076527625gmail-preprocessor">Cheers,<br></span></div><div><span class="m_-6014879455076527625gmail-preprocessor">-Andrea</span><br></div><div><br></div>

</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Sep 21, 2018 at 8:50 AM, Jonas Devlieghere via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jdevlieghere<br>
Date: Fri Sep 21 00:50:21 2018<br>
New Revision: 342713<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=342713&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=342713&view=rev</a><br>
Log:<br>
[dwarfdump] Verify DW_AT_type is set and points to a compatible DIE.<br>
<br>
This extends the verifier to catch three new errors:<br>
<br>
  * Missing DW_AT_type attributes for DW_TAG_formal_parameter,<br>
    DW_TAG_variable and DW_TAG_array_type.<br>
<br>
  * Valid references for DW_AT_type pointing to a non-type tag.<br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D52223" rel="noreferrer" target="_blank">https://reviews.llvm.org/D52223</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp<br>
    llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_debug_info.s<br>
<br>
Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp?rev=342713&r1=342712&r2=342713&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp?rev=342713&r1=342712&r2=342713&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp (original)<br>
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp Fri Sep 21 00:50:21 2018<br>
@@ -175,11 +175,24 @@ unsigned DWARFVerifier::verifyUnitConten<br>
   unsigned NumDies = Unit.getNumDIEs();<br>
   for (unsigned I = 0; I < NumDies; ++I) {<br>
     auto Die = Unit.getDIEAtIndex(I);<br>
+<br>
     if (Die.getTag() == DW_TAG_null)<br>
       continue;<br>
+<br>
+    bool HasTypeAttr = false;<br>
     for (auto AttrValue : Die.attributes()) {<br>
       NumUnitErrors += verifyDebugInfoAttribute(Die, AttrValue);<br>
       NumUnitErrors += verifyDebugInfoForm(Die, AttrValue);<br>
+      HasTypeAttr |= (AttrValue.Attr == DW_AT_type);<br>
+    }<br>
+<br>
+    if (!HasTypeAttr && (Die.getTag() == DW_TAG_formal_parameter ||<br>
+                         Die.getTag() == DW_TAG_variable ||<br>
+                         Die.getTag() == DW_TAG_array_type)) {<br>
+      error() << "DIE with tag " << TagString(Die.getTag())<br>
+              << " is missing type attribute:\n";<br>
+      dump(Die) << '\n';<br>
+      NumUnitErrors++;<br>
     }<br>
   }<br>
<br>
@@ -463,6 +476,14 @@ unsigned DWARFVerifier::verifyDebugInfoA<br>
                   TagString(RefTag));<br>
     }<br>
   }<br>
+  case DW_AT_type: {<br>
+    DWARFDie TypeDie = Die.getAttributeValueAsReferencedDie(DW_AT_type);<br>
+    if (TypeDie && !isType(TypeDie.getTag())) {<br>
+      ReportError("DIE has " + AttributeString(Attr) +<br>
+                  " with incompatible tag " + TagString(TypeDie.getTag()));<br>
+      break;<br>
+    }<br>
+  }<br>
   default:<br>
     break;<br>
   }<br>
<br>
Modified: llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_debug_info.s<br>
URL: <a href="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" rel="noreferrer" target="_blank">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</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_debug_info.s (original)<br>
+++ llvm/trunk/test/tools/llvm-dwarfdump/X86/verify_debug_info.s Fri Sep 21 00:50:21 2018<br>
@@ -11,6 +11,24 @@<br>
 # CHECK-NEXT: DW_AT_comp_dir [DW_FORM_strp]    ( .debug_str[0x0000003f] = "/Users/sgravani/Development/tests")<br>
 # CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]      (0x0000000000000000)<br>
 # CHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]    (0x00000016){{[[:space:]]}}<br>
+# CHECK-NEXT: error: DIE has DW_AT_type with incompatible tag DW_TAG_null{{[[:space:]]}}<br>
+# CHECK-NEXT: 0x0000002b: DW_TAG_subprogram [2] *<br>
+# CHECK-NEXT: DW_AT_low_pc [DW_FORM_addr]       (0x0000000000000000)<br>
+# CHECK-NEXT: DW_AT_high_pc [DW_FORM_data4]     (0x00000016)<br>
+# CHECK-NEXT: DW_AT_frame_base [DW_FORM_exprloc]        (DW_OP_reg6)<br>
+# CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000061] = "main")<br>
+# CHECK-NEXT: DW_AT_decl_file [DW_FORM_data1]   (0x01)<br>
+# CHECK-NEXT: DW_AT_decl_line [DW_FORM_data1]   (1)<br>
+# CHECK-NEXT: DW_AT_prototyped [DW_FORM_flag_present]   (true)<br>
+# CHECK-NEXT: DW_AT_type [DW_FORM_ref4] (cu + 0x0052 => {0x00000052} "")<br>
+# CHECK-NEXT: DW_AT_external [DW_FORM_flag_present]     (true){{[[:space:]]}}<br>
+# CHECK-NEXT: error: DIE with tag DW_TAG_variable is missing type attribute:{{[[:space:]]}}<br>
+# CHECK-NEXT: 0x00000044: DW_TAG_variable [3]<br>
+# CHECK-NEXT: DW_AT_location [DW_FORM_exprloc]  (DW_OP_fbreg -8)<br>
+# CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000006a] = "a")<br>
+# CHECK-NEXT: DW_AT_decl_file [DW_FORM_data1]   (0x01)<br>
+# CHECK-NEXT: DW_AT_decl_line [DW_FORM_data1]   (2)<br>
+# CHECK-NEXT: DW_AT_use_location [DW_FORM_ref4] (cu + 0x0053 => {0x00000053}){{[[:space:]]}}<br>
 # CHECK-NEXT: error: Compilation unit root DIE is not a unit DIE: DW_TAG_null.<br>
 # CHECK-NEXT: error: Compilation unit type (DW_UT_compile) and root DIE (DW_TAG_null) do not match.<br>
 # CHECK-NEXT: error: Units[2] - start offset: 0x00000068<br>
@@ -107,7 +125,7 @@ Lsection_abbrev:<br>
        .byte   11                      ## DW_FORM_data1<br>
        .byte   59                      ## DW_AT_decl_line<br>
        .byte   11                      ## DW_FORM_data1<br>
-       .byte   73                      ## DW_AT_type<br>
+       .byte   74                      ## DW_AT_type<br>
        .byte   19                      ## DW_FORM_ref4<br>
        .byte   0                       ## EOM(1)<br>
        .byte   0                       ## EOM(2)<br>
@@ -152,7 +170,7 @@ Lset3 = Lfunc_end0-Lfunc_begin0<br>
        .byte   1                       ## DW_AT_decl_file<br>
        .byte   1                       ## DW_AT_decl_line<br>
                                         ## DW_AT_prototyped<br>
-       .long   83                      ## DW_AT_type<br>
+       .long   82                      ## DW_AT_type<br>
                                         ## DW_AT_external<br>
        .byte   3                       ## Abbrev [3] 0x44:0xe DW_TAG_variable<br>
        .byte   2                       ## DW_AT_location<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</blockquote></div>