diff --git a/lldb/source/Expression/IRExecutionUnit.cpp b/lldb/source/Expression/IRExecutionUnit.cpp --- a/lldb/source/Expression/IRExecutionUnit.cpp +++ b/lldb/source/Expression/IRExecutionUnit.cpp @@ -410,7 +410,7 @@ RegisterOneValue(global_var); } - for (llvm::GlobalAlias &global_alias : m_module->getAliasList()) { + for (llvm::GlobalAlias &global_alias : m_module->getAliases()) { RegisterOneValue(global_alias); } diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -563,6 +563,16 @@ return &Module::FunctionList; } + /// Detach \p Alias from the list but don't delete it. + void removeAlias(GlobalAlias *Alias) { AliasList.remove(Alias); } + /// Remove \p Alias from the list and delete it. + void eraseAlias(GlobalAlias *Alias) { AliasList.erase(Alias); } + /// Insert \p Alias at the end of the alias list and take ownership. + void insertAlias(GlobalAlias *Alias) { AliasList.insert(AliasList.end(), Alias); } + // Use alias_size() to get the size of AliasList. + // Use aliases() to get a range of all Alias objects in AliasList. + +private: // Please use functions like insertAlias(), removeAlias() etc. /// Get the Module's list of aliases (constant). const AliasListType &getAliasList() const { return AliasList; } /// Get the Module's list of aliases. @@ -571,7 +581,9 @@ static AliasListType Module::*getSublistAccess(GlobalAlias*) { return &Module::AliasList; } + friend class llvm::SymbolTableListTraits; +public: /// Get the Module's list of ifuncs (constant). const IFuncListType &getIFuncList() const { return IFuncList; } /// Get the Module's list of ifuncs. diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -1141,7 +1141,7 @@ // Insert into the module, we know its name won't collide now. if (IsAlias) - M->getAliasList().push_back(GA.release()); + M->insertAlias(GA.release()); else M->getIFuncList().push_back(GI.release()); assert(GV->getName() == Name && "Should not be a name conflict!"); diff --git a/llvm/lib/IR/Globals.cpp b/llvm/lib/IR/Globals.cpp --- a/llvm/lib/IR/Globals.cpp +++ b/llvm/lib/IR/Globals.cpp @@ -514,7 +514,7 @@ AddressSpace) { setAliasee(Aliasee); if (ParentModule) - ParentModule->getAliasList().push_back(this); + ParentModule->insertAlias(this); } GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace, @@ -546,11 +546,11 @@ } void GlobalAlias::removeFromParent() { - getParent()->getAliasList().remove(getIterator()); + getParent()->removeAlias(this); } void GlobalAlias::eraseFromParent() { - getParent()->getAliasList().erase(getIterator()); + getParent()->eraseAlias(this); } void GlobalAlias::setAliasee(Constant *Aliasee) { diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -2360,7 +2360,7 @@ continue; // Delete the alias. - M.getAliasList().erase(&J); + M.eraseAlias(&J); ++NumAliasesRemoved; Changed = true; } diff --git a/llvm/unittests/IR/ModuleTest.cpp b/llvm/unittests/IR/ModuleTest.cpp --- a/llvm/unittests/IR/ModuleTest.cpp +++ b/llvm/unittests/IR/ModuleTest.cpp @@ -159,4 +159,44 @@ EXPECT_EQ(Ratio, ProfileSummary->getPartialProfileRatio()); } +TEST(ModuleTest, AliasList) { + // This tests all Module's functions that interact with Module::AliasList. + LLVMContext C; + SMDiagnostic Err; + LLVMContext Context; + std::unique_ptr M = parseAssemblyString(R"( +declare void @Foo() +@GA = alias void (), ptr @Foo +)", + Err, Context); + Function *Foo = M->getFunction("Foo"); + auto *GA = M->getNamedAlias("GA"); + EXPECT_EQ(M->alias_size(), 1u); + auto *NewGA = + GlobalAlias::create(Foo->getType(), 0, GlobalValue::ExternalLinkage, + "NewGA", Foo, /*Parent=*/nullptr); + EXPECT_EQ(M->alias_size(), 1u); + + M->insertAlias(NewGA); + EXPECT_EQ(&*std::prev(M->aliases().end()), NewGA); + + M->removeAlias(NewGA); + EXPECT_EQ(M->alias_size(), 1u); + M->insertAlias(NewGA); + EXPECT_EQ(M->alias_size(), 2u); + EXPECT_EQ(&*std::prev(M->aliases().end()), NewGA); + + auto Range = M->aliases(); + EXPECT_EQ(&*Range.begin(), GA); + EXPECT_EQ(&*std::next(Range.begin()), NewGA); + EXPECT_EQ(std::next(Range.begin(), 2), Range.end()); + + M->removeAlias(NewGA); + EXPECT_EQ(M->alias_size(), 1u); + + M->insertAlias(NewGA); + M->eraseAlias(NewGA); + EXPECT_EQ(M->alias_size(), 1u); +} + } // end namespace