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