Author: Vasileios Porpodas Date: 2023-02-13T18:45:12-08:00 New Revision: b64f7d028bdcaf679130afeed9518c09663f6dc8
URL: https://github.com/llvm/llvm-project/commit/b64f7d028bdcaf679130afeed9518c09663f6dc8 DIFF: https://github.com/llvm/llvm-project/commit/b64f7d028bdcaf679130afeed9518c09663f6dc8.diff LOG: [NFC][IR] Make Module::getAliasList() private This patch adds several missing AliasList modifier functions, like removeAlias(), eraseAlias() and insertAlias(). There is no longer need to access the list directly so it also makes getAliaList() private. Differential Revision: https://reviews.llvm.org/D143958 Added: Modified: lldb/source/Expression/IRExecutionUnit.cpp llvm/include/llvm/IR/Module.h llvm/lib/AsmParser/LLParser.cpp llvm/lib/IR/Globals.cpp llvm/lib/Transforms/IPO/GlobalOpt.cpp llvm/unittests/IR/ModuleTest.cpp Removed: ################################################################################ diff --git a/lldb/source/Expression/IRExecutionUnit.cpp b/lldb/source/Expression/IRExecutionUnit.cpp index c8068eca5c1b5..1a7373d0cbb8a 100644 --- a/lldb/source/Expression/IRExecutionUnit.cpp +++ b/lldb/source/Expression/IRExecutionUnit.cpp @@ -410,7 +410,7 @@ void IRExecutionUnit::GetRunnableInfo(Status &error, lldb::addr_t &func_addr, 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 index e86880406b7ea..920729f806660 100644 --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -563,6 +563,16 @@ class LLVM_EXTERNAL_VISIBILITY Module { 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 @@ class LLVM_EXTERNAL_VISIBILITY Module { static AliasListType Module::*getSublistAccess(GlobalAlias*) { return &Module::AliasList; } + friend class llvm::SymbolTableListTraits<llvm::GlobalAlias>; +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 index 077b290fe0e00..2db5e7dc140aa 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -1141,7 +1141,7 @@ bool LLParser::parseAliasOrIFunc(const std::string &Name, LocTy NameLoc, // 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 index a7c45730ff46c..7cf812c36984d 100644 --- a/llvm/lib/IR/Globals.cpp +++ b/llvm/lib/IR/Globals.cpp @@ -514,7 +514,7 @@ GlobalAlias::GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Link, AddressSpace) { setAliasee(Aliasee); if (ParentModule) - ParentModule->getAliasList().push_back(this); + ParentModule->insertAlias(this); } GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace, @@ -546,11 +546,11 @@ GlobalAlias *GlobalAlias::create(const Twine &Name, GlobalValue *Aliasee) { } 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 index 0317a8bcb6bc7..040701e243ce5 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -2360,7 +2360,7 @@ OptimizeGlobalAliases(Module &M, 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 index 4e2e394a92504..f9d682d87e7d1 100644 --- a/llvm/unittests/IR/ModuleTest.cpp +++ b/llvm/unittests/IR/ModuleTest.cpp @@ -159,4 +159,44 @@ TEST(ModuleTest, setPartialSampleProfileRatio) { 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<Module> 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 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits