148486893f46d2e12e926682a3ecb908716bc66c4Chris Lattner//===-- llvm/GlobalValue.h - Class to represent a global value --*- C++ -*-===// 29769ab22265b313171d201b5928688524a01bd87Misha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 79769ab22265b313171d201b5928688524a01bd87Misha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner// 10ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner// This file is a common base class of all globally definable objects. As such, 11bd4e080a16b3baf0b6c463ad57adac0b5e0262dcAnton Korobeynikov// it is subclassed by GlobalVariable, GlobalAlias and by Function. This is 12bd4e080a16b3baf0b6c463ad57adac0b5e0262dcAnton Korobeynikov// used because you can do certain things with these global objects that you 13bd4e080a16b3baf0b6c463ad57adac0b5e0262dcAnton Korobeynikov// can't do to anything else. For example, use the address of one as a 14bd4e080a16b3baf0b6c463ad57adac0b5e0262dcAnton Korobeynikov// constant. 15ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner// 16ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner//===----------------------------------------------------------------------===// 17ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner 18ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner#ifndef LLVM_GLOBALVALUE_H 19ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner#define LLVM_GLOBALVALUE_H 20ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner 21118c091fd7b57cd0236c3b722e36a7a883b17b0aReid Spencer#include "llvm/Constant.h" 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattnerclass PointerType; 26785bfcca13409e061744baf1ed7ab9594060115bChris Lattnerclass Module; 27ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner 28118c091fd7b57cd0236c3b722e36a7a883b17b0aReid Spencerclass GlobalValue : public Constant { 29ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner GlobalValue(const GlobalValue &); // do not implement 304ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattnerpublic: 3113d0b528ee8d5e69fe721691966b7c18627f1600Reid Spencer /// @brief An enumeration for the kinds of linkage for global values. 324ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner enum LinkageTypes { 3318feb92e917a029b72a338e91b5b93f74d26f406Chris Lattner ExternalLinkage = 0,///< Externally visible function 34266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner AvailableExternallyLinkage, ///< Available for inspection, not emission. 35667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands LinkOnceAnyLinkage, ///< Keep one copy of function when linking (inline) 36667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands LinkOnceODRLinkage, ///< Same, but only replaced by something equivalent. 37667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands WeakAnyLinkage, ///< Keep one copy of named function when linking (weak) 38667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands WeakODRLinkage, ///< Same, but only replaced by something equivalent. 3913d0b528ee8d5e69fe721691966b7c18627f1600Reid Spencer AppendingLinkage, ///< Special purpose, only applies to global arrays 403d10a5a75794356a0a568ce283713adc3a963200Bill Wendling InternalLinkage, ///< Rename collisions when linking (static functions). 413d10a5a75794356a0a568ce283713adc3a963200Bill Wendling PrivateLinkage, ///< Like Internal, but omit from symbol table. 4207d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling LinkerPrivateLinkage, ///< Like Private, but linker removes. 435e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling LinkerPrivateWeakLinkage, ///< Like LinkerPrivate, but weak. 4455ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling LinkerPrivateWeakDefAutoLinkage, ///< Like LinkerPrivateWeak, but possibly 4555ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling /// hidden. 4613d0b528ee8d5e69fe721691966b7c18627f1600Reid Spencer DLLImportLinkage, ///< Function to be imported from DLL 473d10a5a75794356a0a568ce283713adc3a963200Bill Wendling DLLExportLinkage, ///< Function to be accessible from DLL. 483d10a5a75794356a0a568ce283713adc3a963200Bill Wendling ExternalWeakLinkage,///< ExternalWeak linkage description. 493d10a5a75794356a0a568ce283713adc3a963200Bill Wendling CommonLinkage ///< Tentative definitions. 504ad02e726d9b634372b037d4b352d8b63bb9e849Chris Lattner }; 5113d0b528ee8d5e69fe721691966b7c18627f1600Reid Spencer 5213d0b528ee8d5e69fe721691966b7c18627f1600Reid Spencer /// @brief An enumeration for the kinds of visibility of global values. 537f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov enum VisibilityTypes { 5418feb92e917a029b72a338e91b5b93f74d26f406Chris Lattner DefaultVisibility = 0, ///< The GV is visible 556f9896fcc81a1128b5f436d1763cc6213745adf1Anton Korobeynikov HiddenVisibility, ///< The GV is hidden 566f9896fcc81a1128b5f436d1763cc6213745adf1Anton Korobeynikov ProtectedVisibility ///< The GV is protected 577f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov }; 5813d0b528ee8d5e69fe721691966b7c18627f1600Reid Spencer 59ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattnerprotected: 60db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner GlobalValue(Type *ty, ValueTy vty, Use *Ops, unsigned NumOps, 615a96f93573439be771ce9609fa2a5754c94485b6Chris Lattner LinkageTypes linkage, const Twine &Name) 6286132a721d7671f382e0c88c0233ec92186daaf4Benjamin Kramer : Constant(ty, vty, Ops, NumOps), Linkage(linkage), 6386132a721d7671f382e0c88c0233ec92186daaf4Benjamin Kramer Visibility(DefaultVisibility), Alignment(0), UnnamedAddr(0), Parent(0) { 646e0d1cb30957a636c53158d3089e6fb88348a57aDaniel Dunbar setName(Name); 65dec628eead87b20773c98a00830580df211acc98Chris Lattner } 664387370c1c6dd64ad01be0fc91836616d908e917Chris Lattner 678c28c467f6af0cff632f3f2251f2a42c548db437Jeff Cohen // Note: VC++ treats enums as signed, so an extra bit is required to prevent 688c28c467f6af0cff632f3f2251f2a42c548db437Jeff Cohen // Linkage and Visibility from turning into negative values. 698c28c467f6af0cff632f3f2251f2a42c548db437Jeff Cohen LinkageTypes Linkage : 5; // The linkage of this global 706f9896fcc81a1128b5f436d1763cc6213745adf1Anton Korobeynikov unsigned Visibility : 2; // The visibility style of this global 7118feb92e917a029b72a338e91b5b93f74d26f406Chris Lattner unsigned Alignment : 16; // Alignment of this symbol, must be power of two 72bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola unsigned UnnamedAddr : 1; // This value's address is not significant 7386132a721d7671f382e0c88c0233ec92186daaf4Benjamin Kramer Module *Parent; // The containing module. 7418feb92e917a029b72a338e91b5b93f74d26f406Chris Lattner std::string Section; // Section to emit this into, empty mean default 75ed455c8fa25dd37a13b33f0afa66be03ac49b5bbGordon Henriksenpublic: 76afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen ~GlobalValue() { 77afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen removeDeadConstantUsers(); // remove any dead constants using this. 78afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen } 79afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen 806bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman unsigned getAlignment() const { 816bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman return (1u << Alignment) >> 1; 82b2f71b12f7acd5976c9b2aa2d0402df5f31a7158Chris Lattner } 836bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman void setAlignment(unsigned Align); 847f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov 85bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola bool hasUnnamedAddr() const { return UnnamedAddr; } 86bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola void setUnnamedAddr(bool Val) { UnnamedAddr = Val; } 87bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola 88276222a5ae189ed5c6a2afb248d4c8f0335585b4Reid Spencer VisibilityTypes getVisibility() const { return VisibilityTypes(Visibility); } 89f9e68accee939a070980ae62d76f33f0f9803b89Chris Lattner bool hasDefaultVisibility() const { return Visibility == DefaultVisibility; } 907f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov bool hasHiddenVisibility() const { return Visibility == HiddenVisibility; } 916f9896fcc81a1128b5f436d1763cc6213745adf1Anton Korobeynikov bool hasProtectedVisibility() const { 926f9896fcc81a1128b5f436d1763cc6213745adf1Anton Korobeynikov return Visibility == ProtectedVisibility; 936f9896fcc81a1128b5f436d1763cc6213745adf1Anton Korobeynikov } 947f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov void setVisibility(VisibilityTypes V) { Visibility = V; } 95b2f71b12f7acd5976c9b2aa2d0402df5f31a7158Chris Lattner 967a13354ddede26369da1ee8320252f73e30b2d35Chris Lattner bool hasSection() const { return !Section.empty(); } 977a13354ddede26369da1ee8320252f73e30b2d35Chris Lattner const std::string &getSection() const { return Section; } 982928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar void setSection(StringRef S) { Section = S; } 997a13354ddede26369da1ee8320252f73e30b2d35Chris Lattner 100118c091fd7b57cd0236c3b722e36a7a883b17b0aReid Spencer /// If the usage is empty (except transitively dead constants), then this 101f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman /// global value can be safely deleted since the destructor will 102118c091fd7b57cd0236c3b722e36a7a883b17b0aReid Spencer /// delete the dead constants as well. 1039769ab22265b313171d201b5928688524a01bd87Misha Brukman /// @brief Determine if the usage of this global value is empty except 104118c091fd7b57cd0236c3b722e36a7a883b17b0aReid Spencer /// for transitively dead constants. 105118c091fd7b57cd0236c3b722e36a7a883b17b0aReid Spencer bool use_empty_except_constants(); 106ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner 1074bbd839d10b14cd9028896800faa892e9d8ce3a3Chris Lattner /// getType - Global values are always pointers. 1081afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner inline PointerType *getType() const { 1091afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner return reinterpret_cast<PointerType*>(User::getType()); 110ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner } 111ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner 112667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands static LinkageTypes getLinkOnceLinkage(bool ODR) { 113667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands return ODR ? LinkOnceODRLinkage : LinkOnceAnyLinkage; 114667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands } 115667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands static LinkageTypes getWeakLinkage(bool ODR) { 116667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands return ODR ? WeakODRLinkage : WeakAnyLinkage; 117667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands } 118667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands 11944f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isExternalLinkage(LinkageTypes Linkage) { 12044f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return Linkage == ExternalLinkage; 12144f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 12244f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isAvailableExternallyLinkage(LinkageTypes Linkage) { 123266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner return Linkage == AvailableExternallyLinkage; 124266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner } 12544f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isLinkOnceLinkage(LinkageTypes Linkage) { 126667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands return Linkage == LinkOnceAnyLinkage || Linkage == LinkOnceODRLinkage; 127667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands } 12844f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isWeakLinkage(LinkageTypes Linkage) { 129667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands return Linkage == WeakAnyLinkage || Linkage == WeakODRLinkage; 130667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands } 13144f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isAppendingLinkage(LinkageTypes Linkage) { 13244f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return Linkage == AppendingLinkage; 13344f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 13444f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isInternalLinkage(LinkageTypes Linkage) { 13544f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return Linkage == InternalLinkage; 13644f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 13744f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isPrivateLinkage(LinkageTypes Linkage) { 13844f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return Linkage == PrivateLinkage; 13944f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 14044f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isLinkerPrivateLinkage(LinkageTypes Linkage) { 1415e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling return Linkage == LinkerPrivateLinkage; 1425e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling } 1435e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling static bool isLinkerPrivateWeakLinkage(LinkageTypes Linkage) { 1445e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling return Linkage == LinkerPrivateWeakLinkage; 14544f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 14655ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling static bool isLinkerPrivateWeakDefAutoLinkage(LinkageTypes Linkage) { 14755ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling return Linkage == LinkerPrivateWeakDefAutoLinkage; 14855ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling } 14944f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isLocalLinkage(LinkageTypes Linkage) { 15044f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return isInternalLinkage(Linkage) || isPrivateLinkage(Linkage) || 15155ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling isLinkerPrivateLinkage(Linkage) || isLinkerPrivateWeakLinkage(Linkage) || 15255ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling isLinkerPrivateWeakDefAutoLinkage(Linkage); 15344f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 15444f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isDLLImportLinkage(LinkageTypes Linkage) { 15544f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return Linkage == DLLImportLinkage; 15644f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 15744f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isDLLExportLinkage(LinkageTypes Linkage) { 15844f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return Linkage == DLLExportLinkage; 15944f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 16044f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isExternalWeakLinkage(LinkageTypes Linkage) { 16144f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return Linkage == ExternalWeakLinkage; 16244f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 16344f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isCommonLinkage(LinkageTypes Linkage) { 16444f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return Linkage == CommonLinkage; 165bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola } 1666197b0fe5466f3df29946bdcd47bd2ad462ea007Chris Lattner 1675df3186f598163258fabf3448d9372843804d1abDuncan Sands /// mayBeOverridden - Whether the definition of this global may be replaced 168667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands /// by something non-equivalent at link time. For example, if a function has 169667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands /// weak linkage then the code defining it may be replaced by different code. 17044f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool mayBeOverridden(LinkageTypes Linkage) { 17155ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling return Linkage == WeakAnyLinkage || 17255ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == LinkOnceAnyLinkage || 17355ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == CommonLinkage || 17455ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == ExternalWeakLinkage || 17555ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == LinkerPrivateWeakLinkage || 17655ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == LinkerPrivateWeakDefAutoLinkage; 177667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands } 178667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands 179667d4b8de6dea70195ff12ef39a4deebffa2f5c7Duncan Sands /// isWeakForLinker - Whether the definition of this global may be replaced at 1808e4f4390bc3e6ed0ec72281c67950f54474f915dDuncan Sands /// link time. NB: Using this method outside of the code generators is almost 1818e4f4390bc3e6ed0ec72281c67950f54474f915dDuncan Sands /// always a mistake: when working at the IR level use mayBeOverridden instead 1828e4f4390bc3e6ed0ec72281c67950f54474f915dDuncan Sands /// as it knows about ODR semantics. 18344f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola static bool isWeakForLinker(LinkageTypes Linkage) { 18455ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling return Linkage == AvailableExternallyLinkage || 18555ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == WeakAnyLinkage || 18655ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == WeakODRLinkage || 18755ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == LinkOnceAnyLinkage || 18855ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == LinkOnceODRLinkage || 18955ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == CommonLinkage || 19055ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == ExternalWeakLinkage || 19155ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == LinkerPrivateWeakLinkage || 19255ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling Linkage == LinkerPrivateWeakDefAutoLinkage; 19380585f1daac3570f19cd255c5006dfcf2ff65a89Anton Korobeynikov } 19480585f1daac3570f19cd255c5006dfcf2ff65a89Anton Korobeynikov 19544f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasExternalLinkage() const { return isExternalLinkage(Linkage); } 19644f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasAvailableExternallyLinkage() const { 19744f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return isAvailableExternallyLinkage(Linkage); 19844f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 19944f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasLinkOnceLinkage() const { 20044f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return isLinkOnceLinkage(Linkage); 20144f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 20244f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasWeakLinkage() const { 20344f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola return isWeakLinkage(Linkage); 20444f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola } 20544f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasAppendingLinkage() const { return isAppendingLinkage(Linkage); } 20644f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasInternalLinkage() const { return isInternalLinkage(Linkage); } 20744f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasPrivateLinkage() const { return isPrivateLinkage(Linkage); } 20844f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasLinkerPrivateLinkage() const { return isLinkerPrivateLinkage(Linkage); } 2095e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling bool hasLinkerPrivateWeakLinkage() const { 2105e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling return isLinkerPrivateWeakLinkage(Linkage); 2115e721d768254a920b78b9129d79a84c0163cb3f4Bill Wendling } 21255ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling bool hasLinkerPrivateWeakDefAutoLinkage() const { 21355ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling return isLinkerPrivateWeakDefAutoLinkage(Linkage); 21455ae515f9db484125a23429d4906c5edaf9f10d2Bill Wendling } 21544f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasLocalLinkage() const { return isLocalLinkage(Linkage); } 21644f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasDLLImportLinkage() const { return isDLLImportLinkage(Linkage); } 21744f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasDLLExportLinkage() const { return isDLLExportLinkage(Linkage); } 21844f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasExternalWeakLinkage() const { return isExternalWeakLinkage(Linkage); } 21944f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool hasCommonLinkage() const { return isCommonLinkage(Linkage); } 22044f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola 22144f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola void setLinkage(LinkageTypes LT) { Linkage = LT; } 22244f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola LinkageTypes getLinkage() const { return Linkage; } 22344f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola 22444f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool mayBeOverridden() const { return mayBeOverridden(Linkage); } 22544f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola 22644f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola bool isWeakForLinker() const { return isWeakForLinker(Linkage); } 22744f1680cdfe75a68ef944679176de713cff8c787Rafael Espindola 22828c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands /// copyAttributesFrom - copy all additional attributes (those not needed to 22928c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands /// create a GlobalValue) from the GlobalValue Src to this one. 23028c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands virtual void copyAttributesFrom(const GlobalValue *Src); 23128c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands 232f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// @name Materialization 233f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// Materialization is used to construct functions only as they're needed. This 234f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// is useful to reduce memory usage in LLVM or parsing work done by the 235f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// BitcodeReader to load the Module. 236f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// @{ 237f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 238f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// isMaterializable - If this function's Module is being lazily streamed in 239f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// functions from disk or some other source, this method can be used to check 240f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// to see if the function has been read in yet or not. 241f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin bool isMaterializable() const; 242f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 243f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// isDematerializable - Returns true if this function was loaded from a 244f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// GVMaterializer that's still attached to its Module and that knows how to 245f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// dematerialize the function. 246f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin bool isDematerializable() const; 247f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 248f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// Materialize - make sure this GlobalValue is fully read. If the module is 249f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// corrupt, this returns true and fills in the optional string with 250f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// information about the problem. If successful, this returns false. 251f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin bool Materialize(std::string *ErrInfo = 0); 252f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 253f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// Dematerialize - If this GlobalValue is read in, and if the GVMaterializer 254f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// supports it, release the memory for the function, and set it up to be 255f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin /// materialized lazily. If !isDematerializable(), this method is a noop. 256f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin void Dematerialize(); 257f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 258f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin/// @} 2591840f3ce7ff4688452e57d2924eb8c00157f02b4Chris Lattner 260118c091fd7b57cd0236c3b722e36a7a883b17b0aReid Spencer /// Override from Constant class. 26104fb7c36a9977127f32558dc01c39a9c2388bc39Owen Anderson virtual void destroyConstant(); 262118c091fd7b57cd0236c3b722e36a7a883b17b0aReid Spencer 2635cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer /// isDeclaration - Return true if the primary definition of this global 2646c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner /// value is outside of the current translation unit. 2656c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner bool isDeclaration() const; 2664bbd839d10b14cd9028896800faa892e9d8ce3a3Chris Lattner 26771c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar /// removeFromParent - This method unlinks 'this' from the containing module, 26871c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar /// but does not delete it. 26971c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar virtual void removeFromParent() = 0; 27071c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar 27171c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar /// eraseFromParent - This method unlinks 'this' from the containing module 27271c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar /// and deletes it. 27371c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar virtual void eraseFromParent() = 0; 27471c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar 2754bbd839d10b14cd9028896800faa892e9d8ce3a3Chris Lattner /// getParent - Get the module that this global value is contained inside 2764bbd839d10b14cd9028896800faa892e9d8ce3a3Chris Lattner /// of... 2774387370c1c6dd64ad01be0fc91836616d908e917Chris Lattner inline Module *getParent() { return Parent; } 2784387370c1c6dd64ad01be0fc91836616d908e917Chris Lattner inline const Module *getParent() const { return Parent; } 2794387370c1c6dd64ad01be0fc91836616d908e917Chris Lattner 280ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner // Methods for support type inquiry through isa, cast, and dyn_cast: 28170cfe13f19e91a595808ed6c6ff7e87ff0dccd64Chris Lattner static inline bool classof(const GlobalValue *) { return true; } 282ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner static inline bool classof(const Value *V) { 283a1a702cdd23221e6e3f36632be91150138958e9dDan Gohman return V->getValueID() == Value::FunctionVal || 2848b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov V->getValueID() == Value::GlobalVariableVal || 2858b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov V->getValueID() == Value::GlobalAliasVal; 286ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner } 287ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner}; 288ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner 289d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 290d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 291ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner#endif 292