diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-22 00:05:44 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-22 00:05:44 +0000 |
commit | 7cf12c7efd37dc12c3ed536a3f4c373dddac2b85 (patch) | |
tree | 9eaf5648fd1b7eb369792e52af192cbf59dbdb0e /lib/VMCore/Constants.cpp | |
parent | 9c5beed5f5a6da5bd86c7dee6f8f803e8960e6a6 (diff) | |
download | external_llvm-7cf12c7efd37dc12c3ed536a3f4c373dddac2b85.zip external_llvm-7cf12c7efd37dc12c3ed536a3f4c373dddac2b85.tar.gz external_llvm-7cf12c7efd37dc12c3ed536a3f4c373dddac2b85.tar.bz2 |
reimplement Constant::ContainsRelocations as
Constant::getRelocationInfo(), which has a much simpler
to use API. It still should not be part of libvmcore, but
is better than it was. Also teach it to be smart about
hidden visibility.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76700 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Constants.cpp')
-rw-r--r-- | lib/VMCore/Constants.cpp | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index e64b0c4..2eb7339 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -101,34 +101,35 @@ bool Constant::canTrap() const { } } -/// 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; - } - return false; +/// getRelocationInfo - 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. +/// +/// FIXME: This really should not be in VMCore. +unsigned Constant::getRelocationInfo() const { + if (const GlobalValue* GV = dyn_cast<GlobalValue>(this)) { + if (GV->hasLocalLinkage() || GV->hasHiddenVisibility()) + return 1; // Local to this file/library. + return 2; // Global reference. } - + + unsigned Result = 0; for (unsigned i = 0, e = getNumOperands(); i != e; ++i) - if (getOperand(i)->ContainsRelocations(Kind)) - return true; - - return false; + Result = std::max(Result, getOperand(i)->getRelocationInfo()); + + return Result; } + /// getVectorElements - This method, which is only valid on constant of vector /// type, returns the elements of the vector in the specified smallvector. /// This handles breaking down a vector undef into undef elements, etc. For |