summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ExecutionEngine
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2010-04-16 08:46:10 +0000
committerBill Wendling <isanbard@gmail.com>2010-04-16 08:46:10 +0000
commit929f3c092706581138a228c316f79742ea5ae6e5 (patch)
tree68b0dc310f80955d24e3b083e51291b262a2328d /llvm/lib/ExecutionEngine
parentd2b896ab69844c368f26d5711145f5d01a037a6d (diff)
downloadbcm5719-llvm-929f3c092706581138a228c316f79742ea5ae6e5.tar.gz
bcm5719-llvm-929f3c092706581138a228c316f79742ea5ae6e5.zip
The JIT calls TidyLandingPads to tidy up the landing pads. However, because the
JIT doesn't use the MC back-end asm printer to emit labels that it uses, the section for the MCSymbol is never set. And thus the MCSymbol for the EH label isn't marked as "defined". Because of that, TidyLandingPads removes the needed landing pads from the JIT output. This breaks EH for every JIT program. This is a work-around for this limitation. We pass in the label locations map. If the label has a non-zero value, then it was "emitted" by the JIT and TidyLandingPads shouldn't remove that label. A nicer solution would be to mark the MCSymbol as "used" by the JIT and not rely upon the section being set to determine if it's defined or not. llvm-svn: 101453
Diffstat (limited to 'llvm/lib/ExecutionEngine')
-rw-r--r--llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp4
-rw-r--r--llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp8
2 files changed, 8 insertions, 4 deletions
diff --git a/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp b/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp
index 5819f254a22..281ec7387f7 100644
--- a/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp
+++ b/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp
@@ -199,7 +199,7 @@ unsigned char* JITDwarfEmitter::EmitExceptionTable(MachineFunction* MF,
assert(MMI && "MachineModuleInfo not registered!");
// Map all labels and get rid of any dead landing pads.
- MMI->TidyLandingPads();
+ MMI->TidyLandingPads(JCE->getLabelLocations());
const std::vector<const GlobalVariable *> &TypeInfos = MMI->getTypeInfos();
const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
@@ -780,7 +780,7 @@ JITDwarfEmitter::GetExceptionTableSizeInBytes(MachineFunction* MF) const {
unsigned FinalSize = 0;
// Map all labels and get rid of any dead landing pads.
- MMI->TidyLandingPads();
+ MMI->TidyLandingPads(JCE->getLabelLocations());
const std::vector<const GlobalVariable *> &TypeInfos = MMI->getTypeInfos();
const std::vector<unsigned> &FilterIds = MMI->getFilterIds();
diff --git a/llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp b/llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp
index 976965d8fd0..b25e766bb4d 100644
--- a/llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp
+++ b/llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp
@@ -23,6 +23,7 @@
#include "llvm/Analysis/DebugInfo.h"
#include "llvm/CodeGen/JITCodeEmitter.h"
#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineCodeInfo.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
@@ -30,8 +31,8 @@
#include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/ExecutionEngine/JITEventListener.h"
#include "llvm/ExecutionEngine/JITMemoryManager.h"
-#include "llvm/CodeGen/MachineCodeInfo.h"
#include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetJITInfo.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
@@ -43,7 +44,6 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/System/Disassembler.h"
#include "llvm/System/Memory.h"
-#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
@@ -463,6 +463,10 @@ namespace {
LabelLocations[Label] = getCurrentPCValue();
}
+ virtual DenseMap<MCSymbol*, uintptr_t> *getLabelLocations() {
+ return &LabelLocations;
+ }
+
virtual uintptr_t getLabelAddress(MCSymbol *Label) const {
assert(LabelLocations.count(Label) && "Label not emitted!");
return LabelLocations.find(Label)->second;
OpenPOWER on IntegriCloud