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