Globals.cpp revision c2c50cdcdc19a1bca993c06d13d8cdca87083ce4
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
15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/GlobalValue.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallPtrSet.h"
17c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov#include "llvm/Constants.h"
18cc041ba03aed685400197fb938b7a583713d25afChris Lattner#include "llvm/DerivedTypes.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/GlobalAlias.h"
20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/GlobalVariable.h"
21e253cf60fde678c428d69327b1ed43232893079cReid Spencer#include "llvm/Module.h"
22ab7c09b6b6f4516a631fd6788918c237c83939afTorok Edwin#include "llvm/Support/ErrorHandling.h"
23551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h"
24e253cf60fde678c428d69327b1ed43232893079cReid Spencerusing namespace llvm;
25e253cf60fde678c428d69327b1ed43232893079cReid Spencer
26e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
27e253cf60fde678c428d69327b1ed43232893079cReid Spencer//                            GlobalValue Class
28e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
29e253cf60fde678c428d69327b1ed43232893079cReid Spencer
30f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool GlobalValue::isMaterializable() const {
31936c43bb239858d7c4ee617e83fd222c1681ab4eNick Lewycky  return getParent() && getParent()->isMaterializable(this);
32f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin}
33f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool GlobalValue::isDematerializable() const {
34936c43bb239858d7c4ee617e83fd222c1681ab4eNick Lewycky  return getParent() && getParent()->isDematerializable(this);
35f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin}
36f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool GlobalValue::Materialize(std::string *ErrInfo) {
37f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  return getParent()->Materialize(this, ErrInfo);
38f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin}
39f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinvoid GlobalValue::Dematerialize() {
40f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  getParent()->Dematerialize(this);
41f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin}
42f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin
43fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman/// Override destroyConstant to make sure it doesn't get called on
44e253cf60fde678c428d69327b1ed43232893079cReid Spencer/// GlobalValue's because they shouldn't be treated like other constants.
4504fb7c36a9977127f32558dc01c39a9c2388bc39Owen Andersonvoid GlobalValue::destroyConstant() {
46c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  llvm_unreachable("You can't GV->destroyConstant()!");
47e253cf60fde678c428d69327b1ed43232893079cReid Spencer}
4828c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands
4928c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// copyAttributesFrom - copy all additional attributes (those not needed to
5028c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// create a GlobalValue) from the GlobalValue Src to this one.
5128c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sandsvoid GlobalValue::copyAttributesFrom(const GlobalValue *Src) {
5228c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  setAlignment(Src->getAlignment());
5328c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  setSection(Src->getSection());
5428c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  setVisibility(Src->getVisibility());
551afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  setUnnamedAddr(Src->hasUnnamedAddr());
5628c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands}
5728c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands
586bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohmanvoid GlobalValue::setAlignment(unsigned Align) {
596bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman  assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!");
606bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman  assert(Align <= MaximumAlignment &&
616bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman         "Alignment is greater than MaximumAlignment!");
626bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman  Alignment = Log2_32(Align) + 1;
636bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman  assert(getAlignment() == Align && "Alignment representation error!");
646bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman}
656c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner
666c48244973b3c3286af54dddb98412d2820b26b5Chris Lattnerbool GlobalValue::isDeclaration() const {
6797d9730a59fbd4e656d2c34f3b92d2feb4d9d575Chris Lattner  // Globals are definitions if they have an initializer.
686c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner  if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(this))
696c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner    return GV->getNumOperands() == 0;
706c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner
7197d9730a59fbd4e656d2c34f3b92d2feb4d9d575Chris Lattner  // Functions are definitions if they have a body.
726c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner  if (const Function *F = dyn_cast<Function>(this))
736c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner    return F->empty();
7497d9730a59fbd4e656d2c34f3b92d2feb4d9d575Chris Lattner
750063225bd7fa68e94e99bce2bbacb90341d1e667Chris Lattner  // Aliases are always definitions.
760063225bd7fa68e94e99bce2bbacb90341d1e667Chris Lattner  assert(isa<GlobalAlias>(this));
776c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner  return false;
786c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner}
796bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman
80e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
81e253cf60fde678c428d69327b1ed43232893079cReid Spencer// GlobalVariable Implementation
82e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===//
83e253cf60fde678c428d69327b1ed43232893079cReid Spencer
84ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans WennborgGlobalVariable::GlobalVariable(Type *Ty, bool constant, LinkageTypes Link,
85ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                               Constant *InitVal, const Twine &Name,
86ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                               ThreadLocalMode TLMode, unsigned AddressSpace)
87ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg  : GlobalValue(PointerType::get(Ty, AddressSpace),
88ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                Value::GlobalVariableVal,
89ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                OperandTraits<GlobalVariable>::op_begin(this),
90ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                InitVal != 0, Link, Name),
91ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg    isConstantGlobal(constant), threadLocalMode(TLMode) {
92ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg  if (InitVal) {
93ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg    assert(InitVal->getType() == Ty &&
94ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg           "Initializer should be the same type as the GlobalVariable!");
95ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg    Op<0>() = InitVal;
96ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg  }
97ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg
98ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg  LeakDetector::addGarbageObject(this);
99ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg}
100ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg
101ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans WennborgGlobalVariable::GlobalVariable(Module &M, Type *Ty, bool constant,
102ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                               LinkageTypes Link, Constant *InitVal,
103ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                               const Twine &Name,
104ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                               GlobalVariable *Before, ThreadLocalMode TLMode,
105ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg                               unsigned AddressSpace)
1066de8ffbbc91bd750fa7212d3cbc4211341ef817eHans Wennborg  : GlobalValue(PointerType::get(Ty, AddressSpace),
107c341f1c62d1b46b64fb70890fffed87a3136cc2dOwen Anderson                Value::GlobalVariableVal,
108efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif                OperandTraits<GlobalVariable>::op_begin(this),
109efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif                InitVal != 0, Link, Name),
110ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg    isConstantGlobal(constant), threadLocalMode(TLMode) {
111adc95467e41d6c46793f665168468cbf348c3638Chris Lattner  if (InitVal) {
112adc95467e41d6c46793f665168468cbf348c3638Chris Lattner    assert(InitVal->getType() == Ty &&
113adc95467e41d6c46793f665168468cbf348c3638Chris Lattner           "Initializer should be the same type as the GlobalVariable!");
1146c80c381601b17207b6b8f898cfe273a37584d52Gabor Greif    Op<0>() = InitVal;
115adc95467e41d6c46793f665168468cbf348c3638Chris Lattner  }
116adc95467e41d6c46793f665168468cbf348c3638Chris Lattner
117adc95467e41d6c46793f665168468cbf348c3638Chris Lattner  LeakDetector::addGarbageObject(this);
118adc95467e41d6c46793f665168468cbf348c3638Chris Lattner
119adc95467e41d6c46793f665168468cbf348c3638Chris Lattner  if (Before)
120adc95467e41d6c46793f665168468cbf348c3638Chris Lattner    Before->getParent()->getGlobalList().insert(Before, this);
121e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson  else
122e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson    M.getGlobalList().push_back(this);
123adc95467e41d6c46793f665168468cbf348c3638Chris Lattner}
124adc95467e41d6c46793f665168468cbf348c3638Chris Lattner
125e253cf60fde678c428d69327b1ed43232893079cReid Spencervoid GlobalVariable::setParent(Module *parent) {
126e253cf60fde678c428d69327b1ed43232893079cReid Spencer  if (getParent())
127e253cf60fde678c428d69327b1ed43232893079cReid Spencer    LeakDetector::addGarbageObject(this);
128e253cf60fde678c428d69327b1ed43232893079cReid Spencer  Parent = parent;
129e253cf60fde678c428d69327b1ed43232893079cReid Spencer  if (getParent())
130e253cf60fde678c428d69327b1ed43232893079cReid Spencer    LeakDetector::removeGarbageObject(this);
131e253cf60fde678c428d69327b1ed43232893079cReid Spencer}
132e253cf60fde678c428d69327b1ed43232893079cReid Spencer
1334b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattnervoid GlobalVariable::removeFromParent() {
1344b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner  getParent()->getGlobalList().remove(this);
1354b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner}
1364b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner
1374b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattnervoid GlobalVariable::eraseFromParent() {
1384b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner  getParent()->getGlobalList().erase(this);
1394b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner}
1404b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner
141e253cf60fde678c428d69327b1ed43232893079cReid Spencervoid GlobalVariable::replaceUsesOfWithOnConstant(Value *From, Value *To,
142d0ff1adbdb4b7b565b7f8f191aac0731e80aa1efChris Lattner                                                 Use *U) {
143e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // If you call this, then you better know this GVar has a constant
144e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // initializer worth replacing. Enforce that here.
145fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman  assert(getNumOperands() == 1 &&
146e253cf60fde678c428d69327b1ed43232893079cReid Spencer         "Attempt to replace uses of Constants on a GVar with no initializer");
147e253cf60fde678c428d69327b1ed43232893079cReid Spencer
148e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // And, since you know it has an initializer, the From value better be
149e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // the initializer :)
150e253cf60fde678c428d69327b1ed43232893079cReid Spencer  assert(getOperand(0) == From &&
151e253cf60fde678c428d69327b1ed43232893079cReid Spencer         "Attempt to replace wrong constant initializer in GVar");
152e253cf60fde678c428d69327b1ed43232893079cReid Spencer
153e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // And, you better have a constant for the replacement value
154e253cf60fde678c428d69327b1ed43232893079cReid Spencer  assert(isa<Constant>(To) &&
155e253cf60fde678c428d69327b1ed43232893079cReid Spencer         "Attempt to replace GVar initializer with non-constant");
156fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
157e253cf60fde678c428d69327b1ed43232893079cReid Spencer  // Okay, preconditions out of the way, replace the constant initializer.
15807d7c9d9c508ec67a86ed572819d8cf9e3bdc422Chris Lattner  this->setOperand(0, cast<Constant>(To));
159e253cf60fde678c428d69327b1ed43232893079cReid Spencer}
1608b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
161dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskinvoid GlobalVariable::setInitializer(Constant *InitVal) {
162dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin  if (InitVal == 0) {
163dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    if (hasInitializer()) {
164dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin      Op<0>().set(0);
165dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin      NumOperands = 0;
166dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    }
167dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin  } else {
168dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    assert(InitVal->getType() == getType()->getElementType() &&
169dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin           "Initializer type must match GlobalVariable type");
170dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    if (!hasInitializer())
171dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin      NumOperands = 1;
172dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin    Op<0>().set(InitVal);
173dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin  }
174dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin}
175dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin
17628c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// copyAttributesFrom - copy all additional attributes (those not needed to
17728c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// create a GlobalVariable) from the GlobalVariable Src to this one.
17828c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sandsvoid GlobalVariable::copyAttributesFrom(const GlobalValue *Src) {
17928c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  assert(isa<GlobalVariable>(Src) && "Expected a GlobalVariable!");
18028c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  GlobalValue::copyAttributesFrom(Src);
18128c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  const GlobalVariable *SrcVar = cast<GlobalVariable>(Src);
18228c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands  setThreadLocal(SrcVar->isThreadLocal());
18328c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands}
18428c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands
18528c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands
1868b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov//===----------------------------------------------------------------------===//
1878b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov// GlobalAlias Implementation
1888b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov//===----------------------------------------------------------------------===//
1898b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
190db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris LattnerGlobalAlias::GlobalAlias(Type *Ty, LinkageTypes Link,
19192ccf70ad448eb02f9f273d2c70ae4708b3bd0f2Daniel Dunbar                         const Twine &Name, Constant* aliasee,
1928b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov                         Module *ParentModule)
193efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  : GlobalValue(Ty, Value::GlobalAliasVal, &Op<0>(), 1, Link, Name) {
1948b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  LeakDetector::addGarbageObject(this);
1958b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
196a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov  if (aliasee)
197a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov    assert(aliasee->getType() == Ty && "Alias and aliasee types should match!");
1986c80c381601b17207b6b8f898cfe273a37584d52Gabor Greif  Op<0>() = aliasee;
199a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov
2008b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  if (ParentModule)
2018b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov    ParentModule->getAliasList().push_back(this);
2028b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov}
2038b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
2048b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikovvoid GlobalAlias::setParent(Module *parent) {
2058b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  if (getParent())
2068b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov    LeakDetector::addGarbageObject(this);
2078b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  Parent = parent;
2088b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  if (getParent())
2098b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov    LeakDetector::removeGarbageObject(this);
2108b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov}
2118b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
2128b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikovvoid GlobalAlias::removeFromParent() {
2138b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  getParent()->getAliasList().remove(this);
2148b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov}
2158b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
2168b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikovvoid GlobalAlias::eraseFromParent() {
2178b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov  getParent()->getAliasList().erase(this);
2188b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov}
2198b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
2209854e1bebe010a57b1d65b214db350027829d972Chris Lattnervoid GlobalAlias::setAliasee(Constant *Aliasee) {
2219854e1bebe010a57b1d65b214db350027829d972Chris Lattner  assert((!Aliasee || Aliasee->getType() == getType()) &&
2229854e1bebe010a57b1d65b214db350027829d972Chris Lattner         "Alias and aliasee types should match!");
223c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov
224c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov  setOperand(0, Aliasee);
225c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov}
226c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov
2272bf6e6a632b445b363707f99aa35ca304e7a9176Chris Lattnerconst GlobalValue *GlobalAlias::getAliasedGlobal() const {
228c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov  const Constant *C = getAliasee();
2299854e1bebe010a57b1d65b214db350027829d972Chris Lattner  if (C == 0) return 0;
2309854e1bebe010a57b1d65b214db350027829d972Chris Lattner
2319854e1bebe010a57b1d65b214db350027829d972Chris Lattner  if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
2329854e1bebe010a57b1d65b214db350027829d972Chris Lattner    return GV;
2339854e1bebe010a57b1d65b214db350027829d972Chris Lattner
2349854e1bebe010a57b1d65b214db350027829d972Chris Lattner  const ConstantExpr *CE = cast<ConstantExpr>(C);
2359854e1bebe010a57b1d65b214db350027829d972Chris Lattner  assert((CE->getOpcode() == Instruction::BitCast ||
2369854e1bebe010a57b1d65b214db350027829d972Chris Lattner          CE->getOpcode() == Instruction::GetElementPtr) &&
2379854e1bebe010a57b1d65b214db350027829d972Chris Lattner         "Unsupported aliasee");
2389854e1bebe010a57b1d65b214db350027829d972Chris Lattner
2394255274cf82d181cad64794aac78b8c1e1a9d794Jay Foad  return cast<GlobalValue>(CE->getOperand(0));
2408b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov}
2418b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov
24219e861a4ffb896f16a691d5ac869e894df3cd464Anton Korobeynikovconst GlobalValue *GlobalAlias::resolveAliasedGlobal(bool stopOnWeak) const {
24389a3d3f25cf58c940189d87356141d2610042d58Anton Korobeynikov  SmallPtrSet<const GlobalValue*, 3> Visited;
244e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov
245832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov  // Check if we need to stop early.
24686062afbc49b549a653d38fb03702051f3917df7Duncan Sands  if (stopOnWeak && mayBeOverridden())
247832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov    return this;
248832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov
249e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov  const GlobalValue *GV = getAliasedGlobal();
250e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov  Visited.insert(GV);
251e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov
252832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov  // Iterate over aliasing chain, stopping on weak alias if necessary.
253e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov  while (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV)) {
25486062afbc49b549a653d38fb03702051f3917df7Duncan Sands    if (stopOnWeak && GA->mayBeOverridden())
255832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov      break;
256832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov
257e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov    GV = GA->getAliasedGlobal();
258e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov
259e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov    if (!Visited.insert(GV))
2609854e1bebe010a57b1d65b214db350027829d972Chris Lattner      return 0;
261e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov  }
262e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov
263e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov  return GV;
264e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov}
265