1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Extend the relocation tracker handler, so we can filter on different 'kinds' of relocations required.

llvm-svn: 68004
This commit is contained in:
Anton Korobeynikov 2009-03-29 17:13:18 +00:00
parent 602234cdf3
commit 9b5ffaf6ca
2 changed files with 28 additions and 7 deletions

View File

@ -19,6 +19,12 @@
namespace llvm {
template<typename T> class SmallVectorImpl;
namespace Reloc {
const unsigned Local = 1 << 0; ///< Local relocations are required
const unsigned Global = 1 << 1; ///< Global relocations are required
const unsigned LocalOrGlobal = Local | Global;
}
/// This is an important base class in LLVM. It provides the common facilities
/// of all constant values in an LLVM program. A constant is a value that is
/// immutable at runtime. Functions are constants because their address is
@ -62,9 +68,9 @@ public:
/// true for things like constant expressions that could divide by zero.
bool canTrap() const;
/// ContaintsRelocations - Return true if the constant value contains
/// ContainsRelocations - Return true if the constant value contains
/// relocations which cannot be resolved at compile time.
bool ContainsRelocations() const;
bool ContainsRelocations(unsigned Kind = Reloc::LocalOrGlobal) const;
// Specialize get/setOperand for Constants as their operands are always
// constants as well.

View File

@ -90,14 +90,29 @@ bool Constant::canTrap() const {
}
}
/// ContaintsRelocations - Return true if the constant value contains
/// relocations which cannot be resolved at compile time.
bool Constant::ContainsRelocations() const {
if (isa<GlobalValue>(this))
return true;
/// ContainsRelocations - Return true if the constant value contains relocations
/// which cannot be resolved at compile time. Kind argument is used to filter
/// only 'interesting' sorts of relocations.
bool Constant::ContainsRelocations(unsigned Kind) const {
if (const GlobalValue* GV = dyn_cast<GlobalValue>(this)) {
bool isLocal = GV->hasLocalLinkage();
if ((Kind & Reloc::Local) && isLocal) {
// Global has local linkage and 'local' kind of relocations are
// requested
return true;
}
if ((Kind & Reloc::Global) && !isLocal) {
// Global has non-local linkage and 'global' kind of relocations are
// requested
return true;
}
}
for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
if (getOperand(i)->ContainsRelocations())
return true;
return false;
}