summaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine
diff options
context:
space:
mode:
authorNicolas Geoffray <nicolas.geoffray@lip6.fr>2008-08-19 14:48:14 +0000
committerNicolas Geoffray <nicolas.geoffray@lip6.fr>2008-08-19 14:48:14 +0000
commit2d450ebe1857c60f382aa178d793664f895cf373 (patch)
treebdfefdbc0669c1a56e4e6aba860b18de5f90eb80 /lib/ExecutionEngine
parent23f35bc3aebe72a04b0fedfc32e248d0defc558f (diff)
downloadllvm-2d450ebe1857c60f382aa178d793664f895cf373.tar.gz
llvm-2d450ebe1857c60f382aa178d793664f895cf373.tar.bz2
llvm-2d450ebe1857c60f382aa178d793664f895cf373.tar.xz
Update the JIT exception writer to better mimic the codegen exception writer.
Also skip indirect encoding for platforms that ask for one: we direclty write an address, not a pointer to the address. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54987 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine')
-rw-r--r--lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp21
1 files changed, 10 insertions, 11 deletions
diff --git a/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp b/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp
index 1bbad863d6..6fa40c7631 100644
--- a/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp
+++ b/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp
@@ -66,7 +66,8 @@ JITDwarfEmitter::EmitFrameMoves(intptr_t BaseLabelPtr,
unsigned PointerSize = TD->getPointerSize();
int stackGrowth = stackGrowthDirection == TargetFrameInfo::StackGrowsUp ?
PointerSize : -PointerSize;
- bool IsLocal = BaseLabelPtr;
+ bool IsLocal = false;
+ unsigned BaseLabelID = 0;
for (unsigned i = 0, N = Moves.size(); i < N; ++i) {
const MachineMove &Move = Moves[i];
@@ -86,7 +87,7 @@ JITDwarfEmitter::EmitFrameMoves(intptr_t BaseLabelPtr,
const MachineLocation &Src = Move.getSource();
// Advance row if new location.
- if (BaseLabelPtr && LabelID && (BaseLabelPtr != LabelPtr || !IsLocal)) {
+ if (BaseLabelPtr && LabelID && (BaseLabelID != LabelID || !IsLocal)) {
MCE->emitByte(dwarf::DW_CFA_advance_loc4);
if (PointerSize == 8) {
MCE->emitInt64(LabelPtr - BaseLabelPtr);
@@ -94,6 +95,7 @@ JITDwarfEmitter::EmitFrameMoves(intptr_t BaseLabelPtr,
MCE->emitInt32(LabelPtr - BaseLabelPtr);
}
+ BaseLabelID = LabelID;
BaseLabelPtr = LabelPtr;
IsLocal = true;
}
@@ -541,12 +543,9 @@ JITDwarfEmitter::EmitCommonEHFrame(const Function* Personality) const {
if (Personality) {
MCE->emitULEB128Bytes(7);
- if (needsIndirectEncoding)
- MCE->emitByte(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 |
- dwarf::DW_EH_PE_indirect);
- else
- MCE->emitByte(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
-
+ // Direct encoding, because we use the function pointer.
+ MCE->emitByte(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
+
if (PointerSize == 8)
MCE->emitInt64((intptr_t)Jit.getPointerToGlobal(Personality) -
MCE->getCurrentPCValue());
@@ -554,12 +553,12 @@ JITDwarfEmitter::EmitCommonEHFrame(const Function* Personality) const {
MCE->emitInt32((intptr_t)Jit.getPointerToGlobal(Personality) -
MCE->getCurrentPCValue());
- MCE->emitULEB128Bytes(dwarf::DW_EH_PE_pcrel);
- MCE->emitULEB128Bytes(dwarf::DW_EH_PE_pcrel);
+ MCE->emitULEB128Bytes(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
+ MCE->emitULEB128Bytes(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
} else {
MCE->emitULEB128Bytes(1);
- MCE->emitULEB128Bytes(dwarf::DW_EH_PE_pcrel);
+ MCE->emitULEB128Bytes(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
}
std::vector<MachineMove> Moves;