aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/Constants.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-07-22 00:05:44 +0000
committerChris Lattner <sabre@nondot.org>2009-07-22 00:05:44 +0000
commit7cf12c7efd37dc12c3ed536a3f4c373dddac2b85 (patch)
tree9eaf5648fd1b7eb369792e52af192cbf59dbdb0e /lib/VMCore/Constants.cpp
parent9c5beed5f5a6da5bd86c7dee6f8f803e8960e6a6 (diff)
downloadexternal_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.cpp47
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