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