[llvm] r273470 - IR: Introduce Module::global_objects().
Mehdi Amini via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 15 17:19:04 PDT 2016
Thanks for this patch! This was on my todo-list to implement for a few months and I discover only today that you already went ahead :)
—
Mehdi
> On Jun 22, 2016, at 1:29 PM, Peter Collingbourne via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> Author: pcc
> Date: Wed Jun 22 15:29:42 2016
> New Revision: 273470
>
> URL: http://llvm.org/viewvc/llvm-project?rev=273470&view=rev
> Log:
> IR: Introduce Module::global_objects().
>
> This is a convenience iterator that allows clients to enumerate the
> GlobalObjects within a Module.
>
> Also start using it in a few places where it is obviously the right thing
> to use.
>
> Differential Revision: http://reviews.llvm.org/D21580
>
> Modified:
> llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h
> llvm/trunk/include/llvm/IR/Module.h
> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
> llvm/trunk/lib/IR/AsmWriter.cpp
> llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp
> llvm/trunk/test/CodeGen/XCore/linkage.ll
>
> Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=273470&r1=273469&r2=273470&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h Wed Jun 22 15:29:42 2016
> @@ -195,13 +195,8 @@ private:
> for (const auto &M : Ms) {
> Mangler Mang;
>
> - for (const auto &V : M->globals())
> - if (auto GV = addGlobalValue(*Symbols, V, Mang, SearchName,
> - ExportedSymbolsOnly))
> - return GV;
> -
> - for (const auto &F : *M)
> - if (auto GV = addGlobalValue(*Symbols, F, Mang, SearchName,
> + for (const auto &GO : M->global_objects())
> + if (auto GV = addGlobalValue(*Symbols, GO, Mang, SearchName,
> ExportedSymbolsOnly))
> return GV;
> }
>
> Modified: llvm/trunk/include/llvm/IR/Module.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Module.h?rev=273470&r1=273469&r2=273470&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/Module.h (original)
> +++ llvm/trunk/include/llvm/IR/Module.h Wed Jun 22 15:29:42 2016
> @@ -604,9 +604,78 @@ public:
> }
>
> /// @}
> -/// @name Named Metadata Iteration
> +/// @name Convenience iterators
> /// @{
>
> + template <bool IsConst> class global_object_iterator_t {
> + friend Module;
> +
> + typename std::conditional<IsConst, const_iterator, iterator>::type
> + function_i,
> + function_e;
> + typename std::conditional<IsConst, const_global_iterator,
> + global_iterator>::type global_i;
> +
> + typedef
> + typename std::conditional<IsConst, const Module, Module>::type ModuleTy;
> +
> + global_object_iterator_t(ModuleTy &M)
> + : function_i(M.begin()), function_e(M.end()),
> + global_i(M.global_begin()) {}
> + global_object_iterator_t(ModuleTy &M, int)
> + : function_i(M.end()), function_e(M.end()), global_i(M.global_end()) {}
> +
> + public:
> + global_object_iterator_t &operator++() {
> + if (function_i != function_e)
> + ++function_i;
> + else
> + ++global_i;
> + return *this;
> + }
> +
> + typename std::conditional<IsConst, const GlobalObject, GlobalObject>::type &
> + operator*() const {
> + if (function_i != function_e)
> + return *function_i;
> + else
> + return *global_i;
> + }
> +
> + bool operator!=(const global_object_iterator_t &other) const {
> + return function_i != other.function_i || global_i != other.global_i;
> + }
> + };
> +
> + typedef global_object_iterator_t</*IsConst=*/false> global_object_iterator;
> + typedef global_object_iterator_t</*IsConst=*/true>
> + const_global_object_iterator;
> +
> + global_object_iterator global_object_begin() {
> + return global_object_iterator(*this);
> + }
> + global_object_iterator global_object_end() {
> + return global_object_iterator(*this, 0);
> + }
> +
> + const_global_object_iterator global_object_begin() const {
> + return const_global_object_iterator(*this);
> + }
> + const_global_object_iterator global_object_end() const {
> + return const_global_object_iterator(*this, 0);
> + }
> +
> + iterator_range<global_object_iterator> global_objects() {
> + return make_range(global_object_begin(), global_object_end());
> + }
> + iterator_range<const_global_object_iterator> global_objects() const {
> + return make_range(global_object_begin(), global_object_end());
> + }
> +
> + /// @}
> + /// @name Named Metadata Iteration
> + /// @{
> +
> named_metadata_iterator named_metadata_begin() { return NamedMDList.begin(); }
> const_named_metadata_iterator named_metadata_begin() const {
> return NamedMDList.begin();
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=273470&r1=273469&r2=273470&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed Jun 22 15:29:42 2016
> @@ -1173,17 +1173,11 @@ bool AsmPrinter::doFinalization(Module &
> // to notice uses in operands (due to constant exprs etc). This should
> // happen with the MC stuff eventually.
>
> - // Print out module-level global variables here.
> - for (const auto &G : M.globals()) {
> - if (!G.hasExternalWeakLinkage())
> + // Print out module-level global objects here.
> + for (const auto &GO : M.global_objects()) {
> + if (!GO.hasExternalWeakLinkage())
> continue;
> - OutStreamer->EmitSymbolAttribute(getSymbol(&G), MCSA_WeakReference);
> - }
> -
> - for (const auto &F : M) {
> - if (!F.hasExternalWeakLinkage())
> - continue;
> - OutStreamer->EmitSymbolAttribute(getSymbol(&F), MCSA_WeakReference);
> + OutStreamer->EmitSymbolAttribute(getSymbol(&GO), MCSA_WeakReference);
> }
> }
>
>
> Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp?rev=273470&r1=273469&r2=273470&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp Wed Jun 22 15:29:42 2016
> @@ -235,10 +235,8 @@ void ExecutionEngine::clearAllGlobalMapp
> void ExecutionEngine::clearGlobalMappingsFromModule(Module *M) {
> MutexGuard locked(lock);
>
> - for (Function &FI : *M)
> - EEState.RemoveMapping(getMangledName(&FI));
> - for (GlobalVariable &GI : M->globals())
> - EEState.RemoveMapping(getMangledName(&GI));
> + for (GlobalObject &GO : M->global_objects())
> + EEState.RemoveMapping(getMangledName(&GO));
> }
>
> uint64_t ExecutionEngine::updateGlobalMapping(const GlobalValue *GV,
>
> Modified: llvm/trunk/lib/IR/AsmWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/AsmWriter.cpp?rev=273470&r1=273469&r2=273470&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/AsmWriter.cpp (original)
> +++ llvm/trunk/lib/IR/AsmWriter.cpp Wed Jun 22 15:29:42 2016
> @@ -2126,11 +2126,8 @@ AssemblyWriter::AssemblyWriter(formatted
> if (!TheModule)
> return;
> TypePrinter.incorporateTypes(*TheModule);
> - for (const Function &F : *TheModule)
> - if (const Comdat *C = F.getComdat())
> - Comdats.insert(C);
> - for (const GlobalVariable &GV : TheModule->globals())
> - if (const Comdat *C = GV.getComdat())
> + for (const GlobalObject &GO : TheModule->global_objects())
> + if (const Comdat *C = GO.getComdat())
> Comdats.insert(C);
> }
>
>
> Modified: llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp?rev=273470&r1=273469&r2=273470&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/GlobalDCE.cpp Wed Jun 22 15:29:42 2016
> @@ -96,21 +96,14 @@ PreservedAnalyses GlobalDCEPass::run(Mod
> ComdatMembers.insert(std::make_pair(C, &GA));
>
> // Loop over the module, adding globals which are obviously necessary.
> - for (Function &F : M) {
> - Changed |= RemoveUnusedGlobalValue(F);
> - // Functions with external linkage are needed if they have a body
> - if (!F.isDeclaration() && !F.hasAvailableExternallyLinkage())
> - if (!F.isDiscardableIfUnused())
> - GlobalIsNeeded(&F);
> - }
> -
> - for (GlobalVariable &GV : M.globals()) {
> - Changed |= RemoveUnusedGlobalValue(GV);
> + for (GlobalObject &GO : M.global_objects()) {
> + Changed |= RemoveUnusedGlobalValue(GO);
> + // Functions with external linkage are needed if they have a body.
> // Externally visible & appending globals are needed, if they have an
> // initializer.
> - if (!GV.isDeclaration() && !GV.hasAvailableExternallyLinkage())
> - if (!GV.isDiscardableIfUnused())
> - GlobalIsNeeded(&GV);
> + if (!GO.isDeclaration() && !GO.hasAvailableExternallyLinkage())
> + if (!GO.isDiscardableIfUnused())
> + GlobalIsNeeded(&GO);
> }
>
> for (GlobalAlias &GA : M.aliases()) {
>
> Modified: llvm/trunk/test/CodeGen/XCore/linkage.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/XCore/linkage.ll?rev=273470&r1=273469&r2=273470&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/XCore/linkage.ll (original)
> +++ llvm/trunk/test/CodeGen/XCore/linkage.ll Wed Jun 22 15:29:42 2016
> @@ -42,9 +42,8 @@ define protected void @test_protected()
>
> ; CHECK-NOT: .hidden test_hidden_declaration
>
> -; CHECK: .weak gr
> - at gr = extern_weak global i32
> -
> ; CHECK: .weak fr
> declare extern_weak void @fr(i32*, i32*)
>
> +; CHECK: .weak gr
> + at gr = extern_weak global i32
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list