From b64f7d028bdcaf679130afeed9518c09663f6dc8 Mon Sep 17 00:00:00 2001 From: Vasileios Porpodas Date: Mon, 6 Feb 2023 13:05:01 -0800 Subject: [PATCH] [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 --- lldb/source/Expression/IRExecutionUnit.cpp | 2 +- llvm/include/llvm/IR/Module.h | 12 +++++++++ llvm/lib/AsmParser/LLParser.cpp | 2 +- llvm/lib/IR/Globals.cpp | 6 ++--- llvm/lib/Transforms/IPO/GlobalOpt.cpp | 2 +- llvm/unittests/IR/ModuleTest.cpp | 40 ++++++++++++++++++++++++++++++ 6 files changed, 58 insertions(+), 6 deletions(-) diff --git a/lldb/source/Expression/IRExecutionUnit.cpp b/lldb/source/Expression/IRExecutionUnit.cpp index c8068ec..1a7373d 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 e868804..920729f 100644 --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -563,6 +563,16 @@ public: 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 @@ public: 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 index 077b290..2db5e7d 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 a7c4573..7cf812c 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 0317a8b..040701e 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 4e2e394..f9d682d 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 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 -- 2.7.4