LCOV - code coverage report
Current view: top level - /usr/lib/llvm-19/include/llvm/IR - GlobalValue.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 77.8 % 36 28
Test Date: 2026-02-27 04:14:43 Functions: 83.3 % 18 15
Legend: Lines:     hit not hit

            Line data    Source code
       1              : //===-- llvm/GlobalValue.h - Class to represent a global value --*- C++ -*-===//
       2              : //
       3              : // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
       4              : // See https://llvm.org/LICENSE.txt for license information.
       5              : // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
       6              : //
       7              : //===----------------------------------------------------------------------===//
       8              : //
       9              : // This file is a common base class of all globally definable objects.  As such,
      10              : // it is subclassed by GlobalVariable, GlobalAlias and by Function.  This is
      11              : // used because you can do certain things with these global objects that you
      12              : // can't do to anything else.  For example, use the address of one as a
      13              : // constant.
      14              : //
      15              : //===----------------------------------------------------------------------===//
      16              : 
      17              : #ifndef LLVM_IR_GLOBALVALUE_H
      18              : #define LLVM_IR_GLOBALVALUE_H
      19              : 
      20              : #include "llvm/ADT/StringRef.h"
      21              : #include "llvm/ADT/Twine.h"
      22              : #include "llvm/IR/Constant.h"
      23              : #include "llvm/IR/DerivedTypes.h"
      24              : #include "llvm/IR/Value.h"
      25              : #include "llvm/Support/Casting.h"
      26              : #include "llvm/Support/ErrorHandling.h"
      27              : #include <cassert>
      28              : #include <cstdint>
      29              : #include <string>
      30              : 
      31              : namespace llvm {
      32              : 
      33              : class Comdat;
      34              : class ConstantRange;
      35              : class DataLayout;
      36              : class Error;
      37              : class GlobalObject;
      38              : class Module;
      39              : 
      40              : namespace Intrinsic {
      41              : typedef unsigned ID;
      42              : } // end namespace Intrinsic
      43              : 
      44              : // Choose ';' as the delimiter. ':' was used once but it doesn't work well for
      45              : // Objective-C functions which commonly have :'s in their names.
      46              : inline constexpr char GlobalIdentifierDelimiter = ';';
      47              : 
      48              : class GlobalValue : public Constant {
      49              : public:
      50              :   /// An enumeration for the kinds of linkage for global values.
      51              :   enum LinkageTypes {
      52              :     ExternalLinkage = 0,///< Externally visible function
      53              :     AvailableExternallyLinkage, ///< Available for inspection, not emission.
      54              :     LinkOnceAnyLinkage, ///< Keep one copy of function when linking (inline)
      55              :     LinkOnceODRLinkage, ///< Same, but only replaced by something equivalent.
      56              :     WeakAnyLinkage,     ///< Keep one copy of named function when linking (weak)
      57              :     WeakODRLinkage,     ///< Same, but only replaced by something equivalent.
      58              :     AppendingLinkage,   ///< Special purpose, only applies to global arrays
      59              :     InternalLinkage,    ///< Rename collisions when linking (static functions).
      60              :     PrivateLinkage,     ///< Like Internal, but omit from symbol table.
      61              :     ExternalWeakLinkage,///< ExternalWeak linkage description.
      62              :     CommonLinkage       ///< Tentative definitions.
      63              :   };
      64              : 
      65              :   /// An enumeration for the kinds of visibility of global values.
      66              :   enum VisibilityTypes {
      67              :     DefaultVisibility = 0,  ///< The GV is visible
      68              :     HiddenVisibility,       ///< The GV is hidden
      69              :     ProtectedVisibility     ///< The GV is protected
      70              :   };
      71              : 
      72              :   /// Storage classes of global values for PE targets.
      73              :   enum DLLStorageClassTypes {
      74              :     DefaultStorageClass   = 0,
      75              :     DLLImportStorageClass = 1, ///< Function to be imported from DLL
      76              :     DLLExportStorageClass = 2  ///< Function to be accessible from DLL.
      77              :   };
      78              : 
      79              : protected:
      80              :   GlobalValue(Type *Ty, ValueTy VTy, Use *Ops, unsigned NumOps,
      81              :               LinkageTypes Linkage, const Twine &Name, unsigned AddressSpace)
      82              :       : Constant(PointerType::get(Ty, AddressSpace), VTy, Ops, NumOps),
      83              :         ValueType(Ty), Visibility(DefaultVisibility),
      84              :         UnnamedAddrVal(unsigned(UnnamedAddr::None)),
      85              :         DllStorageClass(DefaultStorageClass), ThreadLocal(NotThreadLocal),
      86              :         HasLLVMReservedName(false), IsDSOLocal(false), HasPartition(false),
      87              :         HasSanitizerMetadata(false) {
      88              :     setLinkage(Linkage);
      89              :     setName(Name);
      90              :   }
      91              : 
      92              :   Type *ValueType;
      93              : 
      94              :   static const unsigned GlobalValueSubClassDataBits = 15;
      95              : 
      96              :   // All bitfields use unsigned as the underlying type so that MSVC will pack
      97              :   // them.
      98              :   unsigned Linkage : 4;       // The linkage of this global
      99              :   unsigned Visibility : 2;    // The visibility style of this global
     100              :   unsigned UnnamedAddrVal : 2; // This value's address is not significant
     101              :   unsigned DllStorageClass : 2; // DLL storage class
     102              : 
     103              :   unsigned ThreadLocal : 3; // Is this symbol "Thread Local", if so, what is
     104              :                             // the desired model?
     105              : 
     106              :   /// True if the function's name starts with "llvm.".  This corresponds to the
     107              :   /// value of Function::isIntrinsic(), which may be true even if
     108              :   /// Function::intrinsicID() returns Intrinsic::not_intrinsic.
     109              :   unsigned HasLLVMReservedName : 1;
     110              : 
     111              :   /// If true then there is a definition within the same linkage unit and that
     112              :   /// definition cannot be runtime preempted.
     113              :   unsigned IsDSOLocal : 1;
     114              : 
     115              :   /// True if this symbol has a partition name assigned (see
     116              :   /// https://lld.llvm.org/Partitions.html).
     117              :   unsigned HasPartition : 1;
     118              : 
     119              :   /// True if this symbol has sanitizer metadata available. Should only happen
     120              :   /// if sanitizers were enabled when building the translation unit which
     121              :   /// contains this GV.
     122              :   unsigned HasSanitizerMetadata : 1;
     123              : 
     124              : private:
     125              :   // Give subclasses access to what otherwise would be wasted padding.
     126              :   // (15 + 4 + 2 + 2 + 2 + 3 + 1 + 1 + 1 + 1) == 32.
     127              :   unsigned SubClassData : GlobalValueSubClassDataBits;
     128              : 
     129              :   friend class Constant;
     130              : 
     131              :   void destroyConstantImpl();
     132              :   Value *handleOperandChangeImpl(Value *From, Value *To);
     133              : 
     134              :   /// Returns true if the definition of this global may be replaced by a
     135              :   /// differently optimized variant of the same source level function at link
     136              :   /// time.
     137              :   bool mayBeDerefined() const {
     138              :     switch (getLinkage()) {
     139              :     case WeakODRLinkage:
     140              :     case LinkOnceODRLinkage:
     141              :     case AvailableExternallyLinkage:
     142              :       return true;
     143              : 
     144              :     case WeakAnyLinkage:
     145              :     case LinkOnceAnyLinkage:
     146              :     case CommonLinkage:
     147              :     case ExternalWeakLinkage:
     148              :     case ExternalLinkage:
     149              :     case AppendingLinkage:
     150              :     case InternalLinkage:
     151              :     case PrivateLinkage:
     152              :       // Optimizations may assume builtin semantics for functions defined as
     153              :       // nobuiltin due to attributes at call-sites. To avoid applying IPO based
     154              :       // on nobuiltin semantics, treat such function definitions as maybe
     155              :       // derefined.
     156              :       return isInterposable() || isNobuiltinFnDef();
     157              :     }
     158              : 
     159              :     llvm_unreachable("Fully covered switch above!");
     160              :   }
     161              : 
     162              :   /// Returns true if the global is a function definition with the nobuiltin
     163              :   /// attribute.
     164              :   bool isNobuiltinFnDef() const;
     165              : 
     166              : protected:
     167              :   /// The intrinsic ID for this subclass (which must be a Function).
     168              :   ///
     169              :   /// This member is defined by this class, but not used for anything.
     170              :   /// Subclasses can use it to store their intrinsic ID, if they have one.
     171              :   ///
     172              :   /// This is stored here to save space in Function on 64-bit hosts.
     173              :   Intrinsic::ID IntID = (Intrinsic::ID)0U;
     174              : 
     175              :   unsigned getGlobalValueSubClassData() const {
     176              :     return SubClassData;
     177              :   }
     178              :   void setGlobalValueSubClassData(unsigned V) {
     179              :     assert(V < (1 << GlobalValueSubClassDataBits) && "It will not fit");
     180              :     SubClassData = V;
     181              :   }
     182              : 
     183              :   Module *Parent = nullptr; // The containing module.
     184              : 
     185              :   // Used by SymbolTableListTraits.
     186              :   void setParent(Module *parent) {
     187              :     Parent = parent;
     188              :   }
     189              : 
     190              :   ~GlobalValue() {
     191              :     removeDeadConstantUsers();   // remove any dead constants using this.
     192              :   }
     193              : 
     194              : public:
     195              :   enum ThreadLocalMode {
     196              :     NotThreadLocal = 0,
     197              :     GeneralDynamicTLSModel,
     198              :     LocalDynamicTLSModel,
     199              :     InitialExecTLSModel,
     200              :     LocalExecTLSModel
     201              :   };
     202              : 
     203              :   GlobalValue(const GlobalValue &) = delete;
     204              : 
     205              :   unsigned getAddressSpace() const {
     206              :     return getType()->getAddressSpace();
     207              :   }
     208              : 
     209              :   enum class UnnamedAddr {
     210              :     None,
     211              :     Local,
     212              :     Global,
     213              :   };
     214              : 
     215              :   bool hasGlobalUnnamedAddr() const {
     216              :     return getUnnamedAddr() == UnnamedAddr::Global;
     217              :   }
     218              : 
     219              :   /// Returns true if this value's address is not significant in this module.
     220              :   /// This attribute is intended to be used only by the code generator and LTO
     221              :   /// to allow the linker to decide whether the global needs to be in the symbol
     222              :   /// table. It should probably not be used in optimizations, as the value may
     223              :   /// have uses outside the module; use hasGlobalUnnamedAddr() instead.
     224              :   bool hasAtLeastLocalUnnamedAddr() const {
     225              :     return getUnnamedAddr() != UnnamedAddr::None;
     226              :   }
     227              : 
     228              :   UnnamedAddr getUnnamedAddr() const {
     229              :     return UnnamedAddr(UnnamedAddrVal);
     230              :   }
     231              :   void setUnnamedAddr(UnnamedAddr Val) { UnnamedAddrVal = unsigned(Val); }
     232              : 
     233              :   static UnnamedAddr getMinUnnamedAddr(UnnamedAddr A, UnnamedAddr B) {
     234              :     if (A == UnnamedAddr::None || B == UnnamedAddr::None)
     235              :       return UnnamedAddr::None;
     236              :     if (A == UnnamedAddr::Local || B == UnnamedAddr::Local)
     237              :       return UnnamedAddr::Local;
     238              :     return UnnamedAddr::Global;
     239              :   }
     240              : 
     241              :   bool hasComdat() const { return getComdat() != nullptr; }
     242              :   const Comdat *getComdat() const;
     243              :   Comdat *getComdat() {
     244              :     return const_cast<Comdat *>(
     245              :                            static_cast<const GlobalValue *>(this)->getComdat());
     246              :   }
     247              : 
     248              :   VisibilityTypes getVisibility() const { return VisibilityTypes(Visibility); }
     249         1579 :   bool hasDefaultVisibility() const { return Visibility == DefaultVisibility; }
     250              :   bool hasHiddenVisibility() const { return Visibility == HiddenVisibility; }
     251              :   bool hasProtectedVisibility() const {
     252              :     return Visibility == ProtectedVisibility;
     253              :   }
     254              :   void setVisibility(VisibilityTypes V) {
     255              :     assert((!hasLocalLinkage() || V == DefaultVisibility) &&
     256              :            "local linkage requires default visibility");
     257              :     Visibility = V;
     258              :     if (isImplicitDSOLocal())
     259              :       setDSOLocal(true);
     260              :   }
     261              : 
     262              :   /// If the value is "Thread Local", its value isn't shared by the threads.
     263        14690 :   bool isThreadLocal() const { return getThreadLocalMode() != NotThreadLocal; }
     264              :   void setThreadLocal(bool Val) {
     265              :     setThreadLocalMode(Val ? GeneralDynamicTLSModel : NotThreadLocal);
     266              :   }
     267              :   void setThreadLocalMode(ThreadLocalMode Val) {
     268              :     assert(Val == NotThreadLocal || getValueID() != Value::FunctionVal);
     269              :     ThreadLocal = Val;
     270              :   }
     271        14690 :   ThreadLocalMode getThreadLocalMode() const {
     272        14690 :     return static_cast<ThreadLocalMode>(ThreadLocal);
     273              :   }
     274              : 
     275              :   DLLStorageClassTypes getDLLStorageClass() const {
     276              :     return DLLStorageClassTypes(DllStorageClass);
     277              :   }
     278              :   bool hasDLLImportStorageClass() const {
     279              :     return DllStorageClass == DLLImportStorageClass;
     280              :   }
     281              :   bool hasDLLExportStorageClass() const {
     282              :     return DllStorageClass == DLLExportStorageClass;
     283              :   }
     284              :   void setDLLStorageClass(DLLStorageClassTypes C) {
     285              :     assert((!hasLocalLinkage() || C == DefaultStorageClass) &&
     286              :            "local linkage requires DefaultStorageClass");
     287              :     DllStorageClass = C;
     288              :   }
     289              : 
     290              :   bool hasSection() const { return !getSection().empty(); }
     291              :   StringRef getSection() const;
     292              : 
     293              :   /// Global values are always pointers.
     294              :   PointerType *getType() const { return cast<PointerType>(User::getType()); }
     295              : 
     296        89812 :   Type *getValueType() const { return ValueType; }
     297              : 
     298         1579 :   bool isImplicitDSOLocal() const {
     299         3158 :     return hasLocalLinkage() ||
     300         3158 :            (!hasDefaultVisibility() && !hasExternalWeakLinkage());
     301              :   }
     302              : 
     303            0 :   void setDSOLocal(bool Local) { IsDSOLocal = Local; }
     304              : 
     305              :   bool isDSOLocal() const {
     306              :     return IsDSOLocal;
     307              :   }
     308              : 
     309              :   bool hasPartition() const {
     310              :     return HasPartition;
     311              :   }
     312              :   StringRef getPartition() const;
     313              :   void setPartition(StringRef Part);
     314              : 
     315              :   // ASan, HWASan and Memtag sanitizers have some instrumentation that applies
     316              :   // specifically to global variables.
     317              :   struct SanitizerMetadata {
     318              :     SanitizerMetadata()
     319              :         : NoAddress(false), NoHWAddress(false),
     320              :           Memtag(false), IsDynInit(false) {}
     321              :     // For ASan and HWASan, this instrumentation is implicitly applied to all
     322              :     // global variables when built with -fsanitize=*. What we need is a way to
     323              :     // persist the information that a certain global variable should *not* have
     324              :     // sanitizers applied, which occurs if:
     325              :     //   1. The global variable is in the sanitizer ignore list, or
     326              :     //   2. The global variable is created by the sanitizers itself for internal
     327              :     //      usage, or
     328              :     //   3. The global variable has __attribute__((no_sanitize("..."))) or
     329              :     //      __attribute__((disable_sanitizer_instrumentation)).
     330              :     //
     331              :     // This is important, a some IR passes like GlobalMerge can delete global
     332              :     // variables and replace them with new ones. If the old variables were
     333              :     // marked to be unsanitized, then the new ones should also be.
     334              :     unsigned NoAddress : 1;
     335              :     unsigned NoHWAddress : 1;
     336              : 
     337              :     // Memtag sanitization works differently: sanitization is requested by clang
     338              :     // when `-fsanitize=memtag-globals` is provided, and the request can be
     339              :     // denied (and the attribute removed) by the AArch64 global tagging pass if
     340              :     // it can't be fulfilled (e.g. the global variable is a TLS variable).
     341              :     // Memtag sanitization has to interact with other parts of LLVM (like
     342              :     // supressing certain optimisations, emitting assembly directives, or
     343              :     // creating special relocation sections).
     344              :     //
     345              :     // Use `GlobalValue::isTagged()` to check whether tagging should be enabled
     346              :     // for a global variable.
     347              :     unsigned Memtag : 1;
     348              : 
     349              :     // ASan-specific metadata. Is this global variable dynamically initialized
     350              :     // (from a C++ language perspective), and should therefore be checked for
     351              :     // ODR violations.
     352              :     unsigned IsDynInit : 1;
     353              :   };
     354              : 
     355              :   bool hasSanitizerMetadata() const { return HasSanitizerMetadata; }
     356              :   const SanitizerMetadata &getSanitizerMetadata() const;
     357              :   // Note: Not byref as it's a POD and otherwise it's too easy to call
     358              :   // G.setSanitizerMetadata(G2.getSanitizerMetadata()), and the argument becomes
     359              :   // dangling when the backing storage allocates the metadata for `G`, as the
     360              :   // storage is shared between `G1` and `G2`.
     361              :   void setSanitizerMetadata(SanitizerMetadata Meta);
     362              :   void removeSanitizerMetadata();
     363              :   void setNoSanitizeMetadata();
     364              : 
     365              :   bool isTagged() const {
     366              :     return hasSanitizerMetadata() && getSanitizerMetadata().Memtag;
     367              :   }
     368              : 
     369              :   static LinkageTypes getLinkOnceLinkage(bool ODR) {
     370              :     return ODR ? LinkOnceODRLinkage : LinkOnceAnyLinkage;
     371              :   }
     372              :   static LinkageTypes getWeakLinkage(bool ODR) {
     373              :     return ODR ? WeakODRLinkage : WeakAnyLinkage;
     374              :   }
     375              : 
     376        26680 :   static bool isExternalLinkage(LinkageTypes Linkage) {
     377        26680 :     return Linkage == ExternalLinkage;
     378              :   }
     379        18619 :   static bool isAvailableExternallyLinkage(LinkageTypes Linkage) {
     380        18619 :     return Linkage == AvailableExternallyLinkage;
     381              :   }
     382              :   static bool isLinkOnceAnyLinkage(LinkageTypes Linkage) {
     383              :     return Linkage == LinkOnceAnyLinkage;
     384              :   }
     385              :   static bool isLinkOnceODRLinkage(LinkageTypes Linkage) {
     386              :     return Linkage == LinkOnceODRLinkage;
     387              :   }
     388              :   static bool isLinkOnceLinkage(LinkageTypes Linkage) {
     389              :     return isLinkOnceAnyLinkage(Linkage) || isLinkOnceODRLinkage(Linkage);
     390              :   }
     391              :   static bool isWeakAnyLinkage(LinkageTypes Linkage) {
     392              :     return Linkage == WeakAnyLinkage;
     393              :   }
     394              :   static bool isWeakODRLinkage(LinkageTypes Linkage) {
     395              :     return Linkage == WeakODRLinkage;
     396              :   }
     397              :   static bool isWeakLinkage(LinkageTypes Linkage) {
     398              :     return isWeakAnyLinkage(Linkage) || isWeakODRLinkage(Linkage);
     399              :   }
     400              :   static bool isAppendingLinkage(LinkageTypes Linkage) {
     401              :     return Linkage == AppendingLinkage;
     402              :   }
     403         3158 :   static bool isInternalLinkage(LinkageTypes Linkage) {
     404         3158 :     return Linkage == InternalLinkage;
     405              :   }
     406         3158 :   static bool isPrivateLinkage(LinkageTypes Linkage) {
     407         3158 :     return Linkage == PrivateLinkage;
     408              :   }
     409         3158 :   static bool isLocalLinkage(LinkageTypes Linkage) {
     410         3158 :     return isInternalLinkage(Linkage) || isPrivateLinkage(Linkage);
     411              :   }
     412            0 :   static bool isExternalWeakLinkage(LinkageTypes Linkage) {
     413            0 :     return Linkage == ExternalWeakLinkage;
     414              :   }
     415              :   static bool isCommonLinkage(LinkageTypes Linkage) {
     416              :     return Linkage == CommonLinkage;
     417              :   }
     418              :   static bool isValidDeclarationLinkage(LinkageTypes Linkage) {
     419              :     return isExternalWeakLinkage(Linkage) || isExternalLinkage(Linkage);
     420              :   }
     421              : 
     422              :   /// Whether the definition of this global may be replaced by something
     423              :   /// non-equivalent at link time. For example, if a function has weak linkage
     424              :   /// then the code defining it may be replaced by different code.
     425              :   static bool isInterposableLinkage(LinkageTypes Linkage) {
     426              :     switch (Linkage) {
     427              :     case WeakAnyLinkage:
     428              :     case LinkOnceAnyLinkage:
     429              :     case CommonLinkage:
     430              :     case ExternalWeakLinkage:
     431              :       return true;
     432              : 
     433              :     case AvailableExternallyLinkage:
     434              :     case LinkOnceODRLinkage:
     435              :     case WeakODRLinkage:
     436              :     // The above three cannot be overridden but can be de-refined.
     437              : 
     438              :     case ExternalLinkage:
     439              :     case AppendingLinkage:
     440              :     case InternalLinkage:
     441              :     case PrivateLinkage:
     442              :       return false;
     443              :     }
     444              :     llvm_unreachable("Fully covered switch above!");
     445              :   }
     446              : 
     447              :   /// Whether the definition of this global may be discarded if it is not used
     448              :   /// in its compilation unit.
     449              :   static bool isDiscardableIfUnused(LinkageTypes Linkage) {
     450              :     return isLinkOnceLinkage(Linkage) || isLocalLinkage(Linkage) ||
     451              :            isAvailableExternallyLinkage(Linkage);
     452              :   }
     453              : 
     454              :   /// Whether the definition of this global may be replaced at link time.  NB:
     455              :   /// Using this method outside of the code generators is almost always a
     456              :   /// mistake: when working at the IR level use isInterposable instead as it
     457              :   /// knows about ODR semantics.
     458              :   static bool isWeakForLinker(LinkageTypes Linkage)  {
     459              :     return Linkage == WeakAnyLinkage || Linkage == WeakODRLinkage ||
     460              :            Linkage == LinkOnceAnyLinkage || Linkage == LinkOnceODRLinkage ||
     461              :            Linkage == CommonLinkage || Linkage == ExternalWeakLinkage;
     462              :   }
     463              : 
     464              :   /// Return true if the currently visible definition of this global (if any) is
     465              :   /// exactly the definition we will see at runtime.
     466              :   ///
     467              :   /// Non-exact linkage types inhibits most non-inlining IPO, since a
     468              :   /// differently optimized variant of the same function can have different
     469              :   /// observable or undefined behavior than in the variant currently visible.
     470              :   /// For instance, we could have started with
     471              :   ///
     472              :   ///   void foo(int *v) {
     473              :   ///     int t = 5 / v[0];
     474              :   ///     (void) t;
     475              :   ///   }
     476              :   ///
     477              :   /// and "refined" it to
     478              :   ///
     479              :   ///   void foo(int *v) { }
     480              :   ///
     481              :   /// However, we cannot infer readnone for `foo`, since that would justify
     482              :   /// DSE'ing a store to `v[0]` across a call to `foo`, which can cause
     483              :   /// undefined behavior if the linker replaces the actual call destination with
     484              :   /// the unoptimized `foo`.
     485              :   ///
     486              :   /// Inlining is okay across non-exact linkage types as long as they're not
     487              :   /// interposable (see \c isInterposable), since in such cases the currently
     488              :   /// visible variant is *a* correct implementation of the original source
     489              :   /// function; it just isn't the *only* correct implementation.
     490              :   bool isDefinitionExact() const {
     491              :     return !mayBeDerefined();
     492              :   }
     493              : 
     494              :   /// Return true if this global has an exact defintion.
     495              :   bool hasExactDefinition() const {
     496              :     // While this computes exactly the same thing as
     497              :     // isStrongDefinitionForLinker, the intended uses are different.  This
     498              :     // function is intended to help decide if specific inter-procedural
     499              :     // transforms are correct, while isStrongDefinitionForLinker's intended use
     500              :     // is in low level code generation.
     501              :     return !isDeclaration() && isDefinitionExact();
     502              :   }
     503              : 
     504              :   /// Return true if this global's definition can be substituted with an
     505              :   /// *arbitrary* definition at link time or load time. We cannot do any IPO or
     506              :   /// inlining across interposable call edges, since the callee can be
     507              :   /// replaced with something arbitrary.
     508              :   bool isInterposable() const;
     509              :   bool canBenefitFromLocalAlias() const;
     510              : 
     511        26680 :   bool hasExternalLinkage() const { return isExternalLinkage(getLinkage()); }
     512        18619 :   bool hasAvailableExternallyLinkage() const {
     513        18619 :     return isAvailableExternallyLinkage(getLinkage());
     514              :   }
     515              :   bool hasLinkOnceLinkage() const { return isLinkOnceLinkage(getLinkage()); }
     516              :   bool hasLinkOnceAnyLinkage() const {
     517              :     return isLinkOnceAnyLinkage(getLinkage());
     518              :   }
     519              :   bool hasLinkOnceODRLinkage() const {
     520              :     return isLinkOnceODRLinkage(getLinkage());
     521              :   }
     522              :   bool hasWeakLinkage() const { return isWeakLinkage(getLinkage()); }
     523              :   bool hasWeakAnyLinkage() const { return isWeakAnyLinkage(getLinkage()); }
     524              :   bool hasWeakODRLinkage() const { return isWeakODRLinkage(getLinkage()); }
     525              :   bool hasAppendingLinkage() const { return isAppendingLinkage(getLinkage()); }
     526              :   bool hasInternalLinkage() const { return isInternalLinkage(getLinkage()); }
     527              :   bool hasPrivateLinkage() const { return isPrivateLinkage(getLinkage()); }
     528         1579 :   bool hasLocalLinkage() const { return isLocalLinkage(getLinkage()); }
     529            0 :   bool hasExternalWeakLinkage() const {
     530            0 :     return isExternalWeakLinkage(getLinkage());
     531              :   }
     532              :   bool hasCommonLinkage() const { return isCommonLinkage(getLinkage()); }
     533              :   bool hasValidDeclarationLinkage() const {
     534              :     return isValidDeclarationLinkage(getLinkage());
     535              :   }
     536              : 
     537         1579 :   void setLinkage(LinkageTypes LT) {
     538         1579 :     if (isLocalLinkage(LT)) {
     539            0 :       Visibility = DefaultVisibility;
     540            0 :       DllStorageClass = DefaultStorageClass;
     541              :     }
     542         1579 :     Linkage = LT;
     543         1579 :     if (isImplicitDSOLocal())
     544            0 :       setDSOLocal(true);
     545         1579 :   }
     546        46878 :   LinkageTypes getLinkage() const { return LinkageTypes(Linkage); }
     547              : 
     548              :   bool isDiscardableIfUnused() const {
     549              :     return isDiscardableIfUnused(getLinkage());
     550              :   }
     551              : 
     552              :   bool isWeakForLinker() const { return isWeakForLinker(getLinkage()); }
     553              : 
     554              : protected:
     555              :   /// Copy all additional attributes (those not needed to create a GlobalValue)
     556              :   /// from the GlobalValue Src to this one.
     557              :   void copyAttributesFrom(const GlobalValue *Src);
     558              : 
     559              : public:
     560              :   /// If the given string begins with the GlobalValue name mangling escape
     561              :   /// character '\1', drop it.
     562              :   ///
     563              :   /// This function applies a specific mangling that is used in PGO profiles,
     564              :   /// among other things. If you're trying to get a symbol name for an
     565              :   /// arbitrary GlobalValue, this is not the function you're looking for; see
     566              :   /// Mangler.h.
     567              :   static StringRef dropLLVMManglingEscape(StringRef Name) {
     568              :     Name.consume_front("\1");
     569              :     return Name;
     570              :   }
     571              : 
     572              :   /// Return the modified name for a global value suitable to be
     573              :   /// used as the key for a global lookup (e.g. profile or ThinLTO).
     574              :   /// The value's original name is \c Name and has linkage of type
     575              :   /// \c Linkage. The value is defined in module \c FileName.
     576              :   static std::string getGlobalIdentifier(StringRef Name,
     577              :                                          GlobalValue::LinkageTypes Linkage,
     578              :                                          StringRef FileName);
     579              : 
     580              :   /// Return the modified name for this global value suitable to be
     581              :   /// used as the key for a global lookup (e.g. profile or ThinLTO).
     582              :   std::string getGlobalIdentifier() const;
     583              : 
     584              :   /// Declare a type to represent a global unique identifier for a global value.
     585              :   /// This is a 64 bits hash that is used by PGO and ThinLTO to have a compact
     586              :   /// unique way to identify a symbol.
     587              :   using GUID = uint64_t;
     588              : 
     589              :   /// Return a 64-bit global unique ID constructed from global value name
     590              :   /// (i.e. returned by getGlobalIdentifier()).
     591              :   static GUID getGUID(StringRef GlobalName);
     592              : 
     593              :   /// Return a 64-bit global unique ID constructed from global value name
     594              :   /// (i.e. returned by getGlobalIdentifier()).
     595              :   GUID getGUID() const { return getGUID(getGlobalIdentifier()); }
     596              : 
     597              :   /// @name Materialization
     598              :   /// Materialization is used to construct functions only as they're needed.
     599              :   /// This
     600              :   /// is useful to reduce memory usage in LLVM or parsing work done by the
     601              :   /// BitcodeReader to load the Module.
     602              :   /// @{
     603              : 
     604              :   /// If this function's Module is being lazily streamed in functions from disk
     605              :   /// or some other source, this method can be used to check to see if the
     606              :   /// function has been read in yet or not.
     607              :   bool isMaterializable() const;
     608              : 
     609              :   /// Make sure this GlobalValue is fully read.
     610              :   Error materialize();
     611              : 
     612              : /// @}
     613              : 
     614              :   /// Return true if the primary definition of this global value is outside of
     615              :   /// the current translation unit.
     616              :   bool isDeclaration() const;
     617              : 
     618              :   bool isDeclarationForLinker() const {
     619              :     if (hasAvailableExternallyLinkage())
     620              :       return true;
     621              : 
     622              :     return isDeclaration();
     623              :   }
     624              : 
     625              :   /// Returns true if this global's definition will be the one chosen by the
     626              :   /// linker.
     627              :   ///
     628              :   /// NB! Ideally this should not be used at the IR level at all.  If you're
     629              :   /// interested in optimization constraints implied by the linker's ability to
     630              :   /// choose an implementation, prefer using \c hasExactDefinition.
     631              :   bool isStrongDefinitionForLinker() const {
     632              :     return !(isDeclarationForLinker() || isWeakForLinker());
     633              :   }
     634              : 
     635              :   const GlobalObject *getAliaseeObject() const;
     636              :   GlobalObject *getAliaseeObject() {
     637              :     return const_cast<GlobalObject *>(
     638              :         static_cast<const GlobalValue *>(this)->getAliaseeObject());
     639              :   }
     640              : 
     641              :   /// Returns whether this is a reference to an absolute symbol.
     642              :   bool isAbsoluteSymbolRef() const;
     643              : 
     644              :   /// If this is an absolute symbol reference, returns the range of the symbol,
     645              :   /// otherwise returns std::nullopt.
     646              :   std::optional<ConstantRange> getAbsoluteSymbolRange() const;
     647              : 
     648              :   /// This method unlinks 'this' from the containing module, but does not delete
     649              :   /// it.
     650              :   void removeFromParent();
     651              : 
     652              :   /// This method unlinks 'this' from the containing module and deletes it.
     653              :   void eraseFromParent();
     654              : 
     655              :   /// Get the module that this global value is contained inside of...
     656              :   Module *getParent() { return Parent; }
     657              :   const Module *getParent() const { return Parent; }
     658              : 
     659              :   /// Get the data layout of the module this global belongs to.
     660              :   ///
     661              :   /// Requires the global to have a parent module.
     662              :   const DataLayout &getDataLayout() const;
     663              : 
     664              :   // Methods for support type inquiry through isa, cast, and dyn_cast:
     665              :   static bool classof(const Value *V) {
     666              :     return V->getValueID() == Value::FunctionVal ||
     667              :            V->getValueID() == Value::GlobalVariableVal ||
     668              :            V->getValueID() == Value::GlobalAliasVal ||
     669              :            V->getValueID() == Value::GlobalIFuncVal;
     670              :   }
     671              : 
     672              :   /// True if GV can be left out of the object symbol table. This is the case
     673              :   /// for linkonce_odr values whose address is not significant. While legal, it
     674              :   /// is not normally profitable to omit them from the .o symbol table. Using
     675              :   /// this analysis makes sense when the information can be passed down to the
     676              :   /// linker or we are in LTO.
     677              :   bool canBeOmittedFromSymbolTable() const;
     678              : };
     679              : 
     680              : } // end namespace llvm
     681              : 
     682              : #endif // LLVM_IR_GLOBALVALUE_H
        

Generated by: LCOV version 2.0-1