[PATCH] D43943: [DEBUGINFO] Add flag for DWARF2 to use sections as references.
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 1 07:53:35 PST 2018
Which targets?
Any hope they could use MC to get a better assembler?
Cheers,
Rafael
Alexey Bataev via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:
> ABataev created this revision.
> ABataev added reviewers: echristo, probinson, jlebar.
> Herald added a subscriber: JDevlieghere.
>
> Some targets does not support labels inside debug sections, but support
> references in form `section+offset`. Patch adds initial support
> for this. Also, this patch disables emission of all additional debug
> sections that may have labels inside of it (like pub sections and
> string tables).
>
>
> Repository:
> rL LLVM
>
> https://reviews.llvm.org/D43943
>
> Files:
> lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> lib/CodeGen/AsmPrinter/DwarfDebug.h
> test/DebugInfo/X86/sections_as_references.ll
>
> Index: test/DebugInfo/X86/sections_as_references.ll
> ===================================================================
> --- /dev/null
> +++ test/DebugInfo/X86/sections_as_references.ll
> @@ -0,0 +1,54 @@
> +; RUN: llc -filetype=asm -O0 -mtriple=x86_64-linux-gnu < %s -dwarf-sections-as-references=Enable -dwarf-inlined-strings=Enable -dwarf-version 2 -debugger-tune=lldb | FileCheck %s
> +
> +; CHECK: .file
> +
> +; CHECK-NOT: .L
> +
> +; CHECK: .section .debug_abbrev
> +; CHECK-NOT: DW_FORM_str{{p|x}}
> +; CHECK-NOT: .L
> +
> +; CHECK: .section .debug_info
> +; CHECK-NOT: .L
> +; CHECK: .short 2 # DWARF version number
> +; CHECK-NOT: .L
> +; CHECK: .long .debug_abbrev # Offset Into Abbrev. Section
> +; CHECK-NOT: .L
> +; CHECK: .long .debug_line # DW_AT_stmt_list
> +; CHECK-NOT: .L
> +; CHECK: .long .debug_abbrev # Offset Into Abbrev. Section
> +; CHECK-NOT: .L
> +; CHECK: .long .debug_line # DW_AT_stmt_list
> +; CHECK-NOT: .L
> +; CHECK: .quad .debug_info+{{[0-9]+}} # DW_AT_type
> +; CHECK-NOT: .L
> +; CHECK: .byte 0 # End Of Children Mark
> +; CHECK-NOT: .L
> +
> +source_filename = "test/DebugInfo/X86/sections_as_references.ll"
> +
> +%struct.foo = type { i8 }
> +
> + at f = global %struct.foo zeroinitializer, align 1, !dbg !0
> + at g = global %struct.foo zeroinitializer, align 1, !dbg !6
> +
> +!llvm.dbg.cu = !{!9, !12}
> +!llvm.module.flags = !{!14, !15}
> +
> +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
> +!1 = !DIGlobalVariable(name: "f", scope: null, file: !2, line: 2, type: !3, isLocal: false, isDefinition: true)
> +!2 = !DIFile(filename: "tu1.cpp", directory: "/dir")
> +!3 = !DICompositeType(tag: DW_TAG_structure_type, name: "foo", file: !4, line: 1, size: 8, align: 8, elements: !5, identifier: "_ZTS3foo")
> +!4 = !DIFile(filename: "./hdr.h", directory: "/dir")
> +!5 = !{}
> +!6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())
> +!7 = !DIGlobalVariable(name: "g", scope: null, file: !8, line: 2, type: !3, isLocal: false, isDefinition: true)
> +!8 = !DIFile(filename: "tu2.cpp", directory: "/dir")
> +!9 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !2, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !5, retainedTypes: !10, globals: !11, imports: !5)
> +!10 = !{!3}
> +!11 = !{!0}
> +!12 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !8, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !5, retainedTypes: !10, globals: !13, imports: !5)
> +!13 = !{!6}
> +!14 = !{i32 2, !"Dwarf Version", i32 2}
> +!15 = !{i32 1, !"Debug Info Version", i32 3}
> +
> Index: lib/CodeGen/AsmPrinter/DwarfDebug.h
> ===================================================================
> --- lib/CodeGen/AsmPrinter/DwarfDebug.h
> +++ lib/CodeGen/AsmPrinter/DwarfDebug.h
> @@ -258,6 +258,10 @@
> /// Use inlined strings.
> bool UseInlineStrings = false;
>
> + /// True if the sections itself must be used as references and don't create
> + /// temp symbols inside DWARF sections.
> + bool UseSectionsAsReferences = false;
> +
> /// DWARF5 Experimental Options
> /// @{
> bool HasDwarfAccelTables;
> @@ -501,6 +505,11 @@
> /// Returns whether to use inline strings.
> bool useInlineStrings() const { return UseInlineStrings; }
>
> + /// Returns whether to use sections as labels rather than temp symbols.
> + bool useSectionsAsReferences() const {
> + return UseSectionsAsReferences;
> + }
> +
> // Experimental DWARF5 features.
>
> /// Returns whether or not to emit tables that dwarf consumers can
> Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> ===================================================================
> --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> +++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> @@ -123,6 +123,13 @@
> clEnumVal(Disable, "Disabled")),
> cl::init(Default));
>
> +static cl::opt<DefaultOnOff> DwarfSectionsAsReferences(
> + "dwarf-sections-as-references", cl::Hidden,
> + cl::desc("Use sections+offset as references rather than labels."),
> + cl::values(clEnumVal(Default, "Default for platform"),
> + clEnumVal(Enable, "Enabled"), clEnumVal(Disable, "Disabled")),
> + cl::init(Default));
> +
> enum LinkageNameOption {
> DefaultLinkageNames,
> AllLinkageNames,
> @@ -310,6 +317,10 @@
> // Use dwarf 4 by default if nothing is requested.
> DwarfVersion = DwarfVersion ? DwarfVersion : dwarf::DWARF_VERSION;
>
> + // Use sections as references in DWARF v2.
> + UseSectionsAsReferences =
> + DwarfVersion == 2 && DwarfSectionsAsReferences == Enable;
> +
> // Work around a GDB bug. GDB doesn't support the standard opcode;
> // SCE doesn't support GNU's; LLDB prefers the standard opcode, which
> // is defined as of DWARF 3.
> @@ -737,7 +748,7 @@
> // ranges for all subprogram DIEs for mach-o.
> DwarfCompileUnit &U = SkCU ? *SkCU : TheCU;
> if (unsigned NumRanges = TheCU.getRanges().size()) {
> - if (NumRanges > 1)
> + if (NumRanges > 1 && !useSectionsAsReferences())
> // A DW_AT_low_pc attribute may also be specified in combination with
> // DW_AT_ranges to specify the default base address for use in
> // location lists (see Section 2.6.2) and range lists (see Section
> @@ -1565,7 +1576,13 @@
> Asm->EmitInt16(dwarf::DW_PUBNAMES_VERSION);
>
> Asm->OutStreamer->AddComment("Offset of Compilation Unit Info");
> - Asm->emitDwarfSymbolReference(TheU->getLabelBegin());
> + if (useSectionsAsReferences()) {
> + Asm->EmitLabelPlusOffset(TheU->getSection()->getBeginSymbol(),
> + TheU->getDebugSectionOffset(),
> + Asm->MAI->getCodePointerSize());
> + } else {
> + Asm->emitDwarfSymbolReference(TheU->getLabelBegin());
> + }
>
> Asm->OutStreamer->AddComment("Compilation Unit Length");
> Asm->EmitInt32(TheU->getLength());
> @@ -1864,7 +1881,13 @@
> Asm->OutStreamer->AddComment("DWARF Arange version number");
> Asm->EmitInt16(dwarf::DW_ARANGES_VERSION);
> Asm->OutStreamer->AddComment("Offset Into Debug Info Section");
> - Asm->emitDwarfSymbolReference(CU->getLabelBegin());
> + if (useSectionsAsReferences()) {
> + Asm->EmitLabelPlusOffset(CU->getSection()->getBeginSymbol(),
> + CU->getDebugSectionOffset(),
> + Asm->MAI->getCodePointerSize());
> + } else {
> + Asm->emitDwarfSymbolReference(CU->getLabelBegin());
> + }
> Asm->OutStreamer->AddComment("Address Size (in bytes)");
> Asm->EmitInt8(PtrSize);
> Asm->OutStreamer->AddComment("Segment Size (in bytes)");
> Index: lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> ===================================================================
> --- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> +++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> @@ -270,15 +270,20 @@
>
> void DwarfCompileUnit::initStmtList() {
> // Define start line table label for each Compile Unit.
> - MCSymbol *LineTableStartSym =
> - Asm->OutStreamer->getDwarfLineTableSymbol(getUniqueID());
> + MCSymbol *LineTableStartSym;
> + const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
> + if (DD->useSectionsAsReferences()) {
> + LineTableStartSym = TLOF.getDwarfLineSection()->getBeginSymbol();
> + } else {
> + LineTableStartSym =
> + Asm->OutStreamer->getDwarfLineTableSymbol(getUniqueID());
> + }
>
> // DW_AT_stmt_list is a offset of line number information for this
> // compile unit in debug_line section. For split dwarf this is
> // left in the skeleton CU and so not included.
> // The line table entries are not always emitted in assembly, so it
> // is not okay to use line_table_start here.
> - const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
> StmtListValue =
> addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym,
> TLOF.getDwarfLineSection()->getBeginSymbol());
> @@ -410,9 +415,10 @@
>
> void DwarfCompileUnit::attachRangesOrLowHighPC(
> DIE &Die, SmallVector<RangeSpan, 2> Ranges) {
> - if (Ranges.size() == 1) {
> - const auto &single = Ranges.front();
> - attachLowHighPC(Die, single.getStart(), single.getEnd());
> + if (Ranges.size() == 1 || DD->useSectionsAsReferences()) {
> + const RangeSpan &Front = Ranges.front();
> + const RangeSpan &Back = Ranges.back();
> + attachLowHighPC(Die, Front.getStart(), Back.getEnd());
> } else
> addScopeRangeList(Die, std::move(Ranges));
> }
> @@ -834,7 +840,7 @@
>
> void DwarfCompileUnit::emitHeader(bool UseOffsets) {
> // Don't bother labeling the .dwo unit, as its offset isn't used.
> - if (!Skeleton) {
> + if (!Skeleton && !DD->useSectionsAsReferences()) {
> LabelBegin = Asm->createTempSymbol("cu_begin");
> Asm->OutStreamer->EmitLabel(LabelBegin);
> }
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list