[Orc] Fix a bug in the LazyEmittingLayer - capture names by value (as
authorLang Hames <lhames@gmail.com>
Tue, 10 Feb 2015 07:35:39 +0000 (07:35 +0000)
committerLang Hames <lhames@gmail.com>
Tue, 10 Feb 2015 07:35:39 +0000 (07:35 +0000)
std::strings) rather than StringRefs in JITSymbol get-address lambda.

Capturing a StringRef by-value is still effectively capturing a reference, which
is no good here because the referenced string may be gone by the time the lambda
is being evaluated the original value may be gone. Make sure to capture a
std::string instead.

No test case: This bug doesn't manifest under OrcMCJITReplacement, since it
keeps IR modules (from which the StringRefs are sourced) alive permanently.

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

include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h

index ebc28595f5899ae9a0e043bd1155263ce965a2e9..073fcb87be5762aaa7ec48daa2e860c176276dc8 100644 (file)
@@ -42,20 +42,24 @@ private:
     JITSymbol find(StringRef Name, bool ExportedSymbolsOnly, BaseLayerT &B) {
       switch (EmitState) {
       case NotEmitted:
-        if (provides(Name, ExportedSymbolsOnly))
+        if (provides(Name, ExportedSymbolsOnly)) {
+          // Create a std::string version of Name to capture here - the argument
+          // (a StringRef) may go away before the lambda is executed.
+          // FIXME: Use capture-init when we move to C++14. 
+          std::string PName = Name;
           return JITSymbol(
-              [this,ExportedSymbolsOnly,Name,&B]() -> TargetAddress {
+              [this, ExportedSymbolsOnly, PName, &B]() -> TargetAddress {
                 if (this->EmitState == Emitting)
                   return 0;
-                else if (this->EmitState != Emitted) {
+                else if (this->EmitState == NotEmitted) {
                   this->EmitState = Emitting;
                   Handle = this->emit(B);
                   this->EmitState = Emitted;
                 }
-                return B.findSymbolIn(Handle, Name, ExportedSymbolsOnly)
+                return B.findSymbolIn(Handle, PName, ExportedSymbolsOnly)
                           .getAddress();
               });
-        else
+        else
           return nullptr;
       case Emitting:
         // Calling "emit" can trigger external symbol lookup (e.g. to check for