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: GlobalValue(Type * Ty,ValueTy VTy,Use * Ops,unsigned NumOps,LinkageTypes Linkage,const Twine & Name,unsigned AddressSpace)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. mayBeDerefined()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 maybeSetDsoLocal()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 getGlobalValueSubClassData()161 unsigned getGlobalValueSubClassData() const { 162 return SubClassData; 163 } setGlobalValueSubClassData(unsigned V)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. setParent(Module * parent)172 void setParent(Module *parent) { 173 Parent = parent; 174 } 175 ~GlobalValue()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 hasGlobalUnnamedAddr()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. hasAtLeastLocalUnnamedAddr()209 bool hasAtLeastLocalUnnamedAddr() const { 210 return getUnnamedAddr() != UnnamedAddr::None; 211 } 212 getUnnamedAddr()213 UnnamedAddr getUnnamedAddr() const { 214 return UnnamedAddr(UnnamedAddrVal); 215 } setUnnamedAddr(UnnamedAddr Val)216 void setUnnamedAddr(UnnamedAddr Val) { UnnamedAddrVal = unsigned(Val); } 217 getMinUnnamedAddr(UnnamedAddr A,UnnamedAddr B)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 hasComdat()226 bool hasComdat() const { return getComdat() != nullptr; } 227 const Comdat *getComdat() const; getComdat()228 Comdat *getComdat() { 229 return const_cast<Comdat *>( 230 static_cast<const GlobalValue *>(this)->getComdat()); 231 } 232 getVisibility()233 VisibilityTypes getVisibility() const { return VisibilityTypes(Visibility); } hasDefaultVisibility()234 bool hasDefaultVisibility() const { return Visibility == DefaultVisibility; } hasHiddenVisibility()235 bool hasHiddenVisibility() const { return Visibility == HiddenVisibility; } hasProtectedVisibility()236 bool hasProtectedVisibility() const { 237 return Visibility == ProtectedVisibility; 238 } setVisibility(VisibilityTypes V)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. isThreadLocal()247 bool isThreadLocal() const { return getThreadLocalMode() != NotThreadLocal; } setThreadLocal(bool Val)248 void setThreadLocal(bool Val) { 249 setThreadLocalMode(Val ? GeneralDynamicTLSModel : NotThreadLocal); 250 } setThreadLocalMode(ThreadLocalMode Val)251 void setThreadLocalMode(ThreadLocalMode Val) { 252 assert(Val == NotThreadLocal || getValueID() != Value::FunctionVal); 253 ThreadLocal = Val; 254 } getThreadLocalMode()255 ThreadLocalMode getThreadLocalMode() const { 256 return static_cast<ThreadLocalMode>(ThreadLocal); 257 } 258 getDLLStorageClass()259 DLLStorageClassTypes getDLLStorageClass() const { 260 return DLLStorageClassTypes(DllStorageClass); 261 } hasDLLImportStorageClass()262 bool hasDLLImportStorageClass() const { 263 return DllStorageClass == DLLImportStorageClass; 264 } hasDLLExportStorageClass()265 bool hasDLLExportStorageClass() const { 266 return DllStorageClass == DLLExportStorageClass; 267 } setDLLStorageClass(DLLStorageClassTypes C)268 void setDLLStorageClass(DLLStorageClassTypes C) { DllStorageClass = C; } 269 hasSection()270 bool hasSection() const { return !getSection().empty(); } 271 StringRef getSection() const; 272 273 /// Global values are always pointers. getType()274 PointerType *getType() const { return cast<PointerType>(User::getType()); } 275 getValueType()276 Type *getValueType() const { return ValueType; } 277 setDSOLocal(bool Local)278 void setDSOLocal(bool Local) { IsDSOLocal = Local; } 279 isDSOLocal()280 bool isDSOLocal() const { 281 return IsDSOLocal; 282 } 283 getLinkOnceLinkage(bool ODR)284 static LinkageTypes getLinkOnceLinkage(bool ODR) { 285 return ODR ? LinkOnceODRLinkage : LinkOnceAnyLinkage; 286 } getWeakLinkage(bool ODR)287 static LinkageTypes getWeakLinkage(bool ODR) { 288 return ODR ? WeakODRLinkage : WeakAnyLinkage; 289 } 290 isExternalLinkage(LinkageTypes Linkage)291 static bool isExternalLinkage(LinkageTypes Linkage) { 292 return Linkage == ExternalLinkage; 293 } isAvailableExternallyLinkage(LinkageTypes Linkage)294 static bool isAvailableExternallyLinkage(LinkageTypes Linkage) { 295 return Linkage == AvailableExternallyLinkage; 296 } isLinkOnceODRLinkage(LinkageTypes Linkage)297 static bool isLinkOnceODRLinkage(LinkageTypes Linkage) { 298 return Linkage == LinkOnceODRLinkage; 299 } isLinkOnceLinkage(LinkageTypes Linkage)300 static bool isLinkOnceLinkage(LinkageTypes Linkage) { 301 return Linkage == LinkOnceAnyLinkage || Linkage == LinkOnceODRLinkage; 302 } isWeakAnyLinkage(LinkageTypes Linkage)303 static bool isWeakAnyLinkage(LinkageTypes Linkage) { 304 return Linkage == WeakAnyLinkage; 305 } isWeakODRLinkage(LinkageTypes Linkage)306 static bool isWeakODRLinkage(LinkageTypes Linkage) { 307 return Linkage == WeakODRLinkage; 308 } isWeakLinkage(LinkageTypes Linkage)309 static bool isWeakLinkage(LinkageTypes Linkage) { 310 return isWeakAnyLinkage(Linkage) || isWeakODRLinkage(Linkage); 311 } isAppendingLinkage(LinkageTypes Linkage)312 static bool isAppendingLinkage(LinkageTypes Linkage) { 313 return Linkage == AppendingLinkage; 314 } isInternalLinkage(LinkageTypes Linkage)315 static bool isInternalLinkage(LinkageTypes Linkage) { 316 return Linkage == InternalLinkage; 317 } isPrivateLinkage(LinkageTypes Linkage)318 static bool isPrivateLinkage(LinkageTypes Linkage) { 319 return Linkage == PrivateLinkage; 320 } isLocalLinkage(LinkageTypes Linkage)321 static bool isLocalLinkage(LinkageTypes Linkage) { 322 return isInternalLinkage(Linkage) || isPrivateLinkage(Linkage); 323 } isExternalWeakLinkage(LinkageTypes Linkage)324 static bool isExternalWeakLinkage(LinkageTypes Linkage) { 325 return Linkage == ExternalWeakLinkage; 326 } isCommonLinkage(LinkageTypes Linkage)327 static bool isCommonLinkage(LinkageTypes Linkage) { 328 return Linkage == CommonLinkage; 329 } isValidDeclarationLinkage(LinkageTypes Linkage)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. isInterposableLinkage(LinkageTypes Linkage)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. isDiscardableIfUnused(LinkageTypes Linkage)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. isWeakForLinker(LinkageTypes Linkage)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. isDefinitionExact()402 bool isDefinitionExact() const { 403 return !mayBeDerefined(); 404 } 405 406 /// Return true if this global has an exact defintion. hasExactDefinition()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. isInterposable()420 bool isInterposable() const { return isInterposableLinkage(getLinkage()); } 421 hasExternalLinkage()422 bool hasExternalLinkage() const { return isExternalLinkage(getLinkage()); } hasAvailableExternallyLinkage()423 bool hasAvailableExternallyLinkage() const { 424 return isAvailableExternallyLinkage(getLinkage()); 425 } hasLinkOnceLinkage()426 bool hasLinkOnceLinkage() const { return isLinkOnceLinkage(getLinkage()); } hasLinkOnceODRLinkage()427 bool hasLinkOnceODRLinkage() const { 428 return isLinkOnceODRLinkage(getLinkage()); 429 } hasWeakLinkage()430 bool hasWeakLinkage() const { return isWeakLinkage(getLinkage()); } hasWeakAnyLinkage()431 bool hasWeakAnyLinkage() const { return isWeakAnyLinkage(getLinkage()); } hasWeakODRLinkage()432 bool hasWeakODRLinkage() const { return isWeakODRLinkage(getLinkage()); } hasAppendingLinkage()433 bool hasAppendingLinkage() const { return isAppendingLinkage(getLinkage()); } hasInternalLinkage()434 bool hasInternalLinkage() const { return isInternalLinkage(getLinkage()); } hasPrivateLinkage()435 bool hasPrivateLinkage() const { return isPrivateLinkage(getLinkage()); } hasLocalLinkage()436 bool hasLocalLinkage() const { return isLocalLinkage(getLinkage()); } hasExternalWeakLinkage()437 bool hasExternalWeakLinkage() const { 438 return isExternalWeakLinkage(getLinkage()); 439 } hasCommonLinkage()440 bool hasCommonLinkage() const { return isCommonLinkage(getLinkage()); } hasValidDeclarationLinkage()441 bool hasValidDeclarationLinkage() const { 442 return isValidDeclarationLinkage(getLinkage()); 443 } 444 setLinkage(LinkageTypes LT)445 void setLinkage(LinkageTypes LT) { 446 if (isLocalLinkage(LT)) 447 Visibility = DefaultVisibility; 448 Linkage = LT; 449 maybeSetDsoLocal(); 450 } getLinkage()451 LinkageTypes getLinkage() const { return LinkageTypes(Linkage); } 452 isDiscardableIfUnused()453 bool isDiscardableIfUnused() const { 454 return isDiscardableIfUnused(getLinkage()); 455 } 456 isWeakForLinker()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. dropLLVMManglingEscape(StringRef Name)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()). getGUID(StringRef GlobalName)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()). getGUID()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 isDeclarationForLinker()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. isStrongDefinitionForLinker()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; getBaseObject()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... getParent()566 Module *getParent() { return Parent; } getParent()567 const Module *getParent() const { return Parent; } 568 569 // Methods for support type inquiry through isa, cast, and dyn_cast: classof(const Value * V)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