[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