From e65664e90da84395a0b6e65d7bd393a1e8a63533 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 10 Feb 2015 07:35:39 +0000 Subject: [PATCH] [Orc] Fix a bug in the LazyEmittingLayer - capture names by value (as 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 | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h b/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h index ebc28595f58..073fcb87be5 100644 --- a/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h +++ b/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h @@ -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 -- 2.11.0