From 52b510b4c4f36f58c4aa37a1f835eb95e89e0adb Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 23 Jun 2006 01:02:37 +0000 Subject: [PATCH] Added jump table address relocation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28908 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineRelocation.h | 39 +++++++++++++++++++++--- lib/ExecutionEngine/JIT/JITEmitter.cpp | 6 +++- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/include/llvm/CodeGen/MachineRelocation.h b/include/llvm/CodeGen/MachineRelocation.h index c23b999e2ec..58b4f87bc53 100644 --- a/include/llvm/CodeGen/MachineRelocation.h +++ b/include/llvm/CodeGen/MachineRelocation.h @@ -39,7 +39,8 @@ class MachineRelocation { isResult, // Relocation has be transformed into its result pointer. isGV, // The Target.GV field is valid. isExtSym, // The Target.ExtSym field is valid. - isConstPool, // The Target.ConstPool field is valid. + isConstPool, // Relocation of constant pool address. + isJumpTable, // Relocation of jump table address. isGOTIndex // The Target.GOTIndex field is valid. }; @@ -54,7 +55,7 @@ class MachineRelocation { void *Result; // If this has been resolved to a resolved pointer GlobalValue *GV; // If this is a pointer to an LLVM global const char *ExtSym; // If this is a pointer to a named symbol - unsigned ConstPool; // In this is a pointer to a constant pool entry + unsigned Index; // Constant pool / jump table index unsigned GOTIndex; // Index in the GOT of this symbol/global } Target; @@ -113,7 +114,24 @@ public: Result.AddrType = isConstPool; Result.DoesntNeedFnStub = false; Result.GOTRelative = false; - Result.Target.ConstPool = CPI; + Result.Target.Index = CPI; + return Result; + } + + /// MachineRelocation::getJumpTable - Return a relocation entry for a jump + /// table entry. + /// + static MachineRelocation getJumpTable(intptr_t offset,unsigned RelocationType, + unsigned JTI, intptr_t cst = 0) { + assert((RelocationType & ~63) == 0 && "Relocation type too large!"); + MachineRelocation Result; + Result.Offset = offset; + Result.ConstantVal = cst; + Result.TargetReloType = RelocationType; + Result.AddrType = isJumpTable; + Result.DoesntNeedFnStub = false; + Result.GOTRelative = false; + Result.Target.Index = JTI; return Result; } @@ -154,6 +172,12 @@ public: return AddrType == isConstPool; } + /// isJumpTableIndex - Return true if this is a jump table reference. + /// + bool isJumpTableIndex() const { + return AddrType == isJumpTable; + } + /// isGOTRelative - Return true the target wants the index into the GOT of /// the symbol rather than the address of the symbol. bool isGOTRelative() const { @@ -187,7 +211,14 @@ public: /// the index into the constant pool. unsigned getConstantPoolIndex() const { assert(isConstantPoolIndex() && "This is not a constant pool reference!"); - return Target.ConstPool; + return Target.Index; + } + + /// getJumpTableIndex - If this is a jump table reference, return + /// the index into the jump table. + unsigned getJumpTableIndex() const { + assert(isJumpTableIndex() && "This is not a jump table reference!"); + return Target.Index; } /// getResultPointer - Once this has been resolved to point to an actual diff --git a/lib/ExecutionEngine/JIT/JITEmitter.cpp b/lib/ExecutionEngine/JIT/JITEmitter.cpp index 4300b177379..ef9e43a44f7 100644 --- a/lib/ExecutionEngine/JIT/JITEmitter.cpp +++ b/lib/ExecutionEngine/JIT/JITEmitter.cpp @@ -786,9 +786,13 @@ bool JITEmitter::finishFunction(MachineFunction &F) { ResultPtr = getPointerToGlobal(MR.getGlobalValue(), BufferBegin+MR.getMachineCodeOffset(), MR.doesntNeedFunctionStub()); - } else { + } else if (MR.isConstantPoolIndex()){ assert(MR.isConstantPoolIndex()); ResultPtr=(void*)getConstantPoolEntryAddress(MR.getConstantPoolIndex()); + } else { + assert(MR.isJumpTableIndex()); + ResultPtr=(void*)getJumpTableEntryAddress(MR.getJumpTableIndex()); + } MR.setResultPointer(ResultPtr);