diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2914,6 +2914,11 @@ // Filter labels by section. for (const SymbolCU &SCU : ArangeLabels) { + // Ignore zero-sized symbols so that we don't end up emitting any aranges + // that have zero length, which would violate the DWARF spec. + if (SymSize[SCU.Sym] == 0) + continue; + if (SCU.Sym->isInSection()) { // Make a note of this symbol and it's section. MCSection *Section = &SCU.Sym->getSection(); @@ -3049,9 +3054,6 @@ // For symbols without an end marker (e.g. common), we // write a single arange entry containing just that one symbol. uint64_t Size = SymSize[Span.Start]; - if (Size == 0) - Size = 1; - Asm->OutStreamer->emitIntValue(Size, PtrSize); } } diff --git a/llvm/test/CodeGen/Generic/dwarf-aranges-zero-size.ll b/llvm/test/CodeGen/Generic/dwarf-aranges-zero-size.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/Generic/dwarf-aranges-zero-size.ll @@ -0,0 +1,23 @@ +; Ensures that the AsmPrinter doesn't emit zero-sized symbols into `.debug_aranges`. +; +; RUN: llc --generate-arange-section < %s | FileCheck %s +; CHECK: .section .debug_aranges +; CHECK-NOT: .quad EXAMPLE +; CHECK: .section + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@EXAMPLE = constant <{ [0 x i8] }> zeroinitializer, align 1, !dbg !0 + +!llvm.module.flags = !{!3} +!llvm.dbg.cu = !{!4} + +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) +!1 = distinct !DIGlobalVariable(name: "EXAMPLE", linkageName: "EXAMPLE", scope: null, file: null, line: 161, type: !2, isLocal: false, isDefinition: true, align: 1) +!2 = !DIBasicType(name: "()", encoding: DW_ATE_unsigned) +!3 = !{i32 2, !"Debug Info Version", i32 3} +!4 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !5, producer: "rustc", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: null, globals: !6) +!5 = !DIFile(filename: "foo", directory: "") +!6 = !{!0} +