X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FARM%2FARMJITInfo.h;h=2f9792813d328fac02c05d1c0f6338f07e610067;hb=61512ba251097888963a8f07a35605564bcfc537;hp=4b94f3ef795523995698aec6b9f766bee0eba403;hpb=4df60f5491ff35c8a48c2cf14e18a33c9793b3bb;p=oota-llvm.git diff --git a/lib/Target/ARM/ARMJITInfo.h b/lib/Target/ARM/ARMJITInfo.h index 4b94f3ef795..2f9792813d3 100644 --- a/lib/Target/ARM/ARMJITInfo.h +++ b/lib/Target/ARM/ARMJITInfo.h @@ -14,10 +14,11 @@ #ifndef ARMJITINFO_H #define ARMJITINFO_H -#include "llvm/Target/TargetJITInfo.h" +#include "ARMMachineFunctionInfo.h" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" +#include "llvm/Target/TargetJITInfo.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" @@ -25,12 +26,6 @@ namespace llvm { class ARMTargetMachine; class ARMJITInfo : public TargetJITInfo { - ARMTargetMachine &TM; - - // MCPEs - List of the constant pool entries for the current machine - // function that's being processed. - const std::vector *MCPEs; - // ConstPoolId2AddrMap - A map from constant pool ids to the corresponding // CONSTPOOL_ENTRY addresses. SmallVector ConstPoolId2AddrMap; @@ -42,8 +37,16 @@ namespace llvm { // PCLabelMap - A map from PC labels to addresses. DenseMap PCLabelMap; + // Sym2IndirectSymMap - A map from symbol (GlobalValue and ExternalSymbol) + // addresses to their indirect symbol addresses. + DenseMap Sym2IndirectSymMap; + + // IsPIC - True if the relocation model is PIC. This is used to determine + // how to codegen function stubs. + bool IsPIC; + public: - explicit ARMJITInfo(ARMTargetMachine &tm) : TM(tm) { useGOT = false; } + explicit ARMJITInfo() : IsPIC(false) { useGOT = false; } /// replaceMachineCodeForFunction - Make it so that calling the function /// whose machine code is at OLD turns into a call to NEW, perhaps by @@ -52,11 +55,21 @@ namespace llvm { /// virtual void replaceMachineCodeForFunction(void *Old, void *New); - /// emitFunctionStub - Use the specified MachineCodeEmitter object to emit a + /// emitGlobalValueIndirectSym - Use the specified JITCodeEmitter object + /// to emit an indirect symbol which contains the address of the specified + /// ptr. + virtual void *emitGlobalValueIndirectSym(const GlobalValue* GV, void *ptr, + JITCodeEmitter &JCE); + + // getStubLayout - Returns the size and alignment of the largest call stub + // on ARM. + virtual StubLayout getStubLayout(); + + /// emitFunctionStub - Use the specified JITCodeEmitter object to emit a /// small native function that simply calls the function at the specified /// address. virtual void *emitFunctionStub(const Function* F, void *Fn, - MachineCodeEmitter &MCE); + JITCodeEmitter &JCE); /// getLazyResolverFunction - Expose the lazy resolver to the JIT. virtual LazyResolverFn getLazyResolverFunction(JITCompilerFn); @@ -77,7 +90,7 @@ namespace llvm { /// allocateSeparateGVMemory - If true, globals should be placed in /// separately allocated heap memory rather than in the same - /// code memory allocated by MachineCodeEmitter. + /// code memory allocated by JITCodeEmitter. virtual bool allocateSeparateGVMemory() const { #ifdef __APPLE__ return true; @@ -86,12 +99,15 @@ namespace llvm { #endif } - /// Initialize - Initialize internal stage. Get the list of constant pool - /// Resize constant pool ids to CONSTPOOL_ENTRY addresses map. - void Initialize(const MachineFunction &MF) { - MCPEs = &MF.getConstantPool()->getConstants(); - ConstPoolId2AddrMap.resize(MCPEs->size()); - JumpTableId2AddrMap.resize(MF.getJumpTableInfo()->getJumpTables().size()); + /// Initialize - Initialize internal stage for the function being JITted. + /// Resize constant pool ids to CONSTPOOL_ENTRY addresses map; resize + /// jump table ids to jump table bases map; remember if codegen relocation + /// model is PIC. + void Initialize(const MachineFunction &MF, bool isPIC) { + const ARMFunctionInfo *AFI = MF.getInfo(); + ConstPoolId2AddrMap.resize(AFI->getNumPICLabels()); + JumpTableId2AddrMap.resize(AFI->getNumJumpTables()); + IsPIC = isPIC; } /// getConstantPoolEntryAddr - The ARM target puts all constant @@ -127,7 +143,8 @@ namespace llvm { JumpTableId2AddrMap[JTI] = Addr; } - /// getPCLabelAddr - Retrieve the address of the PC label of the specified id. + /// getPCLabelAddr - Retrieve the address of the PC label of the + /// specified id. intptr_t getPCLabelAddr(unsigned Id) const { DenseMap::const_iterator I = PCLabelMap.find(Id); assert(I != PCLabelMap.end()); @@ -139,6 +156,22 @@ namespace llvm { PCLabelMap.insert(std::make_pair(Id, Addr)); } + /// getIndirectSymAddr - Retrieve the address of the indirect symbol of the + /// specified symbol located at address. Returns 0 if the indirect symbol + /// has not been emitted. + intptr_t getIndirectSymAddr(void *Addr) const { + DenseMap::const_iterator I= Sym2IndirectSymMap.find(Addr); + if (I != Sym2IndirectSymMap.end()) + return I->second; + return 0; + } + + /// addIndirectSymAddr - Add a mapping from address of an emitted symbol to + /// its indirect symbol address. + void addIndirectSymAddr(void *SymAddr, intptr_t IndSymAddr) { + Sym2IndirectSymMap.insert(std::make_pair(SymAddr, IndSymAddr)); + } + private: /// resolveRelocDestAddr - Resolve the resulting address of the relocation /// if it's not already solved. Constantpool entries must be resolved by