blob: a756e2b3d1eab0f04aa0c416c2f5051bea4f491a [file] [log] [blame]
Sean Callanan79763a42011-05-23 21:40:23 +00001//===-- ClangUserExpression.cpp ---------------------------------*- C++ -*-===//
Sean Callanan1a8d4092010-08-27 01:01:44 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Sean Callanan1a8d4092010-08-27 01:01:44 +000010#include <stdio.h>
11#if HAVE_SYS_TYPES_H
12# include <sys/types.h>
13#endif
14
Sean Callanan1a8d4092010-08-27 01:01:44 +000015#include <cstdlib>
16#include <string>
17#include <map>
18
Sean Callanan4dbb2712015-09-25 20:35:58 +000019#include "ClangUserExpression.h"
20
21#include "ASTResultSynthesizer.h"
22#include "ClangExpressionDeclMap.h"
23#include "ClangExpressionParser.h"
24#include "ClangModulesDeclVendor.h"
25#include "ClangPersistentVariables.h"
Jim Inghama1e541b2016-03-25 01:57:14 +000026#include "ClangDiagnostic.h"
Sean Callanan4dbb2712015-09-25 20:35:58 +000027
Sean Callanan1a8d4092010-08-27 01:01:44 +000028#include "lldb/Core/ConstString.h"
Sean Callananbda7ef82016-06-22 17:32:17 +000029#include "lldb/Core/Debugger.h"
Sean Callanan1a8d4092010-08-27 01:01:44 +000030#include "lldb/Core/Log.h"
Greg Clayton23f8c952014-03-24 23:10:19 +000031#include "lldb/Core/Module.h"
Greg Claytonc4e411f2011-01-18 19:36:39 +000032#include "lldb/Core/StreamFile.h"
Sean Callanan1a8d4092010-08-27 01:01:44 +000033#include "lldb/Core/StreamString.h"
Greg Claytonb71f3842010-10-05 03:13:51 +000034#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan9bc83842011-09-26 18:45:31 +000035#include "lldb/Expression/ExpressionSourceCode.h"
Sean Callanan14b1bae2013-04-16 23:25:35 +000036#include "lldb/Expression/IRExecutionUnit.h"
Sean Callanan1582ee62013-04-18 22:06:33 +000037#include "lldb/Expression/IRInterpreter.h"
Sean Callanan96d27302013-04-11 00:09:05 +000038#include "lldb/Expression/Materializer.h"
Zachary Turner97a14e62014-08-19 17:18:29 +000039#include "lldb/Host/HostInfo.h"
Greg Clayton1f746072012-08-29 21:13:06 +000040#include "lldb/Symbol/Block.h"
Jim Ingham5fdeed42012-10-30 23:35:54 +000041#include "lldb/Symbol/ClangASTContext.h"
42#include "lldb/Symbol/Function.h"
Greg Clayton23f8c952014-03-24 23:10:19 +000043#include "lldb/Symbol/ObjectFile.h"
44#include "lldb/Symbol/SymbolVendor.h"
Jim Ingham5fdeed42012-10-30 23:35:54 +000045#include "lldb/Symbol/Type.h"
46#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Sean Callananfc55f5d2010-09-21 00:44:12 +000047#include "lldb/Symbol/VariableList.h"
Sean Callanan1a8d4092010-08-27 01:01:44 +000048#include "lldb/Target/ExecutionContext.h"
Greg Clayton8f343b02010-11-04 01:54:29 +000049#include "lldb/Target/Process.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000050#include "lldb/Target/StackFrame.h"
Sean Callanan1a8d4092010-08-27 01:01:44 +000051#include "lldb/Target/Target.h"
Jim Inghamf48169b2010-11-30 02:22:11 +000052#include "lldb/Target/ThreadPlan.h"
53#include "lldb/Target/ThreadPlanCallUserExpression.h"
Sean Callanan1a8d4092010-08-27 01:01:44 +000054
Sean Callanan72e49402011-08-05 23:43:37 +000055#include "clang/AST/DeclCXX.h"
56#include "clang/AST/DeclObjC.h"
57
Sean Callanan1a8d4092010-08-27 01:01:44 +000058using namespace lldb_private;
59
Sean Callanan00294b32016-03-22 21:05:51 +000060ClangUserExpression::ClangUserExpression(ExecutionContextScope &exe_scope, const char *expr, const char *expr_prefix,
61 lldb::LanguageType language, ResultType desired_type,
62 const EvaluateExpressionOptions &options)
63 : LLVMUserExpression(exe_scope, expr, expr_prefix, language, desired_type, options),
64 m_type_system_helper(*m_target_wp.lock().get(), options.GetExecutionPolicy() == eExecutionPolicyTopLevel)
Sean Callanan1a8d4092010-08-27 01:01:44 +000065{
Sean Callananc7b65062011-11-07 23:35:40 +000066 switch (m_language)
67 {
Sean Callanan00294b32016-03-22 21:05:51 +000068 case lldb::eLanguageTypeC_plus_plus:
69 m_allow_cxx = true;
70 break;
71 case lldb::eLanguageTypeObjC:
72 m_allow_objc = true;
73 break;
74 case lldb::eLanguageTypeObjC_plus_plus:
75 default:
76 m_allow_cxx = true;
77 m_allow_objc = true;
78 break;
Sean Callananc7b65062011-11-07 23:35:40 +000079 }
Sean Callanan1a8d4092010-08-27 01:01:44 +000080}
81
Sean Callanane71d5532010-08-27 23:31:21 +000082ClangUserExpression::~ClangUserExpression ()
83{
Sean Callanan1a8d4092010-08-27 01:01:44 +000084}
85
Sean Callananfc55f5d2010-09-21 00:44:12 +000086void
Sean Callanan744756e2011-11-04 02:09:33 +000087ClangUserExpression::ScanContext(ExecutionContext &exe_ctx, Error &err)
Sean Callananfc55f5d2010-09-21 00:44:12 +000088{
Greg Clayton5160ce52013-03-27 23:08:40 +000089 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan70385082012-12-01 00:08:33 +000090
91 if (log)
92 log->Printf("ClangUserExpression::ScanContext()");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000093
Greg Claytonc14ee322011-09-22 04:58:26 +000094 m_target = exe_ctx.GetTargetPtr();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000095
Sean Callananc7b65062011-11-07 23:35:40 +000096 if (!(m_allow_cxx || m_allow_objc))
Sean Callanan70385082012-12-01 00:08:33 +000097 {
98 if (log)
99 log->Printf(" [CUE::SC] Settings inhibit C++ and Objective-C");
Sean Callananc7b65062011-11-07 23:35:40 +0000100 return;
Sean Callanan70385082012-12-01 00:08:33 +0000101 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000102
Jason Molendab57e4a12013-11-04 09:33:30 +0000103 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Claytonc14ee322011-09-22 04:58:26 +0000104 if (frame == NULL)
Sean Callanan70385082012-12-01 00:08:33 +0000105 {
106 if (log)
107 log->Printf(" [CUE::SC] Null stack frame");
Sean Callananfc55f5d2010-09-21 00:44:12 +0000108 return;
Sean Callanan70385082012-12-01 00:08:33 +0000109 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000110
Sean Callanan5dd6c3d2012-07-13 21:20:29 +0000111 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | lldb::eSymbolContextBlock);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000112
Sean Callanan72e49402011-08-05 23:43:37 +0000113 if (!sym_ctx.function)
Sean Callanan70385082012-12-01 00:08:33 +0000114 {
115 if (log)
116 log->Printf(" [CUE::SC] Null function");
Sean Callanan72e49402011-08-05 23:43:37 +0000117 return;
Sean Callanan70385082012-12-01 00:08:33 +0000118 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000119
Greg Clayton685c88c2012-07-14 00:53:55 +0000120 // Find the block that defines the function represented by "sym_ctx"
121 Block *function_block = sym_ctx.GetFunctionBlock();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000122
Greg Clayton685c88c2012-07-14 00:53:55 +0000123 if (!function_block)
Sean Callanan70385082012-12-01 00:08:33 +0000124 {
125 if (log)
126 log->Printf(" [CUE::SC] Null function block");
Greg Clayton685c88c2012-07-14 00:53:55 +0000127 return;
Sean Callanan70385082012-12-01 00:08:33 +0000128 }
Greg Clayton685c88c2012-07-14 00:53:55 +0000129
Greg Clayton99558cc42015-08-24 23:46:31 +0000130 CompilerDeclContext decl_context = function_block->GetDeclContext();
Greg Clayton685c88c2012-07-14 00:53:55 +0000131
Sean Callanan72e49402011-08-05 23:43:37 +0000132 if (!decl_context)
Sean Callanan70385082012-12-01 00:08:33 +0000133 {
134 if (log)
135 log->Printf(" [CUE::SC] Null decl context");
Sean Callanan72e49402011-08-05 23:43:37 +0000136 return;
Sean Callanan70385082012-12-01 00:08:33 +0000137 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000138
Greg Clayton99558cc42015-08-24 23:46:31 +0000139 if (clang::CXXMethodDecl *method_decl = ClangASTContext::DeclContextGetAsCXXMethodDecl(decl_context))
Sean Callanan3670ba52010-12-01 21:35:54 +0000140 {
Sean Callananc7b65062011-11-07 23:35:40 +0000141 if (m_allow_cxx && method_decl->isInstance())
Sean Callanan3670ba52010-12-01 21:35:54 +0000142 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000143 if (m_enforce_valid_object)
Sean Callanan744756e2011-11-04 02:09:33 +0000144 {
Greg Clayton685c88c2012-07-14 00:53:55 +0000145 lldb::VariableListSP variable_list_sp (function_block->GetBlockVariableList (true));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000146
Sean Callanand5cc1322011-12-13 01:42:04 +0000147 const char *thisErrorString = "Stopped in a C++ method, but 'this' isn't available; pretending we are in a generic context";
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000148
Greg Clayton685c88c2012-07-14 00:53:55 +0000149 if (!variable_list_sp)
Sean Callanand5cc1322011-12-13 01:42:04 +0000150 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000151 err.SetErrorString(thisErrorString);
152 return;
153 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000154
Greg Clayton685c88c2012-07-14 00:53:55 +0000155 lldb::VariableSP this_var_sp (variable_list_sp->FindVariable(ConstString("this")));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000156
Greg Clayton685c88c2012-07-14 00:53:55 +0000157 if (!this_var_sp ||
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000158 !this_var_sp->IsInScope(frame) ||
Greg Clayton685c88c2012-07-14 00:53:55 +0000159 !this_var_sp->LocationIsValidForFrame (frame))
Sean Callanand5cc1322011-12-13 01:42:04 +0000160 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000161 err.SetErrorString(thisErrorString);
162 return;
163 }
Sean Callanan744756e2011-11-04 02:09:33 +0000164 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000165
Dawn Perchik53f34c82015-07-01 00:54:02 +0000166 m_in_cplusplus_method = true;
Sean Callanan9bc83842011-09-26 18:45:31 +0000167 m_needs_object_ptr = true;
Sean Callanan3670ba52010-12-01 21:35:54 +0000168 }
169 }
Greg Clayton99558cc42015-08-24 23:46:31 +0000170 else if (clang::ObjCMethodDecl *method_decl = ClangASTContext::DeclContextGetAsObjCMethodDecl(decl_context))
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000171 {
Sean Callanand5c17ed2011-11-15 02:11:17 +0000172 if (m_allow_objc)
Sean Callanan9bc83842011-09-26 18:45:31 +0000173 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000174 if (m_enforce_valid_object)
Sean Callanan744756e2011-11-04 02:09:33 +0000175 {
Greg Clayton685c88c2012-07-14 00:53:55 +0000176 lldb::VariableListSP variable_list_sp (function_block->GetBlockVariableList (true));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000177
Sean Callanand5cc1322011-12-13 01:42:04 +0000178 const char *selfErrorString = "Stopped in an Objective-C method, but 'self' isn't available; pretending we are in a generic context";
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000179
Greg Clayton685c88c2012-07-14 00:53:55 +0000180 if (!variable_list_sp)
Sean Callanand5cc1322011-12-13 01:42:04 +0000181 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000182 err.SetErrorString(selfErrorString);
183 return;
184 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000185
Greg Clayton685c88c2012-07-14 00:53:55 +0000186 lldb::VariableSP self_variable_sp = variable_list_sp->FindVariable(ConstString("self"));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000187
188 if (!self_variable_sp ||
189 !self_variable_sp->IsInScope(frame) ||
Greg Clayton685c88c2012-07-14 00:53:55 +0000190 !self_variable_sp->LocationIsValidForFrame (frame))
Sean Callanand5cc1322011-12-13 01:42:04 +0000191 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000192 err.SetErrorString(selfErrorString);
193 return;
194 }
Sean Callanan744756e2011-11-04 02:09:33 +0000195 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000196
Dawn Perchik53f34c82015-07-01 00:54:02 +0000197 m_in_objectivec_method = true;
Sean Callanan9bc83842011-09-26 18:45:31 +0000198 m_needs_object_ptr = true;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000199
Sean Callanand5c17ed2011-11-15 02:11:17 +0000200 if (!method_decl->isInstanceMethod())
Dawn Perchik53f34c82015-07-01 00:54:02 +0000201 m_in_static_method = true;
Sean Callanan9bc83842011-09-26 18:45:31 +0000202 }
Sean Callanan3670ba52010-12-01 21:35:54 +0000203 }
Greg Clayton99558cc42015-08-24 23:46:31 +0000204 else if (clang::FunctionDecl *function_decl = ClangASTContext::DeclContextGetAsFunctionDecl(decl_context))
Jim Ingham5fdeed42012-10-30 23:35:54 +0000205 {
206 // We might also have a function that said in the debug information that it captured an
Dawn Perchik508f0402015-07-01 17:41:02 +0000207 // object pointer. The best way to deal with getting to the ivars at present is by pretending
Jim Ingham5fdeed42012-10-30 23:35:54 +0000208 // that this is a method of a class in whatever runtime the debug info says the object pointer
209 // belongs to. Do that here.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000210
Greg Clayton99558cc42015-08-24 23:46:31 +0000211 ClangASTMetadata *metadata = ClangASTContext::DeclContextGetMetaData (decl_context, function_decl);
Jim Ingham5fdeed42012-10-30 23:35:54 +0000212 if (metadata && metadata->HasObjectPtr())
213 {
214 lldb::LanguageType language = metadata->GetObjectPtrLanguage();
215 if (language == lldb::eLanguageTypeC_plus_plus)
216 {
Sean Callanana2868d42013-01-19 01:49:02 +0000217 if (m_enforce_valid_object)
218 {
219 lldb::VariableListSP variable_list_sp (function_block->GetBlockVariableList (true));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000220
Sean Callanana2868d42013-01-19 01:49:02 +0000221 const char *thisErrorString = "Stopped in a context claiming to capture a C++ object pointer, but 'this' isn't available; pretending we are in a generic context";
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000222
Sean Callanana2868d42013-01-19 01:49:02 +0000223 if (!variable_list_sp)
224 {
225 err.SetErrorString(thisErrorString);
226 return;
227 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000228
Sean Callanana2868d42013-01-19 01:49:02 +0000229 lldb::VariableSP this_var_sp (variable_list_sp->FindVariable(ConstString("this")));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000230
Sean Callanana2868d42013-01-19 01:49:02 +0000231 if (!this_var_sp ||
232 !this_var_sp->IsInScope(frame) ||
233 !this_var_sp->LocationIsValidForFrame (frame))
234 {
235 err.SetErrorString(thisErrorString);
236 return;
237 }
238 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000239
Dawn Perchik53f34c82015-07-01 00:54:02 +0000240 m_in_cplusplus_method = true;
Jim Ingham5fdeed42012-10-30 23:35:54 +0000241 m_needs_object_ptr = true;
242 }
243 else if (language == lldb::eLanguageTypeObjC)
244 {
Sean Callanana2868d42013-01-19 01:49:02 +0000245 if (m_enforce_valid_object)
246 {
247 lldb::VariableListSP variable_list_sp (function_block->GetBlockVariableList (true));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000248
Sean Callanana2868d42013-01-19 01:49:02 +0000249 const char *selfErrorString = "Stopped in a context claiming to capture an Objective-C object pointer, but 'self' isn't available; pretending we are in a generic context";
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000250
Sean Callanana2868d42013-01-19 01:49:02 +0000251 if (!variable_list_sp)
252 {
253 err.SetErrorString(selfErrorString);
254 return;
255 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000256
Sean Callanana2868d42013-01-19 01:49:02 +0000257 lldb::VariableSP self_variable_sp = variable_list_sp->FindVariable(ConstString("self"));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000258
Sean Callanana2868d42013-01-19 01:49:02 +0000259 if (!self_variable_sp ||
260 !self_variable_sp->IsInScope(frame) ||
261 !self_variable_sp->LocationIsValidForFrame (frame))
262 {
263 err.SetErrorString(selfErrorString);
264 return;
265 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000266
Sean Callanana2868d42013-01-19 01:49:02 +0000267 Type *self_type = self_variable_sp->GetType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000268
Sean Callanana2868d42013-01-19 01:49:02 +0000269 if (!self_type)
270 {
271 err.SetErrorString(selfErrorString);
272 return;
273 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000274
Greg Clayton99558cc42015-08-24 23:46:31 +0000275 CompilerType self_clang_type = self_type->GetForwardCompilerType ();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000276
Greg Clayton57ee3062013-07-11 22:46:58 +0000277 if (!self_clang_type)
Sean Callanana2868d42013-01-19 01:49:02 +0000278 {
279 err.SetErrorString(selfErrorString);
280 return;
281 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000282
Greg Claytond8d4a572015-08-11 21:38:15 +0000283 if (ClangASTContext::IsObjCClassType(self_clang_type))
Sean Callanana2868d42013-01-19 01:49:02 +0000284 {
285 return;
286 }
Greg Claytond8d4a572015-08-11 21:38:15 +0000287 else if (ClangASTContext::IsObjCObjectPointerType(self_clang_type))
Sean Callanana2868d42013-01-19 01:49:02 +0000288 {
Dawn Perchik53f34c82015-07-01 00:54:02 +0000289 m_in_objectivec_method = true;
Sean Callanana2868d42013-01-19 01:49:02 +0000290 m_needs_object_ptr = true;
291 }
292 else
293 {
294 err.SetErrorString(selfErrorString);
295 return;
296 }
297 }
298 else
299 {
Dawn Perchik53f34c82015-07-01 00:54:02 +0000300 m_in_objectivec_method = true;
Sean Callanana2868d42013-01-19 01:49:02 +0000301 m_needs_object_ptr = true;
302 }
Jim Ingham5fdeed42012-10-30 23:35:54 +0000303 }
304 }
305 }
Sean Callananfc55f5d2010-09-21 00:44:12 +0000306}
307
Sean Callanancf5498f2010-10-22 23:25:16 +0000308// This is a really nasty hack, meant to fix Objective-C expressions of the form
309// (int)[myArray count]. Right now, because the type information for count is
310// not available, [myArray count] returns id, which can't be directly cast to
311// int without causing a clang error.
312static void
313ApplyObjcCastHack(std::string &expr)
314{
315#define OBJC_CAST_HACK_FROM "(int)["
316#define OBJC_CAST_HACK_TO "(int)(long long)["
317
318 size_t from_offset;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000319
Sean Callanancf5498f2010-10-22 23:25:16 +0000320 while ((from_offset = expr.find(OBJC_CAST_HACK_FROM)) != expr.npos)
321 expr.replace(from_offset, sizeof(OBJC_CAST_HACK_FROM) - 1, OBJC_CAST_HACK_TO);
322
323#undef OBJC_CAST_HACK_TO
324#undef OBJC_CAST_HACK_FROM
325}
326
327bool
Sean Callanan579e70c2016-03-19 00:03:59 +0000328ClangUserExpression::Parse(DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
329 lldb_private::ExecutionPolicy execution_policy, bool keep_result_in_memory,
330 bool generate_debug_info)
Sean Callanan1a8d4092010-08-27 01:01:44 +0000331{
Greg Clayton5160ce52013-03-27 23:08:40 +0000332 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000333
Sean Callanan744756e2011-11-04 02:09:33 +0000334 Error err;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000335
Sean Callanan933693b2012-02-10 01:22:05 +0000336 InstallContext(exe_ctx);
Sean Callanan9fda9d22015-10-03 09:09:01 +0000337
338 if (Target *target = exe_ctx.GetTargetPtr())
339 {
340 if (PersistentExpressionState *persistent_state = target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC))
341 {
342 m_result_delegate.RegisterPersistentState(persistent_state);
343 }
344 else
345 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000346 diagnostic_manager.PutCString(eDiagnosticSeverityError, "couldn't start parsing (no persistent data)");
Sean Callanan9fda9d22015-10-03 09:09:01 +0000347 return false;
348 }
349 }
350 else
351 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000352 diagnostic_manager.PutCString(eDiagnosticSeverityError, "error: couldn't start parsing (no target)");
Sean Callanan9fda9d22015-10-03 09:09:01 +0000353 return false;
354 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000355
Sean Callanan744756e2011-11-04 02:09:33 +0000356 ScanContext(exe_ctx, err);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000357
Sean Callanan744756e2011-11-04 02:09:33 +0000358 if (!err.Success())
359 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000360 diagnostic_manager.PutCString(eDiagnosticSeverityWarning, err.AsCString());
Sean Callanan744756e2011-11-04 02:09:33 +0000361 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000362
Sean Callananfc55f5d2010-09-21 00:44:12 +0000363 ////////////////////////////////////
364 // Generate the expression
365 //
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000366
Sean Callanancf5498f2010-10-22 23:25:16 +0000367 ApplyObjcCastHack(m_expr_text);
Greg Clayton73b472d2010-10-27 03:32:59 +0000368 //ApplyUnicharHack(m_expr_text);
Sean Callananfc55f5d2010-09-21 00:44:12 +0000369
Sean Callananb8bf6ef2015-04-14 18:36:17 +0000370 std::string prefix = m_expr_prefix;
371
372 if (ClangModulesDeclVendor *decl_vendor = m_target->GetClangModulesDeclVendor())
373 {
Sean Callananb92bd752015-10-01 16:28:02 +0000374 const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = llvm::cast<ClangPersistentVariables>(m_target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC))->GetHandLoadedClangModules();
Sean Callananf0c5aeb2015-04-20 16:31:29 +0000375 ClangModulesDeclVendor::ModuleVector modules_for_macros;
376
377 for (ClangModulesDeclVendor::ModuleID module : hand_imported_modules)
378 {
379 modules_for_macros.push_back(module);
380 }
381
382 if (m_target->GetEnableAutoImportClangModules())
383 {
384 if (StackFrame *frame = exe_ctx.GetFramePtr())
385 {
386 if (Block *block = frame->GetFrameBlock())
387 {
388 SymbolContext sc;
389
390 block->CalculateSymbolContext(&sc);
391
392 if (sc.comp_unit)
393 {
394 StreamString error_stream;
395
396 decl_vendor->AddModulesForCompileUnit(*sc.comp_unit, modules_for_macros, error_stream);
397 }
398 }
399 }
400 }
Sean Callananb8bf6ef2015-04-14 18:36:17 +0000401 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000402
Jim Inghame5ee6f02016-03-29 22:00:08 +0000403 lldb::LanguageType lang_type = lldb::eLanguageTypeUnknown;
404
Sean Callanan00294b32016-03-22 21:05:51 +0000405 if (m_options.GetExecutionPolicy() == eExecutionPolicyTopLevel)
Sean Callananfc55f5d2010-09-21 00:44:12 +0000406 {
Sean Callanan00294b32016-03-22 21:05:51 +0000407 m_transformed_text = m_expr_text;
408 }
409 else
410 {
411 std::unique_ptr<ExpressionSourceCode> source_code(
412 ExpressionSourceCode::CreateWrapped(prefix.c_str(), m_expr_text.c_str()));
413
Sean Callanan00294b32016-03-22 21:05:51 +0000414 if (m_in_cplusplus_method)
415 lang_type = lldb::eLanguageTypeC_plus_plus;
416 else if (m_in_objectivec_method)
417 lang_type = lldb::eLanguageTypeObjC;
418 else
419 lang_type = lldb::eLanguageTypeC;
420
Sean Callanan7736a202016-04-29 18:09:03 +0000421 if (!source_code->GetText(m_transformed_text, lang_type, m_in_static_method, exe_ctx))
Sean Callanan00294b32016-03-22 21:05:51 +0000422 {
423 diagnostic_manager.PutCString(eDiagnosticSeverityError, "couldn't construct expression body");
424 return false;
425 }
Sean Callananfc55f5d2010-09-21 00:44:12 +0000426 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000427
Sean Callananfc55f5d2010-09-21 00:44:12 +0000428 if (log)
429 log->Printf("Parsing the following code:\n%s", m_transformed_text.c_str());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000430
Sean Callanan1a8d4092010-08-27 01:01:44 +0000431 ////////////////////////////////////
432 // Set up the target and compiler
433 //
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000434
Greg Claytonc14ee322011-09-22 04:58:26 +0000435 Target *target = exe_ctx.GetTargetPtr();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000436
Sean Callanan1a8d4092010-08-27 01:01:44 +0000437 if (!target)
438 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000439 diagnostic_manager.PutCString(eDiagnosticSeverityError, "invalid target");
Sean Callanan1a8d4092010-08-27 01:01:44 +0000440 return false;
441 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000442
Sean Callanan1a8d4092010-08-27 01:01:44 +0000443 //////////////////////////
444 // Parse the expression
445 //
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000446
Sean Callanan96d27302013-04-11 00:09:05 +0000447 m_materializer_ap.reset(new Materializer());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000448
Sean Callanan9fda9d22015-10-03 09:09:01 +0000449 ResetDeclMap(exe_ctx, m_result_delegate, keep_result_in_memory);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000450
Greg Clayton57ee3062013-07-11 22:46:58 +0000451 class OnExit
452 {
453 public:
454 typedef std::function <void (void)> Callback;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000455
Greg Clayton57ee3062013-07-11 22:46:58 +0000456 OnExit (Callback const &callback) :
457 m_callback(callback)
458 {
459 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000460
Greg Clayton57ee3062013-07-11 22:46:58 +0000461 ~OnExit ()
462 {
463 m_callback();
464 }
465 private:
466 Callback m_callback;
467 };
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000468
Jim Ingham151c0322015-09-15 21:13:50 +0000469 OnExit on_exit([this]() { ResetDeclMap(); });
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000470
Jim Ingham151c0322015-09-15 21:13:50 +0000471 if (!DeclMap()->WillParse(exe_ctx, m_materializer_ap.get()))
Sean Callananb9951192011-08-01 18:18:33 +0000472 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000473 diagnostic_manager.PutCString(eDiagnosticSeverityError,
474 "current process state is unsuitable for expression parsing");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000475
Jim Ingham151c0322015-09-15 21:13:50 +0000476 ResetDeclMap(); // We are being careful here in the case of breakpoint conditions.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000477
Sean Callananb9951192011-08-01 18:18:33 +0000478 return false;
479 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000480
Sean Callanan00294b32016-03-22 21:05:51 +0000481 if (m_options.GetExecutionPolicy() == eExecutionPolicyTopLevel)
482 {
483 DeclMap()->SetLookupsEnabled(true);
484 }
485
Greg Claytonc14ee322011-09-22 04:58:26 +0000486 Process *process = exe_ctx.GetProcessPtr();
Sean Callananaa719af2012-02-08 18:43:35 +0000487 ExecutionContextScope *exe_scope = process;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000488
Sean Callananaa719af2012-02-08 18:43:35 +0000489 if (!exe_scope)
490 exe_scope = exe_ctx.GetTargetPtr();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000491
Jim Inghama1e541b2016-03-25 01:57:14 +0000492 // We use a shared pointer here so we can use the original parser - if it succeeds
493 // or the rewrite parser we might make if it fails. But the parser_sp will never be empty.
494
Jim Inghame5ee6f02016-03-29 22:00:08 +0000495 ClangExpressionParser parser(exe_scope, *this, generate_debug_info);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000496
Jim Inghame5ee6f02016-03-29 22:00:08 +0000497 unsigned num_errors = parser.Parse(diagnostic_manager);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000498
Jim Inghame5ee6f02016-03-29 22:00:08 +0000499 // Check here for FixItHints. If there are any try to apply the fixits and set the fixed text in m_fixed_text
500 // before returning an error.
Sean Callanan1a8d4092010-08-27 01:01:44 +0000501 if (num_errors)
502 {
Jim Inghame5ee6f02016-03-29 22:00:08 +0000503 if (diagnostic_manager.HasFixIts())
504 {
505 if (parser.RewriteExpression(diagnostic_manager))
506 {
507 size_t fixed_start;
508 size_t fixed_end;
509 const std::string &fixed_expression = diagnostic_manager.GetFixedExpression();
510 if (ExpressionSourceCode::GetOriginalBodyBounds(fixed_expression, lang_type, fixed_start, fixed_end))
511 m_fixed_text = fixed_expression.substr(fixed_start, fixed_end - fixed_start);
512 }
513 }
Sean Callanan579e70c2016-03-19 00:03:59 +0000514 diagnostic_manager.Printf(eDiagnosticSeverityError, "%u error%s parsing expression", num_errors,
515 num_errors == 1 ? "" : "s");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000516
Jim Ingham151c0322015-09-15 21:13:50 +0000517 ResetDeclMap(); // We are being careful here in the case of breakpoint conditions.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000518
Sean Callanan1a8d4092010-08-27 01:01:44 +0000519 return false;
520 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000521
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000522 //////////////////////////////////////////////////////////////////////////////////////////
523 // Prepare the output of the parser for execution, evaluating it statically if possible
Sean Callanan1a8d4092010-08-27 01:01:44 +0000524 //
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000525
Sean Callanan00294b32016-03-22 21:05:51 +0000526 {
Jim Inghame5ee6f02016-03-29 22:00:08 +0000527 Error jit_error = parser.PrepareForExecution(m_jit_start_addr,
528 m_jit_end_addr,
529 m_execution_unit_sp,
530 exe_ctx,
531 m_can_interpret,
532 execution_policy);
Sean Callanan00294b32016-03-22 21:05:51 +0000533
534 if (!jit_error.Success())
535 {
536 const char *error_cstr = jit_error.AsCString();
537 if (error_cstr && error_cstr[0])
538 diagnostic_manager.PutCString(eDiagnosticSeverityError, error_cstr);
539 else
540 diagnostic_manager.PutCString(eDiagnosticSeverityError, "expression can't be interpreted or run");
541 return false;
542 }
543 }
544
545 if (exe_ctx.GetProcessPtr() && execution_policy == eExecutionPolicyTopLevel)
546 {
Jim Inghame5ee6f02016-03-29 22:00:08 +0000547 Error static_init_error = parser.RunStaticInitializers(m_execution_unit_sp, exe_ctx);
Sean Callanan00294b32016-03-22 21:05:51 +0000548
549 if (!static_init_error.Success())
550 {
551 const char *error_cstr = static_init_error.AsCString();
552 if (error_cstr && error_cstr[0])
553 diagnostic_manager.Printf(eDiagnosticSeverityError, "couldn't run static initializers: %s\n",
554 error_cstr);
555 else
556 diagnostic_manager.PutCString(eDiagnosticSeverityError, "couldn't run static initializers\n");
557 return false;
558 }
559 }
560
561 if (m_execution_unit_sp)
562 {
563 bool register_execution_unit = false;
564
565 if (m_options.GetExecutionPolicy() == eExecutionPolicyTopLevel)
566 {
567 register_execution_unit = true;
568 }
Sean Callanan47cca782016-03-26 00:30:40 +0000569
570 // If there is more than one external function in the execution
571 // unit, it needs to keep living even if it's not top level, because
572 // the result could refer to that function.
573
574 if (m_execution_unit_sp->GetJittedFunctions().size() > 1)
575 {
576 register_execution_unit = true;
577 }
Sean Callanan00294b32016-03-22 21:05:51 +0000578
579 if (register_execution_unit)
580 {
Sean Callanan00294b32016-03-22 21:05:51 +0000581 llvm::cast<PersistentExpressionState>(
582 exe_ctx.GetTargetPtr()->GetPersistentExpressionStateForLanguage(m_language))
583 ->RegisterExecutionUnit(m_execution_unit_sp);
584 }
585 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000586
Greg Clayton23f8c952014-03-24 23:10:19 +0000587 if (generate_debug_info)
588 {
Sean Callanan00294b32016-03-22 21:05:51 +0000589 lldb::ModuleSP jit_module_sp(m_execution_unit_sp->GetJITModule());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000590
Greg Clayton23f8c952014-03-24 23:10:19 +0000591 if (jit_module_sp)
592 {
593 ConstString const_func_name(FunctionName());
594 FileSpec jit_file;
595 jit_file.GetFilename() = const_func_name;
596 jit_module_sp->SetFileSpecAndObjectName (jit_file, ConstString());
597 m_jit_module_wp = jit_module_sp;
598 target->GetImages().Append(jit_module_sp);
599 }
Greg Clayton23f8c952014-03-24 23:10:19 +0000600 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000601
Sean Callanan00294b32016-03-22 21:05:51 +0000602 ResetDeclMap(); // Make this go away since we don't need any of its state after parsing. This also gets rid of any
603 // ClangASTImporter::Minions.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000604
Sean Callanan00294b32016-03-22 21:05:51 +0000605 if (process && m_jit_start_addr != LLDB_INVALID_ADDRESS)
606 m_jit_process_wp = lldb::ProcessWP(process->shared_from_this());
607 return true;
Sean Callanan1a8d4092010-08-27 01:01:44 +0000608}
609
610bool
Sean Callanan579e70c2016-03-19 00:03:59 +0000611ClangUserExpression::AddArguments(ExecutionContext &exe_ctx, std::vector<lldb::addr_t> &args,
612 lldb::addr_t struct_address, DiagnosticManager &diagnostic_manager)
Sean Callanan1a8d4092010-08-27 01:01:44 +0000613{
Jim Ingham151c0322015-09-15 21:13:50 +0000614 lldb::addr_t object_ptr = LLDB_INVALID_ADDRESS;
Sean Callanan579e70c2016-03-19 00:03:59 +0000615 lldb::addr_t cmd_ptr = LLDB_INVALID_ADDRESS;
616
Jim Ingham151c0322015-09-15 21:13:50 +0000617 if (m_needs_object_ptr)
Sean Callanan933693b2012-02-10 01:22:05 +0000618 {
Jim Ingham151c0322015-09-15 21:13:50 +0000619 lldb::StackFrameSP frame_sp = exe_ctx.GetFrameSP();
620 if (!frame_sp)
621 return true;
622
623 ConstString object_name;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000624
Jim Ingham151c0322015-09-15 21:13:50 +0000625 if (m_in_cplusplus_method)
Sean Callananfc55f5d2010-09-21 00:44:12 +0000626 {
Jim Ingham151c0322015-09-15 21:13:50 +0000627 object_name.SetCString("this");
628 }
629 else if (m_in_objectivec_method)
630 {
631 object_name.SetCString("self");
632 }
633 else
634 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000635 diagnostic_manager.PutCString(eDiagnosticSeverityError, "need object pointer but don't know the language");
Jim Ingham151c0322015-09-15 21:13:50 +0000636 return false;
637 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000638
Jim Ingham151c0322015-09-15 21:13:50 +0000639 Error object_ptr_error;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000640
Jim Ingham151c0322015-09-15 21:13:50 +0000641 object_ptr = GetObjectPointer(frame_sp, object_name, object_ptr_error);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000642
Jim Ingham151c0322015-09-15 21:13:50 +0000643 if (!object_ptr_error.Success())
644 {
Sean Callananbda7ef82016-06-22 17:32:17 +0000645 exe_ctx.GetTargetRef().GetDebugger().GetAsyncOutputStream()->Printf("warning: `%s' is not accessible (subsituting 0)\n", object_name.AsCString());
Jim Ingham151c0322015-09-15 21:13:50 +0000646 object_ptr = 0;
647 }
648
649 if (m_in_objectivec_method)
650 {
651 ConstString cmd_name("_cmd");
652
653 cmd_ptr = GetObjectPointer(frame_sp, cmd_name, object_ptr_error);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000654
Sean Callanan1582ee62013-04-18 22:06:33 +0000655 if (!object_ptr_error.Success())
Sean Callanan17827832010-12-13 22:46:15 +0000656 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000657 diagnostic_manager.Printf(eDiagnosticSeverityWarning,
658 "couldn't get cmd pointer (substituting NULL): %s",
659 object_ptr_error.AsCString());
Jim Ingham151c0322015-09-15 21:13:50 +0000660 cmd_ptr = 0;
Sean Callanan9d48e802010-12-14 00:42:36 +0000661 }
Sean Callananfc55f5d2010-09-21 00:44:12 +0000662 }
Sean Callananbda7ef82016-06-22 17:32:17 +0000663
664 args.push_back(object_ptr);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000665
Jim Ingham151c0322015-09-15 21:13:50 +0000666 if (m_in_objectivec_method)
667 args.push_back(cmd_ptr);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000668
Jim Ingham51148e92015-11-05 00:24:18 +0000669 args.push_back(struct_address);
670 }
671 else
672 {
673 args.push_back(struct_address);
Jim Ingham36f3b362010-10-14 23:45:03 +0000674 }
675 return true;
676}
677
Sean Callanan9fda9d22015-10-03 09:09:01 +0000678lldb::ExpressionVariableSP
679ClangUserExpression::GetResultAfterDematerialization(ExecutionContextScope *exe_scope)
Jim Ingham36f3b362010-10-14 23:45:03 +0000680{
Sean Callanan9fda9d22015-10-03 09:09:01 +0000681 return m_result_delegate.GetVariable();
682}
683
684void
685ClangUserExpression::ClangUserExpressionHelper::ResetDeclMap(ExecutionContext &exe_ctx, Materializer::PersistentVariableDelegate &delegate, bool keep_result_in_memory)
686{
687 m_expr_decl_map_up.reset(new ClangExpressionDeclMap(keep_result_in_memory, &delegate, exe_ctx));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000688}
Jim Ingham36f3b362010-10-14 23:45:03 +0000689
Jim Ingham151c0322015-09-15 21:13:50 +0000690clang::ASTConsumer *
Sean Callanan00294b32016-03-22 21:05:51 +0000691ClangUserExpression::ClangUserExpressionHelper::ASTTransformer(clang::ASTConsumer *passthrough)
Jim Ingham36f3b362010-10-14 23:45:03 +0000692{
Sean Callanan00294b32016-03-22 21:05:51 +0000693 m_result_synthesizer_up.reset(new ASTResultSynthesizer(passthrough, m_top_level, m_target));
Sean Callananc673a6e2010-12-07 10:00:20 +0000694
Jim Ingham151c0322015-09-15 21:13:50 +0000695 return m_result_synthesizer_up.get();
Sean Callanan1a8d4092010-08-27 01:01:44 +0000696}
697
Sean Callanan00294b32016-03-22 21:05:51 +0000698void
699ClangUserExpression::ClangUserExpressionHelper::CommitPersistentDecls()
700{
701 if (m_result_synthesizer_up.get())
702 {
703 m_result_synthesizer_up->CommitPersistentDecls();
704 }
705}
706
Sean Callanan9fda9d22015-10-03 09:09:01 +0000707ClangUserExpression::ResultDelegate::ResultDelegate()
708{
709}
710
711ConstString
712ClangUserExpression::ResultDelegate::GetName()
713{
714 return m_persistent_state->GetNextPersistentVariableName();
715}
716
717void
718ClangUserExpression::ResultDelegate::DidDematerialize(lldb::ExpressionVariableSP &variable)
719{
720 m_variable = variable;
721}
722
723void
724ClangUserExpression::ResultDelegate::RegisterPersistentState(PersistentExpressionState *persistent_state)
725{
726 m_persistent_state = persistent_state;
727}
728
729lldb::ExpressionVariableSP &
730ClangUserExpression::ResultDelegate::GetVariable()
731{
732 return m_variable;
733}
734