Record all translation units with more than one function in them (e.g., blocks).
authorSean Callanan <scallanan@apple.com>
Sat, 26 Mar 2016 00:30:40 +0000 (00:30 +0000)
committerSean Callanan <scallanan@apple.com>
Sat, 26 Mar 2016 00:30:40 +0000 (00:30 +0000)
Blocks and lambdas have their implementation functions stored in the IR for an
expression.  If we put the block/lambda into a result variable it needs to stay
around.  As a heuristic, remember any execution unit that has more than one
function in it.

<rdar://problem/22864976>

llvm-svn: 264483

lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp

index 9bf8cd5..6da103e 100644 (file)
@@ -577,12 +577,18 @@ ClangUserExpression::Parse(DiagnosticManager &diagnostic_manager, ExecutionConte
         {
             register_execution_unit = true;
         }
+        
+        // If there is more than one external function in the execution
+        // unit, it needs to keep living even if it's not top level, because
+        // the result could refer to that function.
+        
+        if (m_execution_unit_sp->GetJittedFunctions().size() > 1)
+        {
+            register_execution_unit = true;
+        }
 
         if (register_execution_unit)
         {
-            // We currently key off there being more than one external function in the execution
-            // unit to determine whether it needs to live in the process.
-
             llvm::cast<PersistentExpressionState>(
                 exe_ctx.GetTargetPtr()->GetPersistentExpressionStateForLanguage(m_language))
                 ->RegisterExecutionUnit(m_execution_unit_sp);