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:
parent
8be513822c
commit
cfb01e26bc
|
@ -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
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue