From: Anton Korobeynikov Date: Sun, 29 Mar 2009 17:13:18 +0000 (+0000) Subject: Extend the relocation tracker handler, so we can filter on different 'kinds' of reloc... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=ab267a28239f628e65bef34578695d80ba6d0a9e;p=oota-llvm.git Extend the relocation tracker handler, so we can filter on different 'kinds' of relocations required. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68004 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Constant.h b/include/llvm/Constant.h index b0a130f81e4..bb1b9101c7e 100644 --- a/include/llvm/Constant.h +++ b/include/llvm/Constant.h @@ -19,6 +19,12 @@ namespace llvm { template 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. diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 6c99a1ffe88..62b3a0c6916 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -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(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(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; }