[llvm] r356514 - [DwarfDebug] Skip entries to big for 16 bit size field in Dwarf < 5.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 19 13:37:06 PDT 2019


Author: fhahn
Date: Tue Mar 19 13:37:06 2019
New Revision: 356514

URL: http://llvm.org/viewvc/llvm-project?rev=356514&view=rev
Log:
[DwarfDebug] Skip entries to big for 16 bit size field in Dwarf < 5.

Nothing prevents entries from being bigger than the 16 bit size field in
Dwarf < 5. For entries that are too big, just emit an empty entry
instead of crashing.

This fixes PR41038.

Reviewers: probinson, aprantl, davide

Reviewed By: probinson

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

Added:
    llvm/trunk/test/MC/X86/dwarf-size-field-overflow.test
Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=356514&r1=356513&r2=356514&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Mar 19 13:37:06 2019
@@ -2037,8 +2037,14 @@ void DwarfDebug::emitDebugLocEntryLocati
   Asm->OutStreamer->AddComment("Loc expr size");
   if (getDwarfVersion() >= 5)
     Asm->EmitULEB128(DebugLocs.getBytes(Entry).size());
-  else
+  else if (DebugLocs.getBytes(Entry).size() <= std::numeric_limits<uint16_t>::max())
     Asm->emitInt16(DebugLocs.getBytes(Entry).size());
+  else {
+    // The entry is too big to fit into 16 bit, drop it as there is nothing we
+    // can do.
+    Asm->emitInt16(0);
+    return;
+  }
   // Emit the entry.
   APByteStreamer Streamer(*Asm);
   emitDebugLocEntry(Streamer, Entry, CU);

Added: llvm/trunk/test/MC/X86/dwarf-size-field-overflow.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/dwarf-size-field-overflow.test?rev=356514&view=auto
==============================================================================
--- llvm/trunk/test/MC/X86/dwarf-size-field-overflow.test (added)
+++ llvm/trunk/test/MC/X86/dwarf-size-field-overflow.test Tue Mar 19 13:37:06 2019
@@ -0,0 +1,49 @@
+# This test generates too many debug location entries to fit into 65KB required
+# by DWARF < 5. Check that the location is set to 0 instead of crashing.
+#
+# RUN: %python %s 4000 | llc -filetype=obj -o %t
+# RUN: llvm-dwarfdump %t | FileCheck %s
+#
+# CHECK:       0x0000004d:       DW_TAG_formal_parameter
+# CHECK-NEXT:      DW_AT_location   (0x00000000
+# CHECK-NEXT:           [0x0000000000000000,  0x0000000000000008): )
+# CHECK-NEXT:      DW_AT_name   ("self")
+
+import sys
+
+SKELETON = """define void @test() !dbg !24 {{
+  {}
+  call void @foo(), !dbg !34
+  ret void, !dbg !34
+}}
+
+; Function Attrs: nounwind readnone speculatable
+declare void @llvm.dbg.value(metadata, metadata, metadata) #0
+
+declare void @foo()
+
+attributes #0 = {{ nounwind readnone speculatable }}
+
+!llvm.dbg.cu = !{{!0}}
+!llvm.module.flags = !{{!22}}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 4, emissionKind: FullDebug)
+!1 = !DIFile(filename: "asdf.c", directory: "bar")
+!2 = !{{}}
+!6 = !DIModule(scope: null, name: "dag", includePath: "/")
+!8 = distinct !DICompositeType(tag: DW_TAG_structure_type, scope: !6, file: !1, line: 36, size: 2384384, elements: !2, runtimeLang: DW_LANG_C)
+!22 = !{{i32 2, !"Debug Info Version", i32 3}}
+!24 = distinct !DISubprogram(name: "main", linkageName: "main", scope: !6, file: !1, line: 1, type: !25, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
+!25 = !DISubroutineType(types: !2)
+!30 = !DILocalVariable(name: "self", arg: 1, scope: !24, file: !1, line: 12, type: !8, flags: DIFlagArtificial)
+!34 = !DILocation(line: 12, column: 8, scope: !24)
+"""
+
+CALL = "call void @llvm.dbg.value(metadata i64 {0}, metadata !30, metadata !DIExpression(DW_OP_LLVM_fragment, {0}, 64)), !dbg !34"
+
+if __name__ == '__main__':
+    N = int(sys.argv[1])
+    calls = []
+    for i in range(0, N):
+        calls.append(CALL.format(i * 10**12))
+    print(SKELETON.format('\n'.join(calls)))




More information about the llvm-commits mailing list