1cc041ba03aed685400197fb938b7a583713d25afChris Lattner//===-- Globals.cpp - Implement the GlobalValue & GlobalVariable class ----===//
2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
3e253cf60fde678c428d69327b1ed43232893079cReid Spencer//                     The LLVM Compiler Infrastructure
4e253cf60fde678c428d69327b1ed43232893079cReid Spencer//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
8e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
9e253cf60fde678c428d69327b1ed43232893079cReid Spencer//
10c2c50cdcdc19a1bca993c06d13d8cdca87083ce4Chandler Carruth// This file implements the GlobalValue & GlobalVariable classes for the IR
11e253cf60fde678c428d69327b1ed43232893079cReid Spencer// library.
12e253cf60fde678c428d69327b1ed43232893079cReid Spencer//
13e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
14e253cf60fde678c428d69327b1ed43232893079cReid Spencer
150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalValue.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallPtrSet.h"
170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalAlias.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LeakDetector.h"
220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/IR/Operator.h"
24ab7c09b6b6f4516a631fd6788918c237c83939afTorok Edwin#include "llvm/Support/ErrorHandling.h"
25e253cf60fde678c428d69327b1ed43232893079cReid Spencerusing namespace llvm;
26e253cf60fde678c428d69327b1ed43232893079cReid Spencer
27e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
28e253cf60fde678c428d69327b1ed43232893079cReid Spencer//                            GlobalValue Class
29e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
30e253cf60fde678c428d69327b1ed43232893079cReid Spencer
31f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool GlobalValue::isMaterializable() const {
32936c43bb239858d7c4ee617e83fd222c1681ab4eNick Lewycky  return getParent() && getParent()->isMaterializable(this);
33f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin}
34f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool GlobalValue::isDematerializable() const {
35936c43bb239858d7c4ee617e83fd222c1681ab4eNick Lewycky  return getParent() && getParent()->isDematerializable(this);
36f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin}
37f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool GlobalValue::Materialize(std::string *ErrInfo) {
38f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  return getParent()->Materialize(this, ErrInfo);
39f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin}
40f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinvoid GlobalValue::Dematerialize() {
41f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  getParent()->Dematerialize(this);
42f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin}
43f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst DataLayout *GlobalValue::getDataLayout() const {
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return getParent()->getDataLayout();
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
48fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman/// Override destroyConstant to make sure it doesn't get called on
49e253cf60fde678c428d69327b1ed43232893079cReid Spencer/// GlobalValue's because they shouldn't be treated like other constants.
5004fb7c36a9977127f32558dc01c39a9c2388bc39Owen Andersonvoid GlobalValue::destroyConstant() {
51c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  llvm_unreachable("You can't GV->destroyConstant()!");
52e253cf60fde678c428d69327b1ed43232893079cReid Spencer}
5328c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands
5428c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// copyAttributesFrom - copy all additional attributes (those not needed to
5528c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// create a GlobalValue) from the GlobalValue Src to this one.
5628c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sandsvoid GlobalValue::copyAttributesFrom(const GlobalValue *Src) {
5728c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  setVisibility(Src->getVisibility());
581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  setUnnamedAddr(Src->hasUnnamedAddr());
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  setDLLStorageClass(Src->getDLLStorageClass());
6028c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands}
6128c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned GlobalValue::getAlignment() const {
63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (auto *GA = dyn_cast<GlobalAlias>(this)) {
64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // In general we cannot compute this at the IR level, but we try.
65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (const GlobalObject *GO = GA->getBaseObject())
66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return GO->getAlignment();
67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // FIXME: we should also be able to handle:
69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // Alias = Global + Offset
70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // Alias = Absolute
71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return 0;
72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return cast<GlobalObject>(this)->getAlignment();
74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid GlobalObject::setAlignment(unsigned Align) {
776bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman  assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!");
786bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman  assert(Align <= MaximumAlignment &&
796bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman         "Alignment is greater than MaximumAlignment!");
80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  setGlobalValueSubClassData(Log2_32(Align) + 1);
816bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman  assert(getAlignment() == Align && "Alignment representation error!");
826bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman}
836c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner
84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid GlobalObject::copyAttributesFrom(const GlobalValue *Src) {
85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const auto *GV = cast<GlobalObject>(Src);
86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  GlobalValue::copyAttributesFrom(GV);
87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  setAlignment(GV->getAlignment());
88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  setSection(GV->getSection());
89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesconst char *GlobalValue::getSection() const {
92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (auto *GA = dyn_cast<GlobalAlias>(this)) {
93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // In general we cannot compute this at the IR level, but we try.
94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (const GlobalObject *GO = GA->getBaseObject())
95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return GO->getSection();
96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return "";
97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return cast<GlobalObject>(this)->getSection();
99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesComdat *GlobalValue::getComdat() {
102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (auto *GA = dyn_cast<GlobalAlias>(this)) {
103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // In general we cannot compute this at the IR level, but we try.
104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (const GlobalObject *GO = GA->getBaseObject())
105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return const_cast<GlobalObject *>(GO)->getComdat();
106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return nullptr;
107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return cast<GlobalObject>(this)->getComdat();
109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
110cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid GlobalObject::setSection(StringRef S) { Section = S; }
112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
1136c48244973b3c3286af54dddb98412d2820b26b5Chris Lattnerbool GlobalValue::isDeclaration() const {
11497d9730a59fbd4e656d2c34f3b92d2feb4d9d575Chris Lattner  // Globals are definitions if they have an initializer.
1156c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner  if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(this))
1166c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner    return GV->getNumOperands() == 0;
1176c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner
11897d9730a59fbd4e656d2c34f3b92d2feb4d9d575Chris Lattner  // Functions are definitions if they have a body.
1196c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner  if (const Function *F = dyn_cast<Function>(this))
1206c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner    return F->empty();
12197d9730a59fbd4e656d2c34f3b92d2feb4d9d575Chris Lattner
1220063225bd7fa68e94e99bce2bbacb90341d1e667Chris Lattner  // Aliases are always definitions.
1230063225bd7fa68e94e99bce2bbacb90341d1e667Chris Lattner  assert(isa<GlobalAlias>(this));
1246c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner  return false;
1256c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner}
126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
127e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
128e253cf60fde678c428d69327b1ed43232893079cReid Spencer// GlobalVariable Implementation
129e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
130e253cf60fde678c428d69327b1ed43232893079cReid Spencer
131ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans WennborgGlobalVariable::GlobalVariable(Type *Ty, bool constant, LinkageTypes Link,
132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               Constant *InitVal, const Twine &Name,
133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               ThreadLocalMode TLMode, unsigned AddressSpace,
134af2f494c2d87a77c46efb85856f235ddd7f3c6abMichael Gottesman                               bool isExternallyInitialized)
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : GlobalObject(PointerType::get(Ty, AddressSpace), Value::GlobalVariableVal,
136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   OperandTraits<GlobalVariable>::op_begin(this),
137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   InitVal != nullptr, Link, Name),
138cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      isConstantGlobal(constant),
139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      isExternallyInitializedConstant(isExternallyInitialized) {
140cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  setThreadLocalMode(TLMode);
141ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg  if (InitVal) {
142ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg    assert(InitVal->getType() == Ty &&
143ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg           "Initializer should be the same type as the GlobalVariable!");
144ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg    Op<0>() = InitVal;
145ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg  }
146ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg
147ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg  LeakDetector::addGarbageObject(this);
148ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg}
149ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg
150ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans WennborgGlobalVariable::GlobalVariable(Module &M, Type *Ty, bool constant,
151ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                               LinkageTypes Link, Constant *InitVal,
152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               const Twine &Name, GlobalVariable *Before,
153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                               ThreadLocalMode TLMode, unsigned AddressSpace,
154af2f494c2d87a77c46efb85856f235ddd7f3c6abMichael Gottesman                               bool isExternallyInitialized)
155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : GlobalObject(PointerType::get(Ty, AddressSpace), Value::GlobalVariableVal,
156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   OperandTraits<GlobalVariable>::op_begin(this),
157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                   InitVal != nullptr, Link, Name),
158cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      isConstantGlobal(constant),
159dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      isExternallyInitializedConstant(isExternallyInitialized) {
160cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  setThreadLocalMode(TLMode);
161adc95467e41d6c46793f665168468cbf348c3638Chris Lattner  if (InitVal) {
162adc95467e41d6c46793f665168468cbf348c3638Chris Lattner    assert(InitVal->getType() == Ty &&
163adc95467e41d6c46793f665168468cbf348c3638Chris Lattner           "Initializer should be the same type as the GlobalVariable!");
1646c80c381601b17207b6b8f898cfe273a37584d52Gabor Greif    Op<0>() = InitVal;
165adc95467e41d6c46793f665168468cbf348c3638Chris Lattner  }
166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
167adc95467e41d6c46793f665168468cbf348c3638Chris Lattner  LeakDetector::addGarbageObject(this);
168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
169adc95467e41d6c46793f665168468cbf348c3638Chris Lattner  if (Before)
170adc95467e41d6c46793f665168468cbf348c3638Chris Lattner    Before->getParent()->getGlobalList().insert(Before, this);
171e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson  else
172e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson    M.getGlobalList().push_back(this);
173adc95467e41d6c46793f665168468cbf348c3638Chris Lattner}
174adc95467e41d6c46793f665168468cbf348c3638Chris Lattner
175e253cf60fde678c428d69327b1ed43232893079cReid Spencervoid GlobalVariable::setParent(Module *parent) {
176e253cf60fde678c428d69327b1ed43232893079cReid Spencer  if (getParent())
177e253cf60fde678c428d69327b1ed43232893079cReid Spencer    LeakDetector::addGarbageObject(this);
178e253cf60fde678c428d69327b1ed43232893079cReid Spencer  Parent = parent;
179e253cf60fde678c428d69327b1ed43232893079cReid Spencer  if (getParent())
180e253cf60fde678c428d69327b1ed43232893079cReid Spencer    LeakDetector::removeGarbageObject(this);
181e253cf60fde678c428d69327b1ed43232893079cReid Spencer}
182e253cf60fde678c428d69327b1ed43232893079cReid Spencer
1834b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattnervoid GlobalVariable::removeFromParent() {
1844b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner  getParent()->getGlobalList().remove(this);
1854b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner}
1864b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner
1874b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattnervoid GlobalVariable::eraseFromParent() {
1884b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner  getParent()->getGlobalList().erase(this);
1894b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner}
1904b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner
191e253cf60fde678c428d69327b1ed43232893079cReid Spencervoid GlobalVariable::replaceUsesOfWithOnConstant(Value *From, Value *To,
192d0ff1adbdb4b7b565b7f8f191aac0731e80aa1efChris Lattner                                                 Use *U) {
193e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // If you call this, then you better know this GVar has a constant
194e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // initializer worth replacing. Enforce that here.
195fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman  assert(getNumOperands() == 1 &&
196e253cf60fde678c428d69327b1ed43232893079cReid Spencer         "Attempt to replace uses of Constants on a GVar with no initializer");
197e253cf60fde678c428d69327b1ed43232893079cReid Spencer
198e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // And, since you know it has an initializer, the From value better be
199e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // the initializer :)
200e253cf60fde678c428d69327b1ed43232893079cReid Spencer  assert(getOperand(0) == From &&
201e253cf60fde678c428d69327b1ed43232893079cReid Spencer         "Attempt to replace wrong constant initializer in GVar");
202e253cf60fde678c428d69327b1ed43232893079cReid Spencer
203e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // And, you better have a constant for the replacement value
204e253cf60fde678c428d69327b1ed43232893079cReid Spencer  assert(isa<Constant>(To) &&
205e253cf60fde678c428d69327b1ed43232893079cReid Spencer         "Attempt to replace GVar initializer with non-constant");
206fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
207e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // Okay, preconditions out of the way, replace the constant initializer.
20807d7c9d9c508ec67a86ed572819d8cf9e3bdc422Chris Lattner  this->setOperand(0, cast<Constant>(To));
209e253cf60fde678c428d69327b1ed43232893079cReid Spencer}
2108b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
211dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskinvoid GlobalVariable::setInitializer(Constant *InitVal) {
212dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!InitVal) {
213dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    if (hasInitializer()) {
214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Op<0>().set(nullptr);
215dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin      NumOperands = 0;
216dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    }
217dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin  } else {
218dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    assert(InitVal->getType() == getType()->getElementType() &&
219dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin           "Initializer type must match GlobalVariable type");
220dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    if (!hasInitializer())
221dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin      NumOperands = 1;
222dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    Op<0>().set(InitVal);
223dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin  }
224dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin}
225dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin
22628c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// copyAttributesFrom - copy all additional attributes (those not needed to
22728c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// create a GlobalVariable) from the GlobalVariable Src to this one.
22828c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sandsvoid GlobalVariable::copyAttributesFrom(const GlobalValue *Src) {
22928c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  assert(isa<GlobalVariable>(Src) && "Expected a GlobalVariable!");
230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  GlobalObject::copyAttributesFrom(Src);
23128c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  const GlobalVariable *SrcVar = cast<GlobalVariable>(Src);
23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  setThreadLocalMode(SrcVar->getThreadLocalMode());
23328c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands}
23428c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands
23528c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands
2368b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov//===----------------------------------------------------------------------===//
2378b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov// GlobalAlias Implementation
2388b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov//===----------------------------------------------------------------------===//
2398b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesGlobalAlias::GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Link,
241cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                         const Twine &Name, Constant *Aliasee,
2428b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov                         Module *ParentModule)
243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : GlobalValue(PointerType::get(Ty, AddressSpace), Value::GlobalAliasVal,
244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                  &Op<0>(), 1, Link, Name) {
2458b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  LeakDetector::addGarbageObject(this);
246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Op<0>() = Aliasee;
247a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov
2488b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  if (ParentModule)
2498b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov    ParentModule->getAliasList().push_back(this);
2508b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov}
2518b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
252dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesGlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace,
253dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 LinkageTypes Link, const Twine &Name,
254cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                 Constant *Aliasee, Module *ParentModule) {
255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return new GlobalAlias(Ty, AddressSpace, Link, Name, Aliasee, ParentModule);
256dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesGlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace,
259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 LinkageTypes Linkage, const Twine &Name,
260dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 Module *Parent) {
261dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return create(Ty, AddressSpace, Linkage, Name, nullptr, Parent);
262dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
264dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesGlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace,
265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 LinkageTypes Linkage, const Twine &Name,
266cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                 GlobalValue *Aliasee) {
267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return create(Ty, AddressSpace, Linkage, Name, Aliasee, Aliasee->getParent());
268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
269dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
270dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesGlobalAlias *GlobalAlias::create(LinkageTypes Link, const Twine &Name,
271cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                 GlobalValue *Aliasee) {
272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PointerType *PTy = Aliasee->getType();
273dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return create(PTy->getElementType(), PTy->getAddressSpace(), Link, Name,
274dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                Aliasee);
275dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
276dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
277cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesGlobalAlias *GlobalAlias::create(const Twine &Name, GlobalValue *Aliasee) {
278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return create(Aliasee->getLinkage(), Name, Aliasee);
279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
280dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2818b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikovvoid GlobalAlias::setParent(Module *parent) {
2828b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  if (getParent())
2838b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov    LeakDetector::addGarbageObject(this);
2848b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  Parent = parent;
2858b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  if (getParent())
2868b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov    LeakDetector::removeGarbageObject(this);
2878b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov}
2888b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
2898b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikovvoid GlobalAlias::removeFromParent() {
2908b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  getParent()->getAliasList().remove(this);
2918b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov}
2928b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
2938b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikovvoid GlobalAlias::eraseFromParent() {
2948b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  getParent()->getAliasList().erase(this);
2958b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov}
2968b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
297cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid GlobalAlias::setAliasee(Constant *Aliasee) {
298cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  assert((!Aliasee || Aliasee->getType() == getType()) &&
299cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines         "Alias and aliasee types should match!");
300cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  setOperand(0, Aliasee);
301cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
302