[llvm] r353846 - [llvm-dwp] Abort when dwo_id is unset

Jordan Rupprecht via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 12 07:01:07 PST 2019


Author: rupprecht
Date: Tue Feb 12 07:01:07 2019
New Revision: 353846

URL: http://llvm.org/viewvc/llvm-project?rev=353846&view=rev
Log:
[llvm-dwp] Abort when dwo_id is unset

Summary:
An empty dwo_id indicates a degenerate .dwo file that should not have been generated in the first place. Instead of discovering this error later when merging with another degenerate .dwo file, print an error immediately when noticing an unset dwo_id, including the filename of the offending file.

Test case created by compiling a trivial file w/ `-fno-split-dwarf-inlining -gmlt -gsplit-dwarf -c` prior to r353771

Reviewers: dblaikie

Reviewed By: dblaikie

Subscribers: jdoerfert, aprantl, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D58085

Added:
    llvm/trunk/test/tools/llvm-dwp/Inputs/missing_dwo_id.dwo   (with props)
    llvm/trunk/test/tools/llvm-dwp/X86/missing_dwo_id.test
Modified:
    llvm/trunk/test/tools/llvm-dwp/X86/invalid_string_form.test
    llvm/trunk/test/tools/llvm-dwp/X86/non_cu_top_level.test
    llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp

Added: llvm/trunk/test/tools/llvm-dwp/Inputs/missing_dwo_id.dwo
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/Inputs/missing_dwo_id.dwo?rev=353846&view=auto
==============================================================================
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/llvm-dwp/Inputs/missing_dwo_id.dwo
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: llvm/trunk/test/tools/llvm-dwp/X86/invalid_string_form.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/X86/invalid_string_form.test?rev=353846&r1=353845&r2=353846&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-dwp/X86/invalid_string_form.test (original)
+++ llvm/trunk/test/tools/llvm-dwp/X86/invalid_string_form.test Tue Feb 12 07:01:07 2019
@@ -1,3 +1,3 @@
 RUN: not llvm-dwp %p/../Inputs/invalid_string_form.dwo -o %t 2>&1 | FileCheck %s
 
-CHECK: error: string field encoded without DW_FORM_string or DW_FORM_GNU_str_index
+CHECK: error: {{.*}}invalid_string_form.dwo': string field encoded without DW_FORM_string or DW_FORM_GNU_str_index

Added: llvm/trunk/test/tools/llvm-dwp/X86/missing_dwo_id.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/X86/missing_dwo_id.test?rev=353846&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-dwp/X86/missing_dwo_id.test (added)
+++ llvm/trunk/test/tools/llvm-dwp/X86/missing_dwo_id.test Tue Feb 12 07:01:07 2019
@@ -0,0 +1,3 @@
+RUN: not llvm-dwp %p/../Inputs/missing_dwo_id.dwo -o %t 2>&1 | FileCheck %s
+
+CHECK: error: {{.*}}missing_dwo_id.dwo': compile unit missing dwo_id

Modified: llvm/trunk/test/tools/llvm-dwp/X86/non_cu_top_level.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/X86/non_cu_top_level.test?rev=353846&r1=353845&r2=353846&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-dwp/X86/non_cu_top_level.test (original)
+++ llvm/trunk/test/tools/llvm-dwp/X86/non_cu_top_level.test Tue Feb 12 07:01:07 2019
@@ -1,3 +1,3 @@
 RUN: not llvm-dwp %p/../Inputs/non_cu_top_level.dwo -o %t 2>&1 | FileCheck %s
 
-CHECK: error: top level DIE is not a compile unit
+CHECK: error: {{.*}}non_cu_top_level.dwo': top level DIE is not a compile unit

Modified: llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp?rev=353846&r1=353845&r2=353846&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp (original)
+++ llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp Tue Feb 12 07:01:07 2019
@@ -13,6 +13,7 @@
 #include "DWPError.h"
 #include "DWPStringPool.h"
 #include "llvm/ADT/MapVector.h"
+#include "llvm/ADT/Optional.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
 #include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
@@ -159,6 +160,7 @@ static Expected<CompileUnitIdentifiers>
   uint32_t Name;
   dwarf::Form Form;
   CompileUnitIdentifiers ID;
+  Optional<uint64_t> Signature = None;
   while ((Name = AbbrevData.getULEB128(&AbbrevOffset)) |
          (Form = static_cast<dwarf::Form>(AbbrevData.getULEB128(&AbbrevOffset))) &&
          (Name != 0 || Form != 0)) {
@@ -180,13 +182,16 @@ static Expected<CompileUnitIdentifiers>
       break;
     }
     case dwarf::DW_AT_GNU_dwo_id:
-      ID.Signature = InfoData.getU64(&Offset);
+      Signature = InfoData.getU64(&Offset);
       break;
     default:
       DWARFFormValue::skipValue(Form, InfoData, &Offset,
                                 dwarf::FormParams({Version, AddrSize, Format}));
     }
   }
+  if (!Signature)
+    return make_error<DWPError>("compile unit missing dwo_id");
+  ID.Signature = *Signature;
   return ID;
 }
 
@@ -560,7 +565,7 @@ static Error write(MCStreamer &Out, Arra
       Expected<CompileUnitIdentifiers> EID = getCUIdentifiers(
           AbbrevSection, InfoSection, CurStrOffsetSection, CurStrSection);
       if (!EID)
-        return EID.takeError();
+        return createFileError(Input, EID.takeError());
       const auto &ID = *EID;
       auto P = IndexEntries.insert(std::make_pair(ID.Signature, CurEntry));
       if (!P.second)
@@ -588,7 +593,7 @@ static Error write(MCStreamer &Out, Arra
           getSubsection(CurStrOffsetSection, E, DW_SECT_STR_OFFSETS),
           CurStrSection);
       if (!EID)
-        return EID.takeError();
+        return createFileError(Input, EID.takeError());
       const auto &ID = *EID;
       if (!P.second)
         return buildDuplicateError(*P.first, ID, Input);




More information about the llvm-commits mailing list