mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[dsymutil] Use the new MCDwarfLineTableParams customization to emit linetables
llvm-dsymutil has to be able to process debug info produced by other compilers which use different line table settings. The testcase wasn't generated by another compiler, but by a modified clang. llvm-svn: 244319
This commit is contained in:
parent
d75746ed42
commit
fd14836f8a
Binary file not shown.
@ -20,3 +20,9 @@ int foo(int arg) {
|
||||
return bar(arg+val) + inc() + baz++;
|
||||
}
|
||||
|
||||
/* This file was also used to create basic2-custom-linetable.macho.x86_64.o
|
||||
with a custom clang that had different settings for the linetable
|
||||
encoding constants: line_base == -1 and line_range == 4.
|
||||
|
||||
clang -c -g basic2.c -o basic2-custom-linetable.macho.x86_64.o
|
||||
*/
|
||||
|
40
test/tools/dsymutil/X86/custom-line-table.test
Normal file
40
test/tools/dsymutil/X86/custom-line-table.test
Normal file
@ -0,0 +1,40 @@
|
||||
# RUN: llvm-dsymutil -oso-prepend-path %p/../Inputs -y %s -f -o - | llvm-dwarfdump - -debug-dump=line | FileCheck %s
|
||||
|
||||
# This test runs dsymutil on an object file with non-standard (as far
|
||||
# as llvm is concerned) line table settings.
|
||||
|
||||
---
|
||||
triple: 'x86_64-apple-darwin'
|
||||
objects:
|
||||
- filename: basic2-custom-linetable.macho.x86_64.o
|
||||
symbols:
|
||||
- { sym: _foo, objAddr: 0x0, binAddr: 0x1000, size: 0x12 }
|
||||
|
||||
# CHECK: 0x0000000000001000 19 0 {{.*}} is_stmt
|
||||
# CHECK: 0x0000000000001012 20 14 {{.*}} is_stmt prologue_end
|
||||
# CHECK: 0x0000000000001015 20 18 {{.*}}
|
||||
# CHECK: 0x0000000000001017 20 17 {{.*}}
|
||||
# CHECK: 0x0000000000001019 20 10 {{.*}}
|
||||
# CHECK: 0x000000000000101e 20 25 {{.*}}
|
||||
# CHECK: 0x0000000000001026 20 23 {{.*}}
|
||||
# CHECK: 0x000000000000102b 20 36 {{.*}}
|
||||
# CHECK: 0x000000000000103c 20 31 {{.*}}
|
||||
# CHECK: 0x000000000000103e 20 3 {{.*}}
|
||||
# CHECK: 0x0000000000001046 20 3 {{.*}} end_sequence
|
||||
|
||||
- { sym: _inc, objAddr: 0x0, binAddr: 0x2000, size: 0x12 }
|
||||
|
||||
# CHECK: 0x0000000000002000 14 0 {{.*}} is_stmt
|
||||
# CHECK: 0x0000000000002004 15 10 {{.*}} is_stmt prologue_end
|
||||
# CHECK: 0x0000000000002013 15 3 {{.*}}
|
||||
# CHECK: 0x0000000000002015 15 3 {{.*}} end_sequence
|
||||
|
||||
- { sym: _unused1, objAddr: 0x0, binAddr: 0x3000, size: 0x12 }
|
||||
|
||||
# CHECK: 0x0000000000003000 10 0 {{.*}} is_stmt
|
||||
# CHECK: 0x0000000000003004 11 7 {{.*}} is_stmt prologue_end
|
||||
# CHECK: 0x000000000000300e 11 3 {{.*}}
|
||||
# CHECK: 0x0000000000003013 12 1 {{.*}} is_stmt
|
||||
# CHECK: 0x000000000000301c 12 1 {{.*}} is_stmt end_sequence
|
||||
...
|
||||
|
@ -618,7 +618,8 @@ public:
|
||||
|
||||
/// \brief Emit the line table described in \p Rows into the
|
||||
/// debug_line section.
|
||||
void emitLineTableForUnit(StringRef PrologueBytes, unsigned MinInstLength,
|
||||
void emitLineTableForUnit(MCDwarfLineTableParams Params,
|
||||
StringRef PrologueBytes, unsigned MinInstLength,
|
||||
std::vector<DWARFDebugLine::Row> &Rows,
|
||||
unsigned AdddressSize);
|
||||
|
||||
@ -942,7 +943,8 @@ void DwarfStreamer::emitLocationsForUnit(const CompileUnit &Unit,
|
||||
}
|
||||
}
|
||||
|
||||
void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
|
||||
void DwarfStreamer::emitLineTableForUnit(MCDwarfLineTableParams Params,
|
||||
StringRef PrologueBytes,
|
||||
unsigned MinInstLength,
|
||||
std::vector<DWARFDebugLine::Row> &Rows,
|
||||
unsigned PointerSize) {
|
||||
@ -965,7 +967,7 @@ void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
|
||||
if (Rows.empty()) {
|
||||
// We only have the dummy entry, dsymutil emits an entry with a 0
|
||||
// address in that case.
|
||||
MCDwarfLineAddr::Encode(*MC, INT64_MAX, 0, EncodingOS);
|
||||
MCDwarfLineAddr::Encode(*MC, Params, INT64_MAX, 0, EncodingOS);
|
||||
MS->EmitBytes(EncodingOS.str());
|
||||
LineSectionSize += EncodingBuffer.size();
|
||||
MS->EmitLabel(LineEndSym);
|
||||
@ -1047,7 +1049,7 @@ void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
|
||||
|
||||
int64_t LineDelta = int64_t(Row.Line) - LastLine;
|
||||
if (!Row.EndSequence) {
|
||||
MCDwarfLineAddr::Encode(*MC, LineDelta, AddressDelta, EncodingOS);
|
||||
MCDwarfLineAddr::Encode(*MC, Params, LineDelta, AddressDelta, EncodingOS);
|
||||
MS->EmitBytes(EncodingOS.str());
|
||||
LineSectionSize += EncodingBuffer.size();
|
||||
EncodingBuffer.resize(0);
|
||||
@ -1066,7 +1068,7 @@ void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
|
||||
MS->EmitULEB128IntValue(AddressDelta);
|
||||
LineSectionSize += 1 + getULEB128Size(AddressDelta);
|
||||
}
|
||||
MCDwarfLineAddr::Encode(*MC, INT64_MAX, 0, EncodingOS);
|
||||
MCDwarfLineAddr::Encode(*MC, Params, INT64_MAX, 0, EncodingOS);
|
||||
MS->EmitBytes(EncodingOS.str());
|
||||
LineSectionSize += EncodingBuffer.size();
|
||||
EncodingBuffer.resize(0);
|
||||
@ -1078,7 +1080,7 @@ void DwarfStreamer::emitLineTableForUnit(StringRef PrologueBytes,
|
||||
}
|
||||
|
||||
if (RowsSinceLastSequence) {
|
||||
MCDwarfLineAddr::Encode(*MC, INT64_MAX, 0, EncodingOS);
|
||||
MCDwarfLineAddr::Encode(*MC, Params, INT64_MAX, 0, EncodingOS);
|
||||
MS->EmitBytes(EncodingOS.str());
|
||||
LineSectionSize += EncodingBuffer.size();
|
||||
EncodingBuffer.resize(0);
|
||||
@ -2915,13 +2917,18 @@ void DwarfLinker::patchLineTableForUnit(CompileUnit &Unit,
|
||||
// table emitter.
|
||||
if (LineTable.Prologue.Version != 2 ||
|
||||
LineTable.Prologue.DefaultIsStmt != DWARF2_LINE_DEFAULT_IS_STMT ||
|
||||
LineTable.Prologue.LineBase != -5 || LineTable.Prologue.LineRange != 14 ||
|
||||
LineTable.Prologue.OpcodeBase != 13)
|
||||
LineTable.Prologue.OpcodeBase > 13)
|
||||
reportWarning("line table paramters mismatch. Cannot emit.");
|
||||
else
|
||||
Streamer->emitLineTableForUnit(LineData.slice(StmtList + 4, PrologueEnd),
|
||||
else {
|
||||
MCDwarfLineTableParams Params;
|
||||
Params.DWARF2LineOpcodeBase = LineTable.Prologue.OpcodeBase;
|
||||
Params.DWARF2LineBase = LineTable.Prologue.LineBase;
|
||||
Params.DWARF2LineRange = LineTable.Prologue.LineRange;
|
||||
Streamer->emitLineTableForUnit(Params,
|
||||
LineData.slice(StmtList + 4, PrologueEnd),
|
||||
LineTable.Prologue.MinInstLength, NewRows,
|
||||
Unit.getOrigUnit().getAddressByteSize());
|
||||
}
|
||||
}
|
||||
|
||||
void DwarfLinker::emitAcceleratorEntriesForUnit(CompileUnit &Unit) {
|
||||
|
Loading…
Reference in New Issue
Block a user