LCOV - code coverage report
Current view: top level - /usr/lib/llvm-19/include/llvm/IR - GlobalValue.h (source / functions) Coverage Total Hit
Test: PostgreSQL 20devel Lines: 0.0 % 36 0
Test Date: 2026-07-03 19:57:34 Functions: 0.0 % 18 0
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 0.0 % 14 0

             Branch data     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                 :           0 :   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                 :           0 :   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                 :           0 :   ThreadLocalMode getThreadLocalMode() const {
     272                 :           0 :     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                 :           0 :   Type *getValueType() const { return ValueType; }
     297                 :             : 
     298                 :           0 :   bool isImplicitDSOLocal() const {
     299         [ #  # ]:           0 :     return hasLocalLinkage() ||
     300   [ #  #  #  # ]:           0 :            (!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                 :           0 :   static bool isExternalLinkage(LinkageTypes Linkage) {
     377                 :           0 :     return Linkage == ExternalLinkage;
     378                 :             :   }
     379                 :           0 :   static bool isAvailableExternallyLinkage(LinkageTypes Linkage) {
     380                 :           0 :     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                 :           0 :   static bool isInternalLinkage(LinkageTypes Linkage) {
     404                 :           0 :     return Linkage == InternalLinkage;
     405                 :             :   }
     406                 :           0 :   static bool isPrivateLinkage(LinkageTypes Linkage) {
     407                 :           0 :     return Linkage == PrivateLinkage;
     408                 :             :   }
     409                 :           0 :   static bool isLocalLinkage(LinkageTypes Linkage) {
     410   [ #  #  #  # ]:           0 :     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                 :           0 :   bool hasExternalLinkage() const { return isExternalLinkage(getLinkage()); }
     512                 :           0 :   bool hasAvailableExternallyLinkage() const {
     513                 :           0 :     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                 :           0 :   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                 :           0 :   void setLinkage(LinkageTypes LT) {
     538         [ #  # ]:           0 :     if (isLocalLinkage(LT)) {
     539                 :           0 :       Visibility = DefaultVisibility;
     540                 :           0 :       DllStorageClass = DefaultStorageClass;
     541                 :             :     }
     542                 :           0 :     Linkage = LT;
     543         [ #  # ]:           0 :     if (isImplicitDSOLocal())
     544                 :           0 :       setDSOLocal(true);
     545                 :           0 :   }
     546                 :           0 :   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