From 47c01a0099c10c031f8c544baf44b1c3a1de3fad Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 7 Nov 2008 09:02:17 +0000 Subject: [PATCH] Jump tables may be emitted by target. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58835 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetJITInfo.h | 4 ++++ lib/ExecutionEngine/JIT/JITEmitter.cpp | 22 +++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/llvm/Target/TargetJITInfo.h b/include/llvm/Target/TargetJITInfo.h index 4b81c034662..45aae06e3f3 100644 --- a/include/llvm/Target/TargetJITInfo.h +++ b/include/llvm/Target/TargetJITInfo.h @@ -112,6 +112,10 @@ namespace llvm { /// pool address resolution is handled by the target. virtual bool hasCustomConstantPool() const { return false; } + /// hasCustomJumpTables - Allows a target to specify that jumptables + /// are emitted by the target. + virtual bool hasCustomJumpTables() const { return false; } + /// allocateSeparateGVMemory - If true, globals should be placed in /// separately allocated heap memory rather than in the same /// code memory allocated by MachineCodeEmitter. diff --git a/lib/ExecutionEngine/JIT/JITEmitter.cpp b/lib/ExecutionEngine/JIT/JITEmitter.cpp index 51efcadf731..4ee82fd38e7 100644 --- a/lib/ExecutionEngine/JIT/JITEmitter.cpp +++ b/lib/ExecutionEngine/JIT/JITEmitter.cpp @@ -35,9 +35,9 @@ #include "llvm/System/Disassembler.h" #include "llvm/System/Memory.h" #include "llvm/Target/TargetInstrInfo.h" +#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/Statistic.h" #include -#include #ifndef NDEBUG #include #endif @@ -485,7 +485,7 @@ namespace { MachineModuleInfo* MMI; // GVSet - a set to keep track of which globals have been seen - std::set GVSet; + SmallPtrSet GVSet; public: JITEmitter(JIT &jit, JITMemoryManager *JMM) : Resolver(jit) { @@ -728,7 +728,7 @@ unsigned JITEmitter::addSizeOfGlobalsInConstantVal(const Constant *C, if (C->getType()->getTypeID() == Type::PointerTyID) if (const GlobalVariable* GV = dyn_cast(C)) - if (GVSet.insert(GV).second) + if (GVSet.insert(GV)) Size = addSizeOfGlobal(GV, Size); return Size; @@ -780,7 +780,7 @@ unsigned JITEmitter::GetSizeOfGlobalsInBytes(MachineFunction &MF) { // assuming the addresses of the new globals in this module // start at 0 (or something) and adjusting them after codegen // complete. Another possibility is to grab a marker bit in GV. - if (GVSet.insert(GV).second) + if (GVSet.insert(GV)) // A variable as yet unseen. Add in its size. Size = addSizeOfGlobal(GV, Size); } @@ -790,7 +790,7 @@ unsigned JITEmitter::GetSizeOfGlobalsInBytes(MachineFunction &MF) { DOUT << "JIT: About to look through initializers\n"; // Look for more globals that are referenced only from initializers. // GVSet.end is computed each time because the set can grow as we go. - for (std::set::iterator I = GVSet.begin(); + for (SmallPtrSet::iterator I = GVSet.begin(); I != GVSet.end(); I++) { const GlobalVariable* GV = *I; if (GV->hasInitializer()) @@ -1022,11 +1022,9 @@ void* JITEmitter::allocateSpace(intptr_t Size, unsigned Alignment) { } void JITEmitter::emitConstantPool(MachineConstantPool *MCP) { - if (TheJIT->getJITInfo().hasCustomConstantPool()) { - DOUT << "JIT: Target has custom constant pool handling. Omitting standard " - "constant pool\n"; + if (TheJIT->getJITInfo().hasCustomConstantPool()) return; - } + const std::vector &Constants = MCP->getConstants(); if (Constants.empty()) return; @@ -1060,6 +1058,9 @@ void JITEmitter::emitConstantPool(MachineConstantPool *MCP) { } void JITEmitter::initJumpTableInfo(MachineJumpTableInfo *MJTI) { + if (TheJIT->getJITInfo().hasCustomJumpTables()) + return; + const std::vector &JT = MJTI->getJumpTables(); if (JT.empty()) return; @@ -1077,6 +1078,9 @@ void JITEmitter::initJumpTableInfo(MachineJumpTableInfo *MJTI) { } void JITEmitter::emitJumpTableInfo(MachineJumpTableInfo *MJTI) { + if (TheJIT->getJITInfo().hasCustomJumpTables()) + return; + const std::vector &JT = MJTI->getJumpTables(); if (JT.empty() || JumpTableBase == 0) return;