Reduce abuse of default values in the GlobalAlias constructor.

This is in preparation for adding an optional offset.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209073 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2014-05-17 19:57:46 +00:00
parent a2f8219646
commit fbd8cc0926
11 changed files with 52 additions and 28 deletions

View File

@ -40,9 +40,22 @@ public:
} }
/// If a parent module is specified, the alias is automatically inserted into /// If a parent module is specified, the alias is automatically inserted into
/// the end of the specified module's alias list. /// the end of the specified module's alias list.
GlobalAlias(Type *Ty, LinkageTypes Linkage, const Twine &Name = "", GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage,
GlobalObject *Aliasee = nullptr, Module *Parent = nullptr, const Twine &Name, GlobalObject *Aliasee, Module *Parent);
unsigned AddressSpace = 0);
// Without the Aliasee.
GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage,
const Twine &Name, Module *Parent);
// The module is taken from the Aliasee.
GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage,
const Twine &Name, GlobalObject *Aliasee);
// Type, Parent and AddressSpace taken from the Aliasee.
GlobalAlias(LinkageTypes Linkage, const Twine &Name, GlobalObject *Aliasee);
// Linkage, Type, Parent and AddressSpace taken from the Aliasee.
GlobalAlias(const Twine &Name, GlobalObject *Aliasee);
/// Provide fast operand accessors /// Provide fast operand accessors
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant); DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);

View File

@ -697,8 +697,8 @@ bool LLParser::ParseAlias(const std::string &Name, LocTy NameLoc,
// Okay, create the alias but do not insert it into the module yet. // Okay, create the alias but do not insert it into the module yet.
std::unique_ptr<GlobalAlias> GA( std::unique_ptr<GlobalAlias> GA(
new GlobalAlias(Ty, (GlobalValue::LinkageTypes)Linkage, Name, Aliasee, new GlobalAlias(Ty, AddrSpace, (GlobalValue::LinkageTypes)Linkage, Name,
/*Parent*/ nullptr, AddrSpace)); Aliasee, /*Parent*/ nullptr));
GA->setVisibility((GlobalValue::VisibilityTypes)Visibility); GA->setVisibility((GlobalValue::VisibilityTypes)Visibility);
GA->setDLLStorageClass((GlobalValue::DLLStorageClassTypes)DLLStorageClass); GA->setDLLStorageClass((GlobalValue::DLLStorageClassTypes)DLLStorageClass);

View File

@ -2004,8 +2004,8 @@ error_code BitcodeReader::ParseModule(bool Resume) {
return Error(InvalidTypeForValue); return Error(InvalidTypeForValue);
auto *NewGA = auto *NewGA =
new GlobalAlias(PTy->getElementType(), GetDecodedLinkage(Record[2]), new GlobalAlias(PTy->getElementType(), PTy->getAddressSpace(),
"", nullptr, TheModule, PTy->getAddressSpace()); GetDecodedLinkage(Record[2]), "", TheModule);
// Old bitcode files didn't have visibility field. // Old bitcode files didn't have visibility field.
// Local linkage must have default visibility. // Local linkage must have default visibility.
if (Record.size() > 3 && !NewGA->hasLocalLinkage()) if (Record.size() > 3 && !NewGA->hasLocalLinkage())

View File

@ -1489,9 +1489,9 @@ void LLVMSetExternallyInitialized(LLVMValueRef GlobalVar, LLVMBool IsExtInit) {
LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee, LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
const char *Name) { const char *Name) {
auto *PTy = cast<PointerType>(unwrap(Ty)); auto *PTy = cast<PointerType>(unwrap(Ty));
return wrap(new GlobalAlias( return wrap(new GlobalAlias(PTy->getElementType(), PTy->getAddressSpace(),
PTy->getElementType(), GlobalValue::ExternalLinkage, Name, GlobalValue::ExternalLinkage, Name,
unwrap<GlobalObject>(Aliasee), unwrap(M), PTy->getAddressSpace())); unwrap<GlobalObject>(Aliasee), unwrap(M)));
} }
/*--.. Operations on functions .............................................--*/ /*--.. Operations on functions .............................................--*/

View File

@ -213,9 +213,9 @@ void GlobalVariable::copyAttributesFrom(const GlobalValue *Src) {
// GlobalAlias Implementation // GlobalAlias Implementation
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
GlobalAlias::GlobalAlias(Type *Ty, LinkageTypes Link, const Twine &Name, GlobalAlias::GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Link,
GlobalObject *Aliasee, Module *ParentModule, const Twine &Name, GlobalObject *Aliasee,
unsigned AddressSpace) Module *ParentModule)
: GlobalValue(PointerType::get(Ty, AddressSpace), Value::GlobalAliasVal, : GlobalValue(PointerType::get(Ty, AddressSpace), Value::GlobalAliasVal,
&Op<0>(), 1, Link, Name) { &Op<0>(), 1, Link, Name) {
LeakDetector::addGarbageObject(this); LeakDetector::addGarbageObject(this);
@ -225,6 +225,23 @@ GlobalAlias::GlobalAlias(Type *Ty, LinkageTypes Link, const Twine &Name,
ParentModule->getAliasList().push_back(this); ParentModule->getAliasList().push_back(this);
} }
GlobalAlias::GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage,
const Twine &Name, Module *Parent)
: GlobalAlias(Ty, AddressSpace, Linkage, Name, nullptr, Parent) {}
GlobalAlias::GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage,
const Twine &Name, GlobalObject *Aliasee)
: GlobalAlias(Ty, AddressSpace, Linkage, Name, Aliasee,
Aliasee->getParent()) {}
GlobalAlias::GlobalAlias(LinkageTypes Link, const Twine &Name,
GlobalObject *Aliasee)
: GlobalAlias(Aliasee->getType()->getElementType(),
Aliasee->getType()->getAddressSpace(), Link, Name, Aliasee) {}
GlobalAlias::GlobalAlias(const Twine &Name, GlobalObject *Aliasee)
: GlobalAlias(Aliasee->getLinkage(), Name, Aliasee) {}
void GlobalAlias::setParent(Module *parent) { void GlobalAlias::setParent(Module *parent) {
if (getParent()) if (getParent())
LeakDetector::addGarbageObject(this); LeakDetector::addGarbageObject(this);

View File

@ -922,9 +922,8 @@ bool ModuleLinker::linkAliasProto(GlobalAlias *SGA) {
// If there is no linkage to be performed or we're linking from the source, // If there is no linkage to be performed or we're linking from the source,
// bring over SGA. // bring over SGA.
auto *PTy = cast<PointerType>(TypeMap.get(SGA->getType())); auto *PTy = cast<PointerType>(TypeMap.get(SGA->getType()));
auto *NewDA = auto *NewDA = new GlobalAlias(PTy->getElementType(), PTy->getAddressSpace(),
new GlobalAlias(PTy->getElementType(), SGA->getLinkage(), SGA->getName(), SGA->getLinkage(), SGA->getName(), DstM);
/*aliasee*/ nullptr, DstM, PTy->getAddressSpace());
copyGVAttributes(NewDA, SGA); copyGVAttributes(NewDA, SGA);
if (NewVisibility) if (NewVisibility)
NewDA->setVisibility(*NewVisibility); NewDA->setVisibility(*NewVisibility);

View File

@ -1328,8 +1328,8 @@ void MergeFunctions::writeThunk(Function *F, Function *G) {
// Replace G with an alias to F and delete G. // Replace G with an alias to F and delete G.
void MergeFunctions::writeAlias(Function *F, Function *G) { void MergeFunctions::writeAlias(Function *F, Function *G) {
PointerType *PTy = G->getType(); PointerType *PTy = G->getType();
auto *GA = new GlobalAlias(PTy->getElementType(), G->getLinkage(), "", F, auto *GA = new GlobalAlias(PTy->getElementType(), PTy->getAddressSpace(),
G->getParent(), PTy->getAddressSpace()); G->getLinkage(), "", F);
F->setAlignment(std::max(F->getAlignment(), G->getAlignment())); F->setAlignment(std::max(F->getAlignment(), G->getAlignment()));
GA->takeName(G); GA->takeName(G);
GA->setVisibility(G->getVisibility()); GA->setVisibility(G->getVisibility());

View File

@ -68,9 +68,8 @@ Module *llvm::CloneModule(const Module *M, ValueToValueMapTy &VMap) {
for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end(); for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end();
I != E; ++I) { I != E; ++I) {
auto *PTy = cast<PointerType>(I->getType()); auto *PTy = cast<PointerType>(I->getType());
auto *GA = auto *GA = new GlobalAlias(PTy->getElementType(), PTy->getAddressSpace(),
new GlobalAlias(PTy->getElementType(), I->getLinkage(), I->getName(), I->getLinkage(), I->getName(), New);
nullptr, New, PTy->getAddressSpace());
GA->copyAttributesFrom(I); GA->copyAttributesFrom(I);
VMap[I] = GA; VMap[I] = GA;
} }

View File

@ -274,8 +274,7 @@ TEST(ConstantsTest, ReplaceInAliasTest) {
Type *Int32Ty = Type::getInt32Ty(getGlobalContext()); Type *Int32Ty = Type::getInt32Ty(getGlobalContext());
auto *Global = cast<GlobalObject>(M->getOrInsertGlobal("dummy", Int32Ty)); auto *Global = cast<GlobalObject>(M->getOrInsertGlobal("dummy", Int32Ty));
auto *GA = new GlobalAlias(Int32Ty, GlobalValue::ExternalLinkage, "alias", auto *GA = new GlobalAlias(GlobalValue::ExternalLinkage, "alias", Global);
Global, M.get());
EXPECT_DEATH(Global->replaceAllUsesWith(GA), EXPECT_DEATH(Global->replaceAllUsesWith(GA),
"replaceAliasUseWith cannot form an alias cycle"); "replaceAliasUseWith cannot form an alias cycle");
} }

View File

@ -52,8 +52,7 @@ TEST(VerifierTest, AliasUnnamedAddr) {
GlobalVariable *Aliasee = new GlobalVariable(M, Ty, true, GlobalVariable *Aliasee = new GlobalVariable(M, Ty, true,
GlobalValue::ExternalLinkage, GlobalValue::ExternalLinkage,
Init, "foo"); Init, "foo");
auto *GA = auto *GA = new GlobalAlias(GlobalValue::ExternalLinkage, "bar", Aliasee);
new GlobalAlias(Ty, GlobalValue::ExternalLinkage, "bar", Aliasee, &M);
GA->setUnnamedAddr(true); GA->setUnnamedAddr(true);
std::string Error; std::string Error;
raw_string_ostream ErrorOS(Error); raw_string_ostream ErrorOS(Error);

View File

@ -35,9 +35,7 @@ protected:
} }
GlobalAlias *makeAlias(StringRef Name, GlobalObject *Aliasee) { GlobalAlias *makeAlias(StringRef Name, GlobalObject *Aliasee) {
return new GlobalAlias(Aliasee->getType()->getElementType(), return new GlobalAlias(GlobalValue::ExternalLinkage, Name, Aliasee);
GlobalValue::ExternalLinkage, Name, Aliasee,
Aliasee->getParent());
} }
SpecialCaseList *makeSpecialCaseList(StringRef List, std::string &Error) { SpecialCaseList *makeSpecialCaseList(StringRef List, std::string &Error) {