diff options
author | Nicolas Geoffray <nicolas.geoffray@lip6.fr> | 2008-08-19 14:48:14 +0000 |
---|---|---|
committer | Nicolas Geoffray <nicolas.geoffray@lip6.fr> | 2008-08-19 14:48:14 +0000 |
commit | d58c8e759fb482f209aac211888e8068f9675476 (patch) | |
tree | 196dec668619a3370d71b3a6d1c251b70441b1bb /llvm/lib/ExecutionEngine | |
parent | ad7013b1e612be7aaa722b4d5bba96643e797517 (diff) | |
download | bcm5719-llvm-d58c8e759fb482f209aac211888e8068f9675476.tar.gz bcm5719-llvm-d58c8e759fb482f209aac211888e8068f9675476.zip |
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.
llvm-svn: 54987
Diffstat (limited to 'llvm/lib/ExecutionEngine')
-rw-r--r-- | llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp b/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp index 1bbad863d61..6fa40c7631d 100644 --- a/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp +++ b/llvm/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; |