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