mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-02 04:24:22 +00:00
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
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user