[PATCH] Support DWARF discriminators in object streamer.
Rafael EspĂndola
rafael.espindola at gmail.com
Fri Feb 14 07:37:48 PST 2014
We really shouldn't be mixing debug information *in* the .s and debug
information generated *for* a .s.
It might be that dwarfdump has a bug and needs more information to
work. In which case that information should be in the .s or we should
fix dwarfdump.
Give me a sec. I am applying you patch and will debug it a bit to see
what is the issue.
On 14 February 2014 10:28, Diego Novillo <dnovillo at google.com> wrote:
> I still haven't woken up. I need -g in *both* cases:
>
> 1- llvm-dwarfdump needs a -g .o or it will not generate its report.
> 2- If I do not use -g, I need to write a .file directive so .loc won't
> get confused.
> 3- I cannot write a .file directive if I'm using -g.
>
> So, the only way to get both tests here is to always run llvm-mc with
> -g.
>
> Hi echristo,
>
> http://llvm-reviews.chandlerc.com/D2794
>
> CHANGE SINCE LAST DIFF
> http://llvm-reviews.chandlerc.com/D2794?vs=7129&id=7131#toc
>
> Files:
> lib/DebugInfo/DWARFDebugLine.cpp
> lib/DebugInfo/DWARFDebugLine.h
> lib/MC/MCDwarf.cpp
> test/DebugInfo/X86/ending-run.ll
> test/DebugInfo/X86/line-info.ll
> test/MC/ELF/discriminator.s
> test/MC/MachO/gen-dwarf-cpp.s
> test/MC/MachO/gen-dwarf.s
>
> Index: lib/DebugInfo/DWARFDebugLine.cpp
> ===================================================================
> --- lib/DebugInfo/DWARFDebugLine.cpp
> +++ lib/DebugInfo/DWARFDebugLine.cpp
> @@ -62,6 +62,7 @@
> Column = 0;
> File = 1;
> Isa = 0;
> + Discriminator = 0;
> IsStmt = default_is_stmt;
> BasicBlock = false;
> EndSequence = false;
> @@ -71,7 +72,7 @@
>
> void DWARFDebugLine::Row::dump(raw_ostream &OS) const {
> OS << format("0x%16.16" PRIx64 " %6u %6u", Address, Line, Column)
> - << format(" %6u %3u ", File, Isa)
> + << format(" %6u %3u %13u ", File, Isa, Discriminator)
> << (IsStmt ? " is_stmt" : "")
> << (BasicBlock ? " basic_block" : "")
> << (PrologueEnd ? " prologue_end" : "")
> @@ -85,8 +86,9 @@
> OS << '\n';
>
> if (!Rows.empty()) {
> - OS << "Address Line Column File ISA Flags\n"
> - << "------------------ ------ ------ ------ --- -------------\n";
> + OS << "Address Line Column File ISA Discriminator Flags\n"
> + << "------------------ ------ ------ ------ --- ------------- "
> + "-------------\n";
> for (std::vector<Row>::const_iterator pos = Rows.begin(),
> end = Rows.end(); pos != end; ++pos)
> pos->dump(OS);
> @@ -311,6 +313,10 @@
> }
> break;
>
> + case DW_LNE_set_discriminator:
> + state.Discriminator = debug_line_data.getULEB128(offset_ptr);
> + break;
> +
> default:
> // Length doesn't include the zero opcode byte or the length itself, but
> // it does include the sub_opcode, so we have to adjust for that below
> Index: lib/DebugInfo/DWARFDebugLine.h
> ===================================================================
> --- lib/DebugInfo/DWARFDebugLine.h
> +++ lib/DebugInfo/DWARFDebugLine.h
> @@ -112,6 +112,9 @@
> // An unsigned integer whose value encodes the applicable instruction set
> // architecture for the current instruction.
> uint8_t Isa;
> + // An unsigned integer representing the DWARF path discriminator value
> + // for this location.
> + uint32_t Discriminator;
> // A boolean indicating that the current instruction is the beginning of a
> // statement.
> uint8_t IsStmt:1,
> Index: lib/MC/MCDwarf.cpp
> ===================================================================
> --- lib/MC/MCDwarf.cpp
> +++ lib/MC/MCDwarf.cpp
> @@ -137,6 +137,7 @@
> unsigned Column = 0;
> unsigned Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
> unsigned Isa = 0;
> + unsigned Discriminator = 0;
> MCSymbol *LastLabel = NULL;
>
> // Loop through each MCLineEntry and encode the dwarf line number table.
> @@ -154,6 +155,15 @@
> MCOS->EmitIntValue(dwarf::DW_LNS_set_column, 1);
> MCOS->EmitULEB128IntValue(Column);
> }
> + if (Discriminator != it->getDiscriminator()) {
> + Discriminator = it->getDiscriminator();
> + unsigned Size =
> + MCOS->getContext().getAsmInfo()->getULEB128Size(Discriminator);
> + MCOS->EmitIntValue(dwarf::DW_LNS_extended_op, 1);
> + MCOS->EmitULEB128IntValue(Size + 1);
> + MCOS->EmitIntValue(dwarf::DW_LNE_set_discriminator, 1);
> + MCOS->EmitULEB128IntValue(Discriminator);
> + }
> if (Isa != it->getIsa()) {
> Isa = it->getIsa();
> MCOS->EmitIntValue(dwarf::DW_LNS_set_isa, 1);
> Index: test/DebugInfo/X86/ending-run.ll
> ===================================================================
> --- test/DebugInfo/X86/ending-run.ll
> +++ test/DebugInfo/X86/ending-run.ll
> @@ -4,9 +4,9 @@
> ; Check that the line table starts at 7, not 4, but that the first
> ; statement isn't until line 8.
>
> -; CHECK-NOT: 0x0000000000000000 7 0 1 0 is_stmt
> +; CHECK-NOT: 0x0000000000000000 7 0 1 0 0 is_stmt
> ; CHECK: 0x0000000000000000 7 0 1 0
> -; CHECK: 0x0000000000000004 8 18 1 0 is_stmt prologue_end
> +; CHECK: 0x0000000000000004 8 18 1 0 0 is_stmt prologue_end
>
> define i32 @callee(i32 %x) nounwind uwtable ssp {
> entry:
> Index: test/DebugInfo/X86/line-info.ll
> ===================================================================
> --- test/DebugInfo/X86/line-info.ll
> +++ test/DebugInfo/X86/line-info.ll
> @@ -2,7 +2,7 @@
> ; RUN: llvm-dwarfdump %t | FileCheck %s
>
> ; CHECK: [[FILEID:[0-9]+]]]{{.*}}list0.h
> -; CHECK: [[FILEID]] 0 1 0 is_stmt{{$}}
> +; CHECK: [[FILEID]] 0 1 0 0 is_stmt{{$}}
>
> ; IR generated from clang -g -emit-llvm with the following source:
> ; list0.h:
> Index: test/MC/ELF/discriminator.s
> ===================================================================
> --- /dev/null
> +++ test/MC/ELF/discriminator.s
> @@ -0,0 +1,20 @@
> +# RUN: llvm-mc -g -triple i386-unknown-unknown %s -filetype=obj -o - | llvm-readobj -r | FileCheck %s
> +# RUN: llvm-mc -g -triple i386-unknown-unknown %s -filetype=obj -o - | llvm-dwarfdump -debug-dump=line - | FileCheck %s -check-prefix=DWARF-DUMP
> +
> + .text
> + .globl foo
> + .type foo, @function
> + .align 4
> +foo:
> + .loc 1 2 discriminator 1
> + ret
> + .size foo, .-foo
> +
> +# CHECK: Relocations [
> +# CHECK: Section ({{[^ ]+}}) .rel.debug_line {
> +# CHECK-NEXT: 0x5B R_386_32 .text 0x0
> +# CHECK-NEXT: }
> +
> +# DWARF-DUMP: Address Line Column File ISA Discriminator Flags
> +# DWARF-DUMP: ------------------ ------ ------ ------ --- ------------- -------------
> +# DWARF-DUMP: 0x0000000000000000 2 0 1 0 1 is_stmt
> Index: test/MC/MachO/gen-dwarf-cpp.s
> ===================================================================
> --- test/MC/MachO/gen-dwarf-cpp.s
> +++ test/MC/MachO/gen-dwarf-cpp.s
> @@ -17,6 +17,6 @@
> // CHECK: file_names[ 2] 0 0x00000000 0x00000000 t.s
>
> // We check that the source line number 100 is picked up before the "movl"
> -// CHECK: Address Line Column File ISA Flags
> -// CHECK: ------------------ ------ ------ ------ --- -------------
> -// CHECK: 0x0000000000000000 102 0 2 0 is_stmt
> +// CHECK: Address Line Column File ISA Discriminator Flags
> +// CHECK: ------------------ ------ ------ ------ --- ------------- -------------
> +// CHECK: 0x0000000000000000 102 0 2 0 0 is_stmt
> Index: test/MC/MachO/gen-dwarf.s
> ===================================================================
> --- test/MC/MachO/gen-dwarf.s
> +++ test/MC/MachO/gen-dwarf.s
> @@ -113,10 +113,10 @@
> // CHECK: ---- ---------- ---------- ---------------------------
> // CHECK: file_names[ 1] 1 0x00000000 0x00000000 gen-dwarf.s
>
> -// CHECK: Address Line Column File ISA Flags
> -// CHECK: ------------------ ------ ------ ------ --- -------------
> -// CHECK: 0x0000000000000000 6 0 1 0 is_stmt
> -// CHECK: 0x0000000000000005 7 0 1 0 is_stmt
> -// CHECK: 0x0000000000000006 8 0 1 0 is_stmt
> -// CHECK: 0x0000000000000007 11 0 1 0 is_stmt
> -// CHECK: 0x0000000000000008 11 0 1 0 is_stmt end_sequence
> +// CHECK: Address Line Column File ISA Discriminator Flags
> +// CHECK: ------------------ ------ ------ ------ --- ------------- -------------
> +// CHECK: 0x0000000000000000 6 0 1 0 0 is_stmt
> +// CHECK: 0x0000000000000005 7 0 1 0 0 is_stmt
> +// CHECK: 0x0000000000000006 8 0 1 0 0 is_stmt
> +// CHECK: 0x0000000000000007 11 0 1 0 0 is_stmt
> +// CHECK: 0x0000000000000008 11 0 1 0 0 is_stmt end_sequence
More information about the llvm-commits
mailing list