diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-03-18 02:13:23 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-03-18 02:13:23 +0000 |
commit | c5b39af3291d81a41fc0b1bf65045170684f8194 (patch) | |
tree | 3ee257bf810d7e180de70bf3736122c887d560fc /lib/MC/MCDwarf.cpp | |
parent | 9c1e56a84d5618e74662d98c0416a74e5a7ab31d (diff) | |
download | llvm-c5b39af3291d81a41fc0b1bf65045170684f8194.tar.gz llvm-c5b39af3291d81a41fc0b1bf65045170684f8194.tar.bz2 llvm-c5b39af3291d81a41fc0b1bf65045170684f8194.tar.xz |
DebugInfo: Avoid emitting standard opcode lengths in debug_line.dwo headers where opcodes are never used anyway
Introduce a slightly tighter wrapper around the header structure that
handles this use case. (MCDwarfDwoLineTable)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204101 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCDwarf.cpp')
-rw-r--r-- | lib/MC/MCDwarf.cpp | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index f5260952c7..c1e53d7bfe 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -224,7 +224,33 @@ const MCSymbol *MCDwarfLineTable::Emit(MCStreamer *MCOS) { return LineStartSym; } +void MCDwarfDwoLineTable::Emit(MCStreamer &MCOS) const { + MCOS.EmitLabel(Header.Emit(&MCOS, None).second); +} + std::pair<MCSymbol *, MCSymbol *> MCDwarfLineTableHeader::Emit(MCStreamer *MCOS) const { + static const char StandardOpcodeLengths[] = { + 0, // length of DW_LNS_copy + 1, // length of DW_LNS_advance_pc + 1, // length of DW_LNS_advance_line + 1, // length of DW_LNS_set_file + 1, // length of DW_LNS_set_column + 0, // length of DW_LNS_negate_stmt + 0, // length of DW_LNS_set_basic_block + 0, // length of DW_LNS_const_add_pc + 1, // length of DW_LNS_fixed_advance_pc + 0, // length of DW_LNS_set_prologue_end + 0, // length of DW_LNS_set_epilogue_begin + 1 // DW_LNS_set_isa + }; + assert(array_lengthof(StandardOpcodeLengths) == (DWARF2_LINE_OPCODE_BASE - 1)); + return Emit(MCOS, StandardOpcodeLengths); +} + +std::pair<MCSymbol *, MCSymbol *> +MCDwarfLineTableHeader::Emit(MCStreamer *MCOS, + ArrayRef<char> StandardOpcodeLengths) const { + MCContext &context = MCOS->getContext(); // Create a symbol at the beginning of the line table. @@ -260,21 +286,11 @@ std::pair<MCSymbol *, MCSymbol *> MCDwarfLineTableHeader::Emit(MCStreamer *MCOS) MCOS->EmitIntValue(DWARF2_LINE_DEFAULT_IS_STMT, 1); MCOS->EmitIntValue(DWARF2_LINE_BASE, 1); MCOS->EmitIntValue(DWARF2_LINE_RANGE, 1); - MCOS->EmitIntValue(DWARF2_LINE_OPCODE_BASE, 1); + MCOS->EmitIntValue(StandardOpcodeLengths.size() + 1, 1); // Standard opcode lengths - MCOS->EmitIntValue(0, 1); // length of DW_LNS_copy - MCOS->EmitIntValue(1, 1); // length of DW_LNS_advance_pc - MCOS->EmitIntValue(1, 1); // length of DW_LNS_advance_line - MCOS->EmitIntValue(1, 1); // length of DW_LNS_set_file - MCOS->EmitIntValue(1, 1); // length of DW_LNS_set_column - MCOS->EmitIntValue(0, 1); // length of DW_LNS_negate_stmt - MCOS->EmitIntValue(0, 1); // length of DW_LNS_set_basic_block - MCOS->EmitIntValue(0, 1); // length of DW_LNS_const_add_pc - MCOS->EmitIntValue(1, 1); // length of DW_LNS_fixed_advance_pc - MCOS->EmitIntValue(0, 1); // length of DW_LNS_set_prologue_end - MCOS->EmitIntValue(0, 1); // length of DW_LNS_set_epilogue_begin - MCOS->EmitIntValue(1, 1); // DW_LNS_set_isa + for (char Length : StandardOpcodeLengths) + MCOS->EmitIntValue(Length, 1); // Put out the directory and file tables. |