]> granicus.if.org Git - llvm/commitdiff
[Orc] Fix member variable ordering issue in OrcMCJITReplacement.
authorLang Hames <lhames@gmail.com>
Wed, 30 Aug 2017 00:47:42 +0000 (00:47 +0000)
committerLang Hames <lhames@gmail.com>
Wed, 30 Aug 2017 00:47:42 +0000 (00:47 +0000)
https://reviews.llvm.org/D36888

From that review description:

When an OrcMCJITReplacement object gets destructed, LazyEmitLayer may still
contain a shared_ptr of a module, which requires ShouldDelete in the deleter.
But ShouldDelete gets destructed before LazyEmitLayer due to the order of
declaration in OrcMCJITReplacement, which leads to a crash, when the destructor
of LazyEmitLayer is executed.  Changing the order of declaration fixes this.

Patch by Moritz Kroll. Thanks Moritz!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312086 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/Orc/OrcMCJITReplacement.h

index a24f92b82fbfc505a24ccaaf167c5eb9a9b4fc40..743d5e2307cfc07176d9a5e29fce9de82d114ca7 100644 (file)
@@ -381,6 +381,9 @@ private:
   std::shared_ptr<JITSymbolResolver> ClientResolver;
   Mangler Mang;
 
+  std::map<Module*, bool> ShouldDelete;
+  std::vector<std::shared_ptr<Module>> LocalModules;
+
   NotifyObjectLoadedT NotifyObjectLoaded;
   NotifyFinalizedT NotifyFinalized;
 
@@ -402,8 +405,6 @@ private:
   std::map<ObjectLayerT::ObjHandleT, SectionAddrSet, ObjHandleCompare>
       UnfinalizedSections;
 
-  std::map<Module*, bool> ShouldDelete;
-  std::vector<std::shared_ptr<Module>> LocalModules;
   std::vector<object::OwningBinary<object::Archive>> Archives;
 };