DebugInfo: Hash DW_OP_convert in loclists when using Split DWARF
authorDavid Blaikie <dblaikie@gmail.com>
Tue, 4 Feb 2020 03:15:02 +0000 (19:15 -0800)
committerDavid Blaikie <dblaikie@gmail.com>
Tue, 4 Feb 2020 03:16:42 +0000 (19:16 -0800)
This code was incorrectly emitting extra bytes into arbitrary parts of
the object file when it was meant to be hashing them to compute the DWO
ID.

Follow-up patch(es) will refactor this API somewhat to make such bugs
harder to introduce, hopefully.

llvm/lib/CodeGen/AsmPrinter/ByteStreamer.h
llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
llvm/test/DebugInfo/X86/convert-loclist.ll

index 09f7496..b60f68c 100644 (file)
@@ -50,7 +50,7 @@ public:
   }
   void EmitULEB128(uint64_t DWord, const Twine &Comment, unsigned PadTo) override {
     AP.OutStreamer->AddComment(Comment);
-    AP.EmitULEB128(DWord);
+    AP.EmitULEB128(DWord, nullptr, PadTo);
   }
 };
 
index 0923394..447d3fa 100644 (file)
@@ -2241,7 +2241,7 @@ void DwarfDebug::emitDebugLocEntry(ByteStreamer &Streamer,
         uint64_t Offset =
             CU->ExprRefedBaseTypes[Op.getRawOperand(I)].Die->getOffset();
         assert(Offset < (1ULL << (ULEB128PadSize * 7)) && "Offset wont fit");
-        Asm->EmitULEB128(Offset, nullptr, ULEB128PadSize);
+        Streamer.EmitULEB128(Offset, "", ULEB128PadSize);
         // Make sure comments stay aligned.
         for (unsigned J = 0; J < ULEB128PadSize; ++J)
           if (Comment != End)
index 1d5b6f9..e510cd6 100644 (file)
@@ -1,8 +1,26 @@
-; RUN: llc -dwarf-version=5 -filetype=obj -O0 < %s | llvm-dwarfdump -debug-info -debug-loclists - | FileCheck %s
-; RUN: llc -dwarf-version=5 -split-dwarf-file=foo.dwo -filetype=obj -O0 < %s | llvm-dwarfdump -debug-info -debug-loclists - | FileCheck %s
+; RUN: llc -dwarf-version=5 -filetype=obj -O0 < %s \
+; RUN:   | llvm-dwarfdump -debug-info -debug-loclists - | FileCheck %s
+; RUN: llc -dwarf-version=5 -split-dwarf-file=foo.dwo -filetype=obj -O0 < %s \
+; RUN:   | llvm-dwarfdump -debug-info -debug-loclists - | FileCheck --check-prefix=CHECK --check-prefix=SPLIT %s
+; RUN: llc -dwarf-version=5 -split-dwarf-file=foo.dwo -filetype=asm -O0 < %s | FileCheck --check-prefix=ASM %s
+
+; A bit of a brittle test - this is testing the specific DWO_id. The
+; alternative would be to test two files with different DW_OP_convert values &
+; ensuring the DWO IDs differ when the DW_OP_convert parameter differs.
+
+; So if this test ends up being a brittle pain to maintain, updating the DWO ID
+; often - add another IR file with a different DW_OP_convert that's otherwise
+; identical and demonstrate that they have different DWO IDs.
+
+; SPLIT: 0x00000000: Compile Unit: {{.*}} DWO_id = 0xafd73565c68bc661
+
+; Regression testing a fairly quirky bug where instead of hashing (see above),
+; extra bytes would be emitted into the output assembly in no
+; particular/intentional section - so let's check they don't show up at all:
+; ASM-NOT: .asciz  "\200\200\200"
 
 ; CHECK: 0x{{0*}}[[TYPE:.*]]: DW_TAG_base_type
-; CHECK-NEXT:                DW_AT_name ("DW_ATE_unsigned_32")
+; CHECK-NEXT:                   DW_AT_name ("DW_ATE_unsigned_32")
 
 ; CHECK: DW_LLE_offset_pair ({{.*}}): DW_OP_consts +7, DW_OP_convert 0x[[TYPE]], DW_OP_stack_value