mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-22 23:39:24 +00:00
Support DWARF discriminators in object streamer.
Summary: This adds support for emitting DWARF path discriminator values in the object streamer. It also changes the DWARF dumper to show discriminator values in the line table output. Reviewers: echristo CC: llvm-commits Differential Revision: http://llvm-reviews.chandlerc.com/D2794 llvm-svn: 201427
This commit is contained in:
parent
4cdaa7d778
commit
5b5cf503b5
@ -62,6 +62,7 @@ void DWARFDebugLine::Row::reset(bool default_is_stmt) {
|
||||
Column = 0;
|
||||
File = 1;
|
||||
Isa = 0;
|
||||
Discriminator = 0;
|
||||
IsStmt = default_is_stmt;
|
||||
BasicBlock = false;
|
||||
EndSequence = false;
|
||||
@ -71,7 +72,7 @@ void DWARFDebugLine::Row::reset(bool default_is_stmt) {
|
||||
|
||||
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 @@ void DWARFDebugLine::LineTable::dump(raw_ostream &OS) const {
|
||||
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 @@ DWARFDebugLine::parseStatementTable(DataExtractor debug_line_data,
|
||||
}
|
||||
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
|
||||
|
@ -112,6 +112,9 @@ public:
|
||||
// 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,
|
||||
|
@ -137,6 +137,7 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
|
||||
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 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
|
||||
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);
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
61
llvm/test/MC/ELF/discriminator.s
Normal file
61
llvm/test/MC/ELF/discriminator.s
Normal file
@ -0,0 +1,61 @@
|
||||
# RUN: llvm-mc -triple i386-unknown-unknown %s -filetype=obj -o %t.o
|
||||
# RUN: llvm-readobj -r %t.o | FileCheck %s
|
||||
# RUN: llvm-dwarfdump -debug-dump=line %t.o | FileCheck %s -check-prefix=DWARF-DUMP
|
||||
|
||||
.file 1 "foo.c"
|
||||
.text
|
||||
.globl foo
|
||||
.type foo, @function
|
||||
.align 4
|
||||
foo:
|
||||
.loc 1 2 discriminator 1
|
||||
ret
|
||||
.size foo, .-foo
|
||||
|
||||
.section .debug_info,"",@progbits
|
||||
.L.debug_info_begin0:
|
||||
.long 34 # Length of Unit
|
||||
.short 4 # DWARF version number
|
||||
.long .L.debug_abbrev_begin # Offset Into Abbrev. Section
|
||||
.byte 8 # Address Size (in bytes)
|
||||
.byte 1 # Abbrev [1] 0xb:0x1b DW_TAG_compile_unit
|
||||
.long .Linfo_string0 # DW_AT_producer
|
||||
.short 12 # DW_AT_language
|
||||
.long .Linfo_string1 # DW_AT_name
|
||||
.quad 0 # DW_AT_low_pc
|
||||
.long 0 # DW_AT_stmt_list
|
||||
.long .Linfo_string2 # DW_AT_comp_dir
|
||||
# DW_AT_APPLE_optimized
|
||||
.section .debug_abbrev,"",@progbits
|
||||
.L.debug_abbrev_begin:
|
||||
.byte 1 # Abbreviation Code
|
||||
.byte 17 # DW_TAG_compile_unit
|
||||
.byte 0 # DW_CHILDREN_no
|
||||
.byte 37 # DW_AT_producer
|
||||
.byte 14 # DW_FORM_strp
|
||||
.byte 19 # DW_AT_language
|
||||
.byte 5 # DW_FORM_data2
|
||||
.byte 3 # DW_AT_name
|
||||
.byte 14 # DW_FORM_strp
|
||||
.byte 17 # DW_AT_low_pc
|
||||
.byte 1 # DW_FORM_addr
|
||||
.byte 16 # DW_AT_stmt_list
|
||||
.byte 23 # DW_FORM_sec_offset
|
||||
.byte 27 # DW_AT_comp_dir
|
||||
.byte 14 # DW_FORM_strp
|
||||
.ascii "\341\177" # DW_AT_APPLE_optimized
|
||||
.byte 25 # DW_FORM_flag_present
|
||||
.byte 0 # EOM(1)
|
||||
.byte 0 # EOM(2)
|
||||
.byte 0 # EOM(3)
|
||||
.L.debug_abbrev_end:
|
||||
|
||||
|
||||
# CHECK: Relocations [
|
||||
# CHECK: Section ({{[^ ]+}}) .rel.debug_line {
|
||||
# CHECK-NEXT: 0x2D R_386_32 .text 0x0
|
||||
# CHECK-NEXT: }
|
||||
|
||||
# DWARF-DUMP: Address Line Column File ISA Discriminator Flags
|
||||
# DWARF-DUMP: ------------------ ------ ------ ------ --- ------------- -------------
|
||||
# DWARF-DUMP: 0x0001021300000000 1 0 1 0 1 is_stmt
|
@ -17,6 +17,6 @@ L1: leave
|
||||
// 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
|
||||
|
@ -113,10 +113,10 @@ _x: .long 1
|
||||
// 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
|
||||
|
Loading…
Reference in New Issue
Block a user