mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
Add basic block machine relocation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29349 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7e6e441394
commit
b4e80f8857
@ -19,6 +19,7 @@
|
||||
|
||||
namespace llvm {
|
||||
class GlobalValue;
|
||||
class MachineBasicBlock;
|
||||
|
||||
/// MachineRelocation - This represents a target-specific relocation value,
|
||||
/// produced by the code emitter. This relocation is resolved after the has
|
||||
@ -38,6 +39,7 @@ class MachineRelocation {
|
||||
enum AddressType {
|
||||
isResult, // Relocation has be transformed into its result pointer.
|
||||
isGV, // The Target.GV field is valid.
|
||||
isBB, // Relocation of BB address.
|
||||
isExtSym, // The Target.ExtSym field is valid.
|
||||
isConstPool, // Relocation of constant pool address.
|
||||
isJumpTable, // Relocation of jump table address.
|
||||
@ -52,11 +54,12 @@ class MachineRelocation {
|
||||
intptr_t ConstantVal;
|
||||
|
||||
union {
|
||||
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 Index; // Constant pool / jump table index
|
||||
unsigned GOTIndex; // Index in the GOT of this symbol/global
|
||||
void *Result; // If this has been resolved to a resolved pointer
|
||||
GlobalValue *GV; // If this is a pointer to an LLVM global
|
||||
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
|
||||
unsigned GOTIndex; // Index in the GOT of this symbol/global
|
||||
} Target;
|
||||
|
||||
unsigned TargetReloType : 6; // The target relocation ID.
|
||||
@ -83,6 +86,22 @@ public:
|
||||
return Result;
|
||||
}
|
||||
|
||||
/// MachineRelocation::getBB - Return a relocation entry for a BB.
|
||||
///
|
||||
static MachineRelocation getBB(intptr_t offset,unsigned RelocationType,
|
||||
MachineBasicBlock *MBB, 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 = isBB;
|
||||
Result.DoesntNeedFnStub = false;
|
||||
Result.GOTRelative = false;
|
||||
Result.Target.MBB = MBB;
|
||||
return Result;
|
||||
}
|
||||
|
||||
/// MachineRelocation::getExtSym - Return a relocation entry for an external
|
||||
/// symbol, like "free".
|
||||
///
|
||||
@ -160,6 +179,12 @@ public:
|
||||
return AddrType == isGV;
|
||||
}
|
||||
|
||||
/// isBasicBlock - Return true if this relocation is a basic block reference.
|
||||
///
|
||||
bool isBasicBlock() const {
|
||||
return AddrType == isBB;
|
||||
}
|
||||
|
||||
/// isString - Return true if this is a constant string.
|
||||
///
|
||||
bool isString() const {
|
||||
@ -200,6 +225,11 @@ public:
|
||||
return Target.GV;
|
||||
}
|
||||
|
||||
MachineBasicBlock *getBasicBlock() const {
|
||||
assert(isBasicBlock() && "This is not a basic block reference!");
|
||||
return Target.MBB;
|
||||
}
|
||||
|
||||
/// getString - If this is a string value, return the string reference.
|
||||
///
|
||||
const char *getString() const {
|
||||
|
Loading…
Reference in New Issue
Block a user