summaryrefslogtreecommitdiffstats
path: root/include/llvm/CodeGen/MachineRelocation.h
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2008-01-04 10:46:51 +0000
committerEvan Cheng <evan.cheng@apple.com>2008-01-04 10:46:51 +0000
commitbe8c03fc66b75fa775e1f47d62a1b0d803fced1c (patch)
treef7d4aff605c112d72392dd096356c1b12e72ce62 /include/llvm/CodeGen/MachineRelocation.h
parent2674d71df02f562cf8c3bc011be92d6dcb9cd9aa (diff)
X86 PIC JIT support fixes: encoding bugs, add lazy pointer stubs support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45575 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen/MachineRelocation.h')
-rw-r--r--include/llvm/CodeGen/MachineRelocation.h31
1 files changed, 29 insertions, 2 deletions
diff --git a/include/llvm/CodeGen/MachineRelocation.h b/include/llvm/CodeGen/MachineRelocation.h
index ab512703ff05..689881b29163 100644
--- a/include/llvm/CodeGen/MachineRelocation.h
+++ b/include/llvm/CodeGen/MachineRelocation.h
@@ -39,6 +39,7 @@ class MachineRelocation {
enum AddressType {
isResult, // Relocation has be transformed into its result pointer.
isGV, // The Target.GV field is valid.
+ isGVLazyPtr, // Relocation of a lazily resolved GV address.
isBB, // Relocation of BB address.
isExtSym, // The Target.ExtSym field is valid.
isConstPool, // Relocation of constant pool address.
@@ -55,7 +56,7 @@ class MachineRelocation {
union {
void *Result; // If this has been resolved to a resolved pointer
- GlobalValue *GV; // If this is a pointer to an LLVM global
+ GlobalValue *GV; // If this is a pointer to a GV or a GV lazy ptr
MachineBasicBlock *MBB; // If this is a pointer to a LLVM BB
const char *ExtSym; // If this is a pointer to a named symbol
unsigned Index; // Constant pool / jump table index
@@ -93,6 +94,25 @@ public:
return Result;
}
+ /// MachineRelocation::getGVLazyPtr - Return a relocation entry for a
+ /// lazily resolved GlobalValue address.
+ static MachineRelocation getGVLazyPtr(intptr_t offset,
+ unsigned RelocationType,
+ GlobalValue *GV, intptr_t cst = 0,
+ bool NeedStub = 0,
+ bool GOTrelative = 0) {
+ assert((RelocationType & ~63) == 0 && "Relocation type too large!");
+ MachineRelocation Result;
+ Result.Offset = offset;
+ Result.ConstantVal = cst;
+ Result.TargetReloType = RelocationType;
+ Result.AddrType = isGVLazyPtr;
+ Result.NeedStub = NeedStub;
+ Result.GOTRelative = GOTrelative;
+ Result.Target.GV = GV;
+ return Result;
+ }
+
/// MachineRelocation::getBB - Return a relocation entry for a BB.
///
static MachineRelocation getBB(intptr_t offset,unsigned RelocationType,
@@ -193,6 +213,12 @@ public:
return AddrType == isGV;
}
+ /// isGlobalValueVLazyPtr - Return true if this relocation is the address
+ /// of a lazily resolved GlobalValue.
+ bool isGlobalValueLazyPtr() const {
+ return AddrType == isGVLazyPtr;
+ }
+
/// isBasicBlock - Return true if this relocation is a basic block reference.
///
bool isBasicBlock() const {
@@ -234,7 +260,8 @@ public:
/// getGlobalValue - If this is a global value reference, return the
/// referenced global.
GlobalValue *getGlobalValue() const {
- assert(isGlobalValue() && "This is not a global value reference!");
+ assert((isGlobalValue() || isGlobalValueLazyPtr()) &&
+ "This is not a global value reference!");
return Target.GV;
}