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// 10e253cf60fde678c428d69327b1ed43232893079cReid Spencer// This file implements the GlobalValue & GlobalVariable classes for the VMCore 11e253cf60fde678c428d69327b1ed43232893079cReid Spencer// library. 12e253cf60fde678c428d69327b1ed43232893079cReid Spencer// 13e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===// 14e253cf60fde678c428d69327b1ed43232893079cReid Spencer 15c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov#include "llvm/Constants.h" 16e253cf60fde678c428d69327b1ed43232893079cReid Spencer#include "llvm/GlobalVariable.h" 178b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov#include "llvm/GlobalAlias.h" 18cc041ba03aed685400197fb938b7a583713d25afChris Lattner#include "llvm/DerivedTypes.h" 19e253cf60fde678c428d69327b1ed43232893079cReid Spencer#include "llvm/Module.h" 20e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov#include "llvm/ADT/SmallPtrSet.h" 21ab7c09b6b6f4516a631fd6788918c237c83939afTorok Edwin#include "llvm/Support/ErrorHandling.h" 22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h" 23e253cf60fde678c428d69327b1ed43232893079cReid Spencerusing namespace llvm; 24e253cf60fde678c428d69327b1ed43232893079cReid Spencer 25e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===// 26e253cf60fde678c428d69327b1ed43232893079cReid Spencer// GlobalValue Class 27e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===// 28e253cf60fde678c428d69327b1ed43232893079cReid Spencer 29f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool GlobalValue::isMaterializable() const { 30936c43bb239858d7c4ee617e83fd222c1681ab4eNick Lewycky return getParent() && getParent()->isMaterializable(this); 31f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 32f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool GlobalValue::isDematerializable() const { 33936c43bb239858d7c4ee617e83fd222c1681ab4eNick Lewycky return getParent() && getParent()->isDematerializable(this); 34f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 35f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool GlobalValue::Materialize(std::string *ErrInfo) { 36f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin return getParent()->Materialize(this, ErrInfo); 37f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 38f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinvoid GlobalValue::Dematerialize() { 39f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin getParent()->Dematerialize(this); 40f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 41f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 42fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman/// Override destroyConstant to make sure it doesn't get called on 43e253cf60fde678c428d69327b1ed43232893079cReid Spencer/// GlobalValue's because they shouldn't be treated like other constants. 4404fb7c36a9977127f32558dc01c39a9c2388bc39Owen Andersonvoid GlobalValue::destroyConstant() { 45c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("You can't GV->destroyConstant()!"); 46e253cf60fde678c428d69327b1ed43232893079cReid Spencer} 4728c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands 4828c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// copyAttributesFrom - copy all additional attributes (those not needed to 4928c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// create a GlobalValue) from the GlobalValue Src to this one. 5028c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sandsvoid GlobalValue::copyAttributesFrom(const GlobalValue *Src) { 5128c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands setAlignment(Src->getAlignment()); 5228c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands setSection(Src->getSection()); 5328c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands setVisibility(Src->getVisibility()); 541afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner setUnnamedAddr(Src->hasUnnamedAddr()); 5528c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands} 5628c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands 576bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohmanvoid GlobalValue::setAlignment(unsigned Align) { 586bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!"); 596bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman assert(Align <= MaximumAlignment && 606bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman "Alignment is greater than MaximumAlignment!"); 616bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman Alignment = Log2_32(Align) + 1; 626bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman assert(getAlignment() == Align && "Alignment representation error!"); 636bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman} 646c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner 656c48244973b3c3286af54dddb98412d2820b26b5Chris Lattnerbool GlobalValue::isDeclaration() const { 6697d9730a59fbd4e656d2c34f3b92d2feb4d9d575Chris Lattner // Globals are definitions if they have an initializer. 676c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(this)) 686c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner return GV->getNumOperands() == 0; 696c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner 7097d9730a59fbd4e656d2c34f3b92d2feb4d9d575Chris Lattner // Functions are definitions if they have a body. 716c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner if (const Function *F = dyn_cast<Function>(this)) 726c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner return F->empty(); 7397d9730a59fbd4e656d2c34f3b92d2feb4d9d575Chris Lattner 740063225bd7fa68e94e99bce2bbacb90341d1e667Chris Lattner // Aliases are always definitions. 750063225bd7fa68e94e99bce2bbacb90341d1e667Chris Lattner assert(isa<GlobalAlias>(this)); 766c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner return false; 776c48244973b3c3286af54dddb98412d2820b26b5Chris Lattner} 786bbe671e1c58dd58fcf0165c1127dda5037ad3e2Dan Gohman 79e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===// 80e253cf60fde678c428d69327b1ed43232893079cReid Spencer// GlobalVariable Implementation 81e253cf60fde678c428d69327b1ed43232893079cReid Spencer//===----------------------------------------------------------------------===// 82e253cf60fde678c428d69327b1ed43232893079cReid Spencer 83ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans WennborgGlobalVariable::GlobalVariable(Type *Ty, bool constant, LinkageTypes Link, 84ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg Constant *InitVal, const Twine &Name, 85ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg ThreadLocalMode TLMode, unsigned AddressSpace) 86ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg : GlobalValue(PointerType::get(Ty, AddressSpace), 87ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg Value::GlobalVariableVal, 88ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg OperandTraits<GlobalVariable>::op_begin(this), 89ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg InitVal != 0, Link, Name), 90ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg isConstantGlobal(constant), threadLocalMode(TLMode) { 91ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg if (InitVal) { 92ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg assert(InitVal->getType() == Ty && 93ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg "Initializer should be the same type as the GlobalVariable!"); 94ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg Op<0>() = InitVal; 95ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg } 96ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg 97ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg LeakDetector::addGarbageObject(this); 98ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg} 99ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg 100ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans WennborgGlobalVariable::GlobalVariable(Module &M, Type *Ty, bool constant, 101ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg LinkageTypes Link, Constant *InitVal, 102ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg const Twine &Name, 103ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg GlobalVariable *Before, ThreadLocalMode TLMode, 104ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg unsigned AddressSpace) 1056de8ffbbc91bd750fa7212d3cbc4211341ef817eHans Wennborg : GlobalValue(PointerType::get(Ty, AddressSpace), 106c341f1c62d1b46b64fb70890fffed87a3136cc2dOwen Anderson Value::GlobalVariableVal, 107efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif OperandTraits<GlobalVariable>::op_begin(this), 108efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif InitVal != 0, Link, Name), 109ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg isConstantGlobal(constant), threadLocalMode(TLMode) { 110adc95467e41d6c46793f665168468cbf348c3638Chris Lattner if (InitVal) { 111adc95467e41d6c46793f665168468cbf348c3638Chris Lattner assert(InitVal->getType() == Ty && 112adc95467e41d6c46793f665168468cbf348c3638Chris Lattner "Initializer should be the same type as the GlobalVariable!"); 1136c80c381601b17207b6b8f898cfe273a37584d52Gabor Greif Op<0>() = InitVal; 114adc95467e41d6c46793f665168468cbf348c3638Chris Lattner } 115adc95467e41d6c46793f665168468cbf348c3638Chris Lattner 116adc95467e41d6c46793f665168468cbf348c3638Chris Lattner LeakDetector::addGarbageObject(this); 117adc95467e41d6c46793f665168468cbf348c3638Chris Lattner 118adc95467e41d6c46793f665168468cbf348c3638Chris Lattner if (Before) 119adc95467e41d6c46793f665168468cbf348c3638Chris Lattner Before->getParent()->getGlobalList().insert(Before, this); 120e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson else 121e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson M.getGlobalList().push_back(this); 122adc95467e41d6c46793f665168468cbf348c3638Chris Lattner} 123adc95467e41d6c46793f665168468cbf348c3638Chris Lattner 124e253cf60fde678c428d69327b1ed43232893079cReid Spencervoid GlobalVariable::setParent(Module *parent) { 125e253cf60fde678c428d69327b1ed43232893079cReid Spencer if (getParent()) 126e253cf60fde678c428d69327b1ed43232893079cReid Spencer LeakDetector::addGarbageObject(this); 127e253cf60fde678c428d69327b1ed43232893079cReid Spencer Parent = parent; 128e253cf60fde678c428d69327b1ed43232893079cReid Spencer if (getParent()) 129e253cf60fde678c428d69327b1ed43232893079cReid Spencer LeakDetector::removeGarbageObject(this); 130e253cf60fde678c428d69327b1ed43232893079cReid Spencer} 131e253cf60fde678c428d69327b1ed43232893079cReid Spencer 1324b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattnervoid GlobalVariable::removeFromParent() { 1334b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner getParent()->getGlobalList().remove(this); 1344b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner} 1354b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner 1364b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattnervoid GlobalVariable::eraseFromParent() { 1374b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner getParent()->getGlobalList().erase(this); 1384b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner} 1394b83380f330b1c77bb9b4ad8f63bdcf1a596afd6Chris Lattner 140e253cf60fde678c428d69327b1ed43232893079cReid Spencervoid GlobalVariable::replaceUsesOfWithOnConstant(Value *From, Value *To, 141d0ff1adbdb4b7b565b7f8f191aac0731e80aa1efChris Lattner Use *U) { 142e253cf60fde678c428d69327b1ed43232893079cReid Spencer // If you call this, then you better know this GVar has a constant 143e253cf60fde678c428d69327b1ed43232893079cReid Spencer // initializer worth replacing. Enforce that here. 144fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman assert(getNumOperands() == 1 && 145e253cf60fde678c428d69327b1ed43232893079cReid Spencer "Attempt to replace uses of Constants on a GVar with no initializer"); 146e253cf60fde678c428d69327b1ed43232893079cReid Spencer 147e253cf60fde678c428d69327b1ed43232893079cReid Spencer // And, since you know it has an initializer, the From value better be 148e253cf60fde678c428d69327b1ed43232893079cReid Spencer // the initializer :) 149e253cf60fde678c428d69327b1ed43232893079cReid Spencer assert(getOperand(0) == From && 150e253cf60fde678c428d69327b1ed43232893079cReid Spencer "Attempt to replace wrong constant initializer in GVar"); 151e253cf60fde678c428d69327b1ed43232893079cReid Spencer 152e253cf60fde678c428d69327b1ed43232893079cReid Spencer // And, you better have a constant for the replacement value 153e253cf60fde678c428d69327b1ed43232893079cReid Spencer assert(isa<Constant>(To) && 154e253cf60fde678c428d69327b1ed43232893079cReid Spencer "Attempt to replace GVar initializer with non-constant"); 155fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 156e253cf60fde678c428d69327b1ed43232893079cReid Spencer // Okay, preconditions out of the way, replace the constant initializer. 15707d7c9d9c508ec67a86ed572819d8cf9e3bdc422Chris Lattner this->setOperand(0, cast<Constant>(To)); 158e253cf60fde678c428d69327b1ed43232893079cReid Spencer} 1598b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 160dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskinvoid GlobalVariable::setInitializer(Constant *InitVal) { 161dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin if (InitVal == 0) { 162dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin if (hasInitializer()) { 163dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin Op<0>().set(0); 164dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin NumOperands = 0; 165dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin } 166dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin } else { 167dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin assert(InitVal->getType() == getType()->getElementType() && 168dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin "Initializer type must match GlobalVariable type"); 169dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin if (!hasInitializer()) 170dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin NumOperands = 1; 171dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin Op<0>().set(InitVal); 172dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin } 173dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin} 174dc1472b6d9281893771a64eb95b4599dff9aadfdJeffrey Yasskin 17528c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// copyAttributesFrom - copy all additional attributes (those not needed to 17628c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands/// create a GlobalVariable) from the GlobalVariable Src to this one. 17728c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sandsvoid GlobalVariable::copyAttributesFrom(const GlobalValue *Src) { 17828c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands assert(isa<GlobalVariable>(Src) && "Expected a GlobalVariable!"); 17928c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands GlobalValue::copyAttributesFrom(Src); 18028c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands const GlobalVariable *SrcVar = cast<GlobalVariable>(Src); 18128c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands setThreadLocal(SrcVar->isThreadLocal()); 18228c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands} 18328c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands 18428c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands 1858b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov//===----------------------------------------------------------------------===// 1868b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov// GlobalAlias Implementation 1878b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov//===----------------------------------------------------------------------===// 1888b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 189db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris LattnerGlobalAlias::GlobalAlias(Type *Ty, LinkageTypes Link, 19092ccf70ad448eb02f9f273d2c70ae4708b3bd0f2Daniel Dunbar const Twine &Name, Constant* aliasee, 1918b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov Module *ParentModule) 192efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif : GlobalValue(Ty, Value::GlobalAliasVal, &Op<0>(), 1, Link, Name) { 1938b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov LeakDetector::addGarbageObject(this); 1948b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 195a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov if (aliasee) 196a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov assert(aliasee->getType() == Ty && "Alias and aliasee types should match!"); 1976c80c381601b17207b6b8f898cfe273a37584d52Gabor Greif Op<0>() = aliasee; 198a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov 1998b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov if (ParentModule) 2008b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov ParentModule->getAliasList().push_back(this); 2018b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov} 2028b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 2038b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikovvoid GlobalAlias::setParent(Module *parent) { 2048b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov if (getParent()) 2058b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov LeakDetector::addGarbageObject(this); 2068b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov Parent = parent; 2078b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov if (getParent()) 2088b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov LeakDetector::removeGarbageObject(this); 2098b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov} 2108b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 2118b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikovvoid GlobalAlias::removeFromParent() { 2128b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov getParent()->getAliasList().remove(this); 2138b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov} 2148b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 2158b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikovvoid GlobalAlias::eraseFromParent() { 2168b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov getParent()->getAliasList().erase(this); 2178b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov} 2188b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 2199854e1bebe010a57b1d65b214db350027829d972Chris Lattnervoid GlobalAlias::setAliasee(Constant *Aliasee) { 2209854e1bebe010a57b1d65b214db350027829d972Chris Lattner assert((!Aliasee || Aliasee->getType() == getType()) && 2219854e1bebe010a57b1d65b214db350027829d972Chris Lattner "Alias and aliasee types should match!"); 222c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov 223c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov setOperand(0, Aliasee); 224c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov} 225c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov 2262bf6e6a632b445b363707f99aa35ca304e7a9176Chris Lattnerconst GlobalValue *GlobalAlias::getAliasedGlobal() const { 227c6c98af9e5814e8066c82f20ca11cf646a5fc289Anton Korobeynikov const Constant *C = getAliasee(); 2289854e1bebe010a57b1d65b214db350027829d972Chris Lattner if (C == 0) return 0; 2299854e1bebe010a57b1d65b214db350027829d972Chris Lattner 2309854e1bebe010a57b1d65b214db350027829d972Chris Lattner if (const GlobalValue *GV = dyn_cast<GlobalValue>(C)) 2319854e1bebe010a57b1d65b214db350027829d972Chris Lattner return GV; 2329854e1bebe010a57b1d65b214db350027829d972Chris Lattner 2339854e1bebe010a57b1d65b214db350027829d972Chris Lattner const ConstantExpr *CE = cast<ConstantExpr>(C); 2349854e1bebe010a57b1d65b214db350027829d972Chris Lattner assert((CE->getOpcode() == Instruction::BitCast || 2359854e1bebe010a57b1d65b214db350027829d972Chris Lattner CE->getOpcode() == Instruction::GetElementPtr) && 2369854e1bebe010a57b1d65b214db350027829d972Chris Lattner "Unsupported aliasee"); 2379854e1bebe010a57b1d65b214db350027829d972Chris Lattner 2384255274cf82d181cad64794aac78b8c1e1a9d794Jay Foad return cast<GlobalValue>(CE->getOperand(0)); 2398b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov} 2408b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 24119e861a4ffb896f16a691d5ac869e894df3cd464Anton Korobeynikovconst GlobalValue *GlobalAlias::resolveAliasedGlobal(bool stopOnWeak) const { 24289a3d3f25cf58c940189d87356141d2610042d58Anton Korobeynikov SmallPtrSet<const GlobalValue*, 3> Visited; 243e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov 244832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov // Check if we need to stop early. 24586062afbc49b549a653d38fb03702051f3917df7Duncan Sands if (stopOnWeak && mayBeOverridden()) 246832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov return this; 247832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov 248e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov const GlobalValue *GV = getAliasedGlobal(); 249e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov Visited.insert(GV); 250e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov 251832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov // Iterate over aliasing chain, stopping on weak alias if necessary. 252e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov while (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV)) { 25386062afbc49b549a653d38fb03702051f3917df7Duncan Sands if (stopOnWeak && GA->mayBeOverridden()) 254832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov break; 255832b2a9cd8870211bf2d347d7b435beacbb06c8dAnton Korobeynikov 256e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov GV = GA->getAliasedGlobal(); 257e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov 258e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov if (!Visited.insert(GV)) 2599854e1bebe010a57b1d65b214db350027829d972Chris Lattner return 0; 260e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov } 261e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov 262e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov return GV; 263e846dd89c173d462d197046b76d37588896623f3Anton Korobeynikov} 264