add an API so target-independent codegen can determine if a constant

pool entry will require relocations against it.  I implemented this
conservatively for ARM, someone who is knowledgable about it should
see if this can be improved.

llvm-svn: 76678
This commit is contained in:
Chris Lattner 2009-07-21 23:34:23 +00:00
parent 8be513822c
commit cfb01e26bc
3 changed files with 55 additions and 2 deletions

View File

@ -41,8 +41,22 @@ public:
/// getType - get type of this MachineConstantPoolValue. /// getType - get type of this MachineConstantPoolValue.
/// ///
inline const Type *getType() const { return Ty; } const Type *getType() const { return Ty; }
/// getRelocatationInfo - This method classifies the entry according to
/// whether or not it may generate a relocation entry. This must be
/// conservative, so if it might codegen to a relocatable entry, it should say
/// so. The return values are:
///
/// 0: This constant pool entry is guaranteed to never have a relocation
/// applied to it (because it holds a simple constant like '4').
/// 1: This entry has relocations, but the entries are guaranteed to be
/// resolvable by the static linker, so the dynamic linker will never see
/// them.
/// 2: This entry may have arbitrary relocations.
virtual unsigned getRelocatationInfo() const = 0;
virtual int getExistingMachineCPValue(MachineConstantPool *CP, virtual int getExistingMachineCPValue(MachineConstantPool *CP,
unsigned Alignment) = 0; unsigned Alignment) = 0;
@ -94,6 +108,19 @@ public:
} }
const Type *getType() const; const Type *getType() const;
/// getRelocatationInfo - This method classifies the entry according to
/// whether or not it may generate a relocation entry. This must be
/// conservative, so if it might codegen to a relocatable entry, it should say
/// so. The return values are:
///
/// 0: This constant pool entry is guaranteed to never have a relocation
/// applied to it (because it holds a simple constant like '4').
/// 1: This entry has relocations, but the entries are guaranteed to be
/// resolvable by the static linker, so the dynamic linker will never see
/// them.
/// 2: This entry may have arbitrary relocations.
unsigned getRelocatationInfo() const;
}; };
/// The MachineConstantPool class keeps track of constants referenced by a /// The MachineConstantPool class keeps track of constants referenced by a

View File

@ -539,10 +539,29 @@ void MachineJumpTableInfo::dump() const { print(*cerr.stream()); }
const Type *MachineConstantPoolEntry::getType() const { const Type *MachineConstantPoolEntry::getType() const {
if (isMachineConstantPoolEntry()) if (isMachineConstantPoolEntry())
return Val.MachineCPVal->getType(); return Val.MachineCPVal->getType();
return Val.ConstVal->getType(); return Val.ConstVal->getType();
} }
unsigned MachineConstantPoolEntry::getRelocatationInfo() const {
if (isMachineConstantPoolEntry())
return Val.MachineCPVal->getRelocatationInfo();
// FIXME: This API sucks.
// If no relocations, return 0.
if (!Val.ConstVal->ContainsRelocations())
return 0;
// If it contains no global relocations, return 1.
if (!Val.ConstVal->ContainsRelocations(Reloc::Global))
return 1;
// Otherwise, it has general relocations.
return 2;
}
MachineConstantPool::~MachineConstantPool() { MachineConstantPool::~MachineConstantPool() {
for (unsigned i = 0, e = Constants.size(); i != e; ++i) for (unsigned i = 0, e = Constants.size(); i != e; ++i)
if (Constants[i].isMachineConstantPoolEntry()) if (Constants[i].isMachineConstantPoolEntry())

View File

@ -65,6 +65,13 @@ public:
bool isStub() const { return Kind == ARMCP::CPStub; } bool isStub() const { return Kind == ARMCP::CPStub; }
unsigned char getPCAdjustment() const { return PCAdjust; } unsigned char getPCAdjustment() const { return PCAdjust; }
virtual unsigned getRelocatationInfo() const {
// FIXME: This is conservatively claiming that these entries require a
// relocation, we may be able to do better than this.
return 2;
}
virtual int getExistingMachineCPValue(MachineConstantPool *CP, virtual int getExistingMachineCPValue(MachineConstantPool *CP,
unsigned Alignment); unsigned Alignment);