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:
Evan Cheng
2006-07-27 18:18:13 +00:00
parent 7e6e441394
commit b4e80f8857

View File

@@ -19,6 +19,7 @@
namespace llvm { namespace llvm {
class GlobalValue; class GlobalValue;
class MachineBasicBlock;
/// MachineRelocation - This represents a target-specific relocation value, /// MachineRelocation - This represents a target-specific relocation value,
/// produced by the code emitter. This relocation is resolved after the has /// produced by the code emitter. This relocation is resolved after the has
@@ -38,6 +39,7 @@ class MachineRelocation {
enum AddressType { enum AddressType {
isResult, // Relocation has be transformed into its result pointer. isResult, // Relocation has be transformed into its result pointer.
isGV, // The Target.GV field is valid. isGV, // The Target.GV field is valid.
isBB, // Relocation of BB address.
isExtSym, // The Target.ExtSym field is valid. isExtSym, // The Target.ExtSym field is valid.
isConstPool, // Relocation of constant pool address. isConstPool, // Relocation of constant pool address.
isJumpTable, // Relocation of jump table address. isJumpTable, // Relocation of jump table address.
@@ -52,11 +54,12 @@ class MachineRelocation {
intptr_t ConstantVal; intptr_t ConstantVal;
union { union {
void *Result; // If this has been resolved to a resolved pointer 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 an LLVM global
const char *ExtSym; // If this is a pointer to a named symbol MachineBasicBlock *MBB; // If this is a pointer to a LLVM BB
unsigned Index; // Constant pool / jump table index const char *ExtSym; // If this is a pointer to a named symbol
unsigned GOTIndex; // Index in the GOT of this symbol/global unsigned Index; // Constant pool / jump table index
unsigned GOTIndex; // Index in the GOT of this symbol/global
} Target; } Target;
unsigned TargetReloType : 6; // The target relocation ID. unsigned TargetReloType : 6; // The target relocation ID.
@@ -83,6 +86,22 @@ public:
return Result; 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 /// MachineRelocation::getExtSym - Return a relocation entry for an external
/// symbol, like "free". /// symbol, like "free".
/// ///
@@ -160,6 +179,12 @@ public:
return AddrType == isGV; 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. /// isString - Return true if this is a constant string.
/// ///
bool isString() const { bool isString() const {
@@ -200,6 +225,11 @@ public:
return Target.GV; 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. /// getString - If this is a string value, return the string reference.
/// ///
const char *getString() const { const char *getString() const {