[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
This commit is contained in:
Lang Hames 2015-02-10 07:35:39 +00:00
parent b7387a07d0
commit e65664e90d

View 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