blob: 3066384a1a591026c4249ac93608b6c1cc7a2a81 [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"
26
Sean Callanan1a8d4092010-08-27 01:01:44 +000027#include "lldb/Core/ConstString.h"
28#include "lldb/Core/Log.h"
Greg Clayton23f8c952014-03-24 23:10:19 +000029#include "lldb/Core/Module.h"
Greg Claytonc4e411f2011-01-18 19:36:39 +000030#include "lldb/Core/StreamFile.h"
Sean Callanan1a8d4092010-08-27 01:01:44 +000031#include "lldb/Core/StreamString.h"
Greg Claytonb71f3842010-10-05 03:13:51 +000032#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan9bc83842011-09-26 18:45:31 +000033#include "lldb/Expression/ExpressionSourceCode.h"
Sean Callanan14b1bae2013-04-16 23:25:35 +000034#include "lldb/Expression/IRExecutionUnit.h"
Sean Callanan1582ee62013-04-18 22:06:33 +000035#include "lldb/Expression/IRInterpreter.h"
Sean Callanan96d27302013-04-11 00:09:05 +000036#include "lldb/Expression/Materializer.h"
Zachary Turner97a14e62014-08-19 17:18:29 +000037#include "lldb/Host/HostInfo.h"
Greg Clayton1f746072012-08-29 21:13:06 +000038#include "lldb/Symbol/Block.h"
Jim Ingham5fdeed42012-10-30 23:35:54 +000039#include "lldb/Symbol/ClangASTContext.h"
40#include "lldb/Symbol/Function.h"
Greg Clayton23f8c952014-03-24 23:10:19 +000041#include "lldb/Symbol/ObjectFile.h"
42#include "lldb/Symbol/SymbolVendor.h"
Jim Ingham5fdeed42012-10-30 23:35:54 +000043#include "lldb/Symbol/Type.h"
44#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Sean Callananfc55f5d2010-09-21 00:44:12 +000045#include "lldb/Symbol/VariableList.h"
Sean Callanan1a8d4092010-08-27 01:01:44 +000046#include "lldb/Target/ExecutionContext.h"
Greg Clayton8f343b02010-11-04 01:54:29 +000047#include "lldb/Target/Process.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000048#include "lldb/Target/StackFrame.h"
Sean Callanan1a8d4092010-08-27 01:01:44 +000049#include "lldb/Target/Target.h"
Jim Inghamf48169b2010-11-30 02:22:11 +000050#include "lldb/Target/ThreadPlan.h"
51#include "lldb/Target/ThreadPlanCallUserExpression.h"
Sean Callanan1a8d4092010-08-27 01:01:44 +000052
Sean Callanan72e49402011-08-05 23:43:37 +000053#include "clang/AST/DeclCXX.h"
54#include "clang/AST/DeclObjC.h"
55
Sean Callanan1a8d4092010-08-27 01:01:44 +000056using namespace lldb_private;
57
Sean Callanan00294b32016-03-22 21:05:51 +000058ClangUserExpression::ClangUserExpression(ExecutionContextScope &exe_scope, const char *expr, const char *expr_prefix,
59 lldb::LanguageType language, ResultType desired_type,
60 const EvaluateExpressionOptions &options)
61 : LLVMUserExpression(exe_scope, expr, expr_prefix, language, desired_type, options),
62 m_type_system_helper(*m_target_wp.lock().get(), options.GetExecutionPolicy() == eExecutionPolicyTopLevel)
Sean Callanan1a8d4092010-08-27 01:01:44 +000063{
Sean Callananc7b65062011-11-07 23:35:40 +000064 switch (m_language)
65 {
Sean Callanan00294b32016-03-22 21:05:51 +000066 case lldb::eLanguageTypeC_plus_plus:
67 m_allow_cxx = true;
68 break;
69 case lldb::eLanguageTypeObjC:
70 m_allow_objc = true;
71 break;
72 case lldb::eLanguageTypeObjC_plus_plus:
73 default:
74 m_allow_cxx = true;
75 m_allow_objc = true;
76 break;
Sean Callananc7b65062011-11-07 23:35:40 +000077 }
Sean Callanan1a8d4092010-08-27 01:01:44 +000078}
79
Sean Callanane71d5532010-08-27 23:31:21 +000080ClangUserExpression::~ClangUserExpression ()
81{
Sean Callanan1a8d4092010-08-27 01:01:44 +000082}
83
Sean Callananfc55f5d2010-09-21 00:44:12 +000084void
Sean Callanan744756e2011-11-04 02:09:33 +000085ClangUserExpression::ScanContext(ExecutionContext &exe_ctx, Error &err)
Sean Callananfc55f5d2010-09-21 00:44:12 +000086{
Greg Clayton5160ce52013-03-27 23:08:40 +000087 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan70385082012-12-01 00:08:33 +000088
89 if (log)
90 log->Printf("ClangUserExpression::ScanContext()");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000091
Greg Claytonc14ee322011-09-22 04:58:26 +000092 m_target = exe_ctx.GetTargetPtr();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000093
Sean Callananc7b65062011-11-07 23:35:40 +000094 if (!(m_allow_cxx || m_allow_objc))
Sean Callanan70385082012-12-01 00:08:33 +000095 {
96 if (log)
97 log->Printf(" [CUE::SC] Settings inhibit C++ and Objective-C");
Sean Callananc7b65062011-11-07 23:35:40 +000098 return;
Sean Callanan70385082012-12-01 00:08:33 +000099 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000100
Jason Molendab57e4a12013-11-04 09:33:30 +0000101 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Claytonc14ee322011-09-22 04:58:26 +0000102 if (frame == NULL)
Sean Callanan70385082012-12-01 00:08:33 +0000103 {
104 if (log)
105 log->Printf(" [CUE::SC] Null stack frame");
Sean Callananfc55f5d2010-09-21 00:44:12 +0000106 return;
Sean Callanan70385082012-12-01 00:08:33 +0000107 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000108
Sean Callanan5dd6c3d2012-07-13 21:20:29 +0000109 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction | lldb::eSymbolContextBlock);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000110
Sean Callanan72e49402011-08-05 23:43:37 +0000111 if (!sym_ctx.function)
Sean Callanan70385082012-12-01 00:08:33 +0000112 {
113 if (log)
114 log->Printf(" [CUE::SC] Null function");
Sean Callanan72e49402011-08-05 23:43:37 +0000115 return;
Sean Callanan70385082012-12-01 00:08:33 +0000116 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000117
Greg Clayton685c88c2012-07-14 00:53:55 +0000118 // Find the block that defines the function represented by "sym_ctx"
119 Block *function_block = sym_ctx.GetFunctionBlock();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000120
Greg Clayton685c88c2012-07-14 00:53:55 +0000121 if (!function_block)
Sean Callanan70385082012-12-01 00:08:33 +0000122 {
123 if (log)
124 log->Printf(" [CUE::SC] Null function block");
Greg Clayton685c88c2012-07-14 00:53:55 +0000125 return;
Sean Callanan70385082012-12-01 00:08:33 +0000126 }
Greg Clayton685c88c2012-07-14 00:53:55 +0000127
Greg Clayton99558cc42015-08-24 23:46:31 +0000128 CompilerDeclContext decl_context = function_block->GetDeclContext();
Greg Clayton685c88c2012-07-14 00:53:55 +0000129
Sean Callanan72e49402011-08-05 23:43:37 +0000130 if (!decl_context)
Sean Callanan70385082012-12-01 00:08:33 +0000131 {
132 if (log)
133 log->Printf(" [CUE::SC] Null decl context");
Sean Callanan72e49402011-08-05 23:43:37 +0000134 return;
Sean Callanan70385082012-12-01 00:08:33 +0000135 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000136
Greg Clayton99558cc42015-08-24 23:46:31 +0000137 if (clang::CXXMethodDecl *method_decl = ClangASTContext::DeclContextGetAsCXXMethodDecl(decl_context))
Sean Callanan3670ba52010-12-01 21:35:54 +0000138 {
Sean Callananc7b65062011-11-07 23:35:40 +0000139 if (m_allow_cxx && method_decl->isInstance())
Sean Callanan3670ba52010-12-01 21:35:54 +0000140 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000141 if (m_enforce_valid_object)
Sean Callanan744756e2011-11-04 02:09:33 +0000142 {
Greg Clayton685c88c2012-07-14 00:53:55 +0000143 lldb::VariableListSP variable_list_sp (function_block->GetBlockVariableList (true));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000144
Sean Callanand5cc1322011-12-13 01:42:04 +0000145 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 +0000146
Greg Clayton685c88c2012-07-14 00:53:55 +0000147 if (!variable_list_sp)
Sean Callanand5cc1322011-12-13 01:42:04 +0000148 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000149 err.SetErrorString(thisErrorString);
150 return;
151 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000152
Greg Clayton685c88c2012-07-14 00:53:55 +0000153 lldb::VariableSP this_var_sp (variable_list_sp->FindVariable(ConstString("this")));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000154
Greg Clayton685c88c2012-07-14 00:53:55 +0000155 if (!this_var_sp ||
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000156 !this_var_sp->IsInScope(frame) ||
Greg Clayton685c88c2012-07-14 00:53:55 +0000157 !this_var_sp->LocationIsValidForFrame (frame))
Sean Callanand5cc1322011-12-13 01:42:04 +0000158 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000159 err.SetErrorString(thisErrorString);
160 return;
161 }
Sean Callanan744756e2011-11-04 02:09:33 +0000162 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000163
Dawn Perchik53f34c82015-07-01 00:54:02 +0000164 m_in_cplusplus_method = true;
Sean Callanan9bc83842011-09-26 18:45:31 +0000165 m_needs_object_ptr = true;
Sean Callanan3670ba52010-12-01 21:35:54 +0000166 }
167 }
Greg Clayton99558cc42015-08-24 23:46:31 +0000168 else if (clang::ObjCMethodDecl *method_decl = ClangASTContext::DeclContextGetAsObjCMethodDecl(decl_context))
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000169 {
Sean Callanand5c17ed2011-11-15 02:11:17 +0000170 if (m_allow_objc)
Sean Callanan9bc83842011-09-26 18:45:31 +0000171 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000172 if (m_enforce_valid_object)
Sean Callanan744756e2011-11-04 02:09:33 +0000173 {
Greg Clayton685c88c2012-07-14 00:53:55 +0000174 lldb::VariableListSP variable_list_sp (function_block->GetBlockVariableList (true));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000175
Sean Callanand5cc1322011-12-13 01:42:04 +0000176 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 +0000177
Greg Clayton685c88c2012-07-14 00:53:55 +0000178 if (!variable_list_sp)
Sean Callanand5cc1322011-12-13 01:42:04 +0000179 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000180 err.SetErrorString(selfErrorString);
181 return;
182 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000183
Greg Clayton685c88c2012-07-14 00:53:55 +0000184 lldb::VariableSP self_variable_sp = variable_list_sp->FindVariable(ConstString("self"));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000185
186 if (!self_variable_sp ||
187 !self_variable_sp->IsInScope(frame) ||
Greg Clayton685c88c2012-07-14 00:53:55 +0000188 !self_variable_sp->LocationIsValidForFrame (frame))
Sean Callanand5cc1322011-12-13 01:42:04 +0000189 {
Sean Callanand5cc1322011-12-13 01:42:04 +0000190 err.SetErrorString(selfErrorString);
191 return;
192 }
Sean Callanan744756e2011-11-04 02:09:33 +0000193 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000194
Dawn Perchik53f34c82015-07-01 00:54:02 +0000195 m_in_objectivec_method = true;
Sean Callanan9bc83842011-09-26 18:45:31 +0000196 m_needs_object_ptr = true;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000197
Sean Callanand5c17ed2011-11-15 02:11:17 +0000198 if (!method_decl->isInstanceMethod())
Dawn Perchik53f34c82015-07-01 00:54:02 +0000199 m_in_static_method = true;
Sean Callanan9bc83842011-09-26 18:45:31 +0000200 }
Sean Callanan3670ba52010-12-01 21:35:54 +0000201 }
Greg Clayton99558cc42015-08-24 23:46:31 +0000202 else if (clang::FunctionDecl *function_decl = ClangASTContext::DeclContextGetAsFunctionDecl(decl_context))
Jim Ingham5fdeed42012-10-30 23:35:54 +0000203 {
204 // We might also have a function that said in the debug information that it captured an
Dawn Perchik508f0402015-07-01 17:41:02 +0000205 // object pointer. The best way to deal with getting to the ivars at present is by pretending
Jim Ingham5fdeed42012-10-30 23:35:54 +0000206 // that this is a method of a class in whatever runtime the debug info says the object pointer
207 // belongs to. Do that here.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000208
Greg Clayton99558cc42015-08-24 23:46:31 +0000209 ClangASTMetadata *metadata = ClangASTContext::DeclContextGetMetaData (decl_context, function_decl);
Jim Ingham5fdeed42012-10-30 23:35:54 +0000210 if (metadata && metadata->HasObjectPtr())
211 {
212 lldb::LanguageType language = metadata->GetObjectPtrLanguage();
213 if (language == lldb::eLanguageTypeC_plus_plus)
214 {
Sean Callanana2868d42013-01-19 01:49:02 +0000215 if (m_enforce_valid_object)
216 {
217 lldb::VariableListSP variable_list_sp (function_block->GetBlockVariableList (true));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000218
Sean Callanana2868d42013-01-19 01:49:02 +0000219 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 +0000220
Sean Callanana2868d42013-01-19 01:49:02 +0000221 if (!variable_list_sp)
222 {
223 err.SetErrorString(thisErrorString);
224 return;
225 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000226
Sean Callanana2868d42013-01-19 01:49:02 +0000227 lldb::VariableSP this_var_sp (variable_list_sp->FindVariable(ConstString("this")));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000228
Sean Callanana2868d42013-01-19 01:49:02 +0000229 if (!this_var_sp ||
230 !this_var_sp->IsInScope(frame) ||
231 !this_var_sp->LocationIsValidForFrame (frame))
232 {
233 err.SetErrorString(thisErrorString);
234 return;
235 }
236 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000237
Dawn Perchik53f34c82015-07-01 00:54:02 +0000238 m_in_cplusplus_method = true;
Jim Ingham5fdeed42012-10-30 23:35:54 +0000239 m_needs_object_ptr = true;
240 }
241 else if (language == lldb::eLanguageTypeObjC)
242 {
Sean Callanana2868d42013-01-19 01:49:02 +0000243 if (m_enforce_valid_object)
244 {
245 lldb::VariableListSP variable_list_sp (function_block->GetBlockVariableList (true));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000246
Sean Callanana2868d42013-01-19 01:49:02 +0000247 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 +0000248
Sean Callanana2868d42013-01-19 01:49:02 +0000249 if (!variable_list_sp)
250 {
251 err.SetErrorString(selfErrorString);
252 return;
253 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000254
Sean Callanana2868d42013-01-19 01:49:02 +0000255 lldb::VariableSP self_variable_sp = variable_list_sp->FindVariable(ConstString("self"));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000256
Sean Callanana2868d42013-01-19 01:49:02 +0000257 if (!self_variable_sp ||
258 !self_variable_sp->IsInScope(frame) ||
259 !self_variable_sp->LocationIsValidForFrame (frame))
260 {
261 err.SetErrorString(selfErrorString);
262 return;
263 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000264
Sean Callanana2868d42013-01-19 01:49:02 +0000265 Type *self_type = self_variable_sp->GetType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000266
Sean Callanana2868d42013-01-19 01:49:02 +0000267 if (!self_type)
268 {
269 err.SetErrorString(selfErrorString);
270 return;
271 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000272
Greg Clayton99558cc42015-08-24 23:46:31 +0000273 CompilerType self_clang_type = self_type->GetForwardCompilerType ();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000274
Greg Clayton57ee3062013-07-11 22:46:58 +0000275 if (!self_clang_type)
Sean Callanana2868d42013-01-19 01:49:02 +0000276 {
277 err.SetErrorString(selfErrorString);
278 return;
279 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000280
Greg Claytond8d4a572015-08-11 21:38:15 +0000281 if (ClangASTContext::IsObjCClassType(self_clang_type))
Sean Callanana2868d42013-01-19 01:49:02 +0000282 {
283 return;
284 }
Greg Claytond8d4a572015-08-11 21:38:15 +0000285 else if (ClangASTContext::IsObjCObjectPointerType(self_clang_type))
Sean Callanana2868d42013-01-19 01:49:02 +0000286 {
Dawn Perchik53f34c82015-07-01 00:54:02 +0000287 m_in_objectivec_method = true;
Sean Callanana2868d42013-01-19 01:49:02 +0000288 m_needs_object_ptr = true;
289 }
290 else
291 {
292 err.SetErrorString(selfErrorString);
293 return;
294 }
295 }
296 else
297 {
Dawn Perchik53f34c82015-07-01 00:54:02 +0000298 m_in_objectivec_method = true;
Sean Callanana2868d42013-01-19 01:49:02 +0000299 m_needs_object_ptr = true;
300 }
Jim Ingham5fdeed42012-10-30 23:35:54 +0000301 }
302 }
303 }
Sean Callananfc55f5d2010-09-21 00:44:12 +0000304}
305
Sean Callanancf5498f2010-10-22 23:25:16 +0000306// This is a really nasty hack, meant to fix Objective-C expressions of the form
307// (int)[myArray count]. Right now, because the type information for count is
308// not available, [myArray count] returns id, which can't be directly cast to
309// int without causing a clang error.
310static void
311ApplyObjcCastHack(std::string &expr)
312{
313#define OBJC_CAST_HACK_FROM "(int)["
314#define OBJC_CAST_HACK_TO "(int)(long long)["
315
316 size_t from_offset;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000317
Sean Callanancf5498f2010-10-22 23:25:16 +0000318 while ((from_offset = expr.find(OBJC_CAST_HACK_FROM)) != expr.npos)
319 expr.replace(from_offset, sizeof(OBJC_CAST_HACK_FROM) - 1, OBJC_CAST_HACK_TO);
320
321#undef OBJC_CAST_HACK_TO
322#undef OBJC_CAST_HACK_FROM
323}
324
325bool
Sean Callanan579e70c2016-03-19 00:03:59 +0000326ClangUserExpression::Parse(DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
327 lldb_private::ExecutionPolicy execution_policy, bool keep_result_in_memory,
328 bool generate_debug_info)
Sean Callanan1a8d4092010-08-27 01:01:44 +0000329{
Greg Clayton5160ce52013-03-27 23:08:40 +0000330 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000331
Sean Callanan744756e2011-11-04 02:09:33 +0000332 Error err;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000333
Sean Callanan933693b2012-02-10 01:22:05 +0000334 InstallContext(exe_ctx);
Sean Callanan9fda9d22015-10-03 09:09:01 +0000335
336 if (Target *target = exe_ctx.GetTargetPtr())
337 {
338 if (PersistentExpressionState *persistent_state = target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC))
339 {
340 m_result_delegate.RegisterPersistentState(persistent_state);
341 }
342 else
343 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000344 diagnostic_manager.PutCString(eDiagnosticSeverityError, "couldn't start parsing (no persistent data)");
Sean Callanan9fda9d22015-10-03 09:09:01 +0000345 return false;
346 }
347 }
348 else
349 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000350 diagnostic_manager.PutCString(eDiagnosticSeverityError, "error: couldn't start parsing (no target)");
Sean Callanan9fda9d22015-10-03 09:09:01 +0000351 return false;
352 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000353
Sean Callanan744756e2011-11-04 02:09:33 +0000354 ScanContext(exe_ctx, err);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000355
Sean Callanan744756e2011-11-04 02:09:33 +0000356 if (!err.Success())
357 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000358 diagnostic_manager.PutCString(eDiagnosticSeverityWarning, err.AsCString());
Sean Callanan744756e2011-11-04 02:09:33 +0000359 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000360
Sean Callananfc55f5d2010-09-21 00:44:12 +0000361 StreamString m_transformed_stream;
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
Sean Callanan00294b32016-03-22 21:05:51 +0000403 if (m_options.GetExecutionPolicy() == eExecutionPolicyTopLevel)
Sean Callananfc55f5d2010-09-21 00:44:12 +0000404 {
Sean Callanan00294b32016-03-22 21:05:51 +0000405 m_transformed_text = m_expr_text;
406 }
407 else
408 {
409 std::unique_ptr<ExpressionSourceCode> source_code(
410 ExpressionSourceCode::CreateWrapped(prefix.c_str(), m_expr_text.c_str()));
411
412 lldb::LanguageType lang_type;
413
414 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
421 if (!source_code->GetText(m_transformed_text, lang_type, m_const_object, m_in_static_method, exe_ctx))
422 {
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
Todd Fiala2c77a422014-10-10 01:11:39 +0000492 ClangExpressionParser parser(exe_scope, *this, generate_debug_info);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000493
Sean Callanan579e70c2016-03-19 00:03:59 +0000494 unsigned num_errors = parser.Parse(diagnostic_manager);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000495
Sean Callanan1a8d4092010-08-27 01:01:44 +0000496 if (num_errors)
497 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000498 diagnostic_manager.Printf(eDiagnosticSeverityError, "%u error%s parsing expression", num_errors,
499 num_errors == 1 ? "" : "s");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000500
Jim Ingham151c0322015-09-15 21:13:50 +0000501 ResetDeclMap(); // We are being careful here in the case of breakpoint conditions.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000502
Sean Callanan1a8d4092010-08-27 01:01:44 +0000503 return false;
504 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000505
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000506 //////////////////////////////////////////////////////////////////////////////////////////
507 // Prepare the output of the parser for execution, evaluating it statically if possible
Sean Callanan1a8d4092010-08-27 01:01:44 +0000508 //
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000509
Sean Callanan00294b32016-03-22 21:05:51 +0000510 {
511 Error jit_error = parser.PrepareForExecution(m_jit_start_addr, m_jit_end_addr, m_execution_unit_sp, exe_ctx,
512 m_can_interpret, execution_policy);
513
514 if (!jit_error.Success())
515 {
516 const char *error_cstr = jit_error.AsCString();
517 if (error_cstr && error_cstr[0])
518 diagnostic_manager.PutCString(eDiagnosticSeverityError, error_cstr);
519 else
520 diagnostic_manager.PutCString(eDiagnosticSeverityError, "expression can't be interpreted or run");
521 return false;
522 }
523 }
524
525 if (exe_ctx.GetProcessPtr() && execution_policy == eExecutionPolicyTopLevel)
526 {
527 Error static_init_error = parser.RunStaticInitializers(m_execution_unit_sp, exe_ctx);
528
529 if (!static_init_error.Success())
530 {
531 const char *error_cstr = static_init_error.AsCString();
532 if (error_cstr && error_cstr[0])
533 diagnostic_manager.Printf(eDiagnosticSeverityError, "couldn't run static initializers: %s\n",
534 error_cstr);
535 else
536 diagnostic_manager.PutCString(eDiagnosticSeverityError, "couldn't run static initializers\n");
537 return false;
538 }
539 }
540
541 if (m_execution_unit_sp)
542 {
543 bool register_execution_unit = false;
544
545 if (m_options.GetExecutionPolicy() == eExecutionPolicyTopLevel)
546 {
547 register_execution_unit = true;
548 }
549
550 if (register_execution_unit)
551 {
552 // We currently key off there being more than one external function in the execution
553 // unit to determine whether it needs to live in the process.
554
555 llvm::cast<PersistentExpressionState>(
556 exe_ctx.GetTargetPtr()->GetPersistentExpressionStateForLanguage(m_language))
557 ->RegisterExecutionUnit(m_execution_unit_sp);
558 }
559 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000560
Greg Clayton23f8c952014-03-24 23:10:19 +0000561 if (generate_debug_info)
562 {
Sean Callanan00294b32016-03-22 21:05:51 +0000563 lldb::ModuleSP jit_module_sp(m_execution_unit_sp->GetJITModule());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000564
Greg Clayton23f8c952014-03-24 23:10:19 +0000565 if (jit_module_sp)
566 {
567 ConstString const_func_name(FunctionName());
568 FileSpec jit_file;
569 jit_file.GetFilename() = const_func_name;
570 jit_module_sp->SetFileSpecAndObjectName (jit_file, ConstString());
571 m_jit_module_wp = jit_module_sp;
572 target->GetImages().Append(jit_module_sp);
573 }
Greg Clayton23f8c952014-03-24 23:10:19 +0000574 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000575
Sean Callanan00294b32016-03-22 21:05:51 +0000576 ResetDeclMap(); // Make this go away since we don't need any of its state after parsing. This also gets rid of any
577 // ClangASTImporter::Minions.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000578
Sean Callanan00294b32016-03-22 21:05:51 +0000579 if (process && m_jit_start_addr != LLDB_INVALID_ADDRESS)
580 m_jit_process_wp = lldb::ProcessWP(process->shared_from_this());
581 return true;
Sean Callanan1a8d4092010-08-27 01:01:44 +0000582}
583
584bool
Sean Callanan579e70c2016-03-19 00:03:59 +0000585ClangUserExpression::AddArguments(ExecutionContext &exe_ctx, std::vector<lldb::addr_t> &args,
586 lldb::addr_t struct_address, DiagnosticManager &diagnostic_manager)
Sean Callanan1a8d4092010-08-27 01:01:44 +0000587{
Jim Ingham151c0322015-09-15 21:13:50 +0000588 lldb::addr_t object_ptr = LLDB_INVALID_ADDRESS;
Sean Callanan579e70c2016-03-19 00:03:59 +0000589 lldb::addr_t cmd_ptr = LLDB_INVALID_ADDRESS;
590
Jim Ingham151c0322015-09-15 21:13:50 +0000591 if (m_needs_object_ptr)
Sean Callanan933693b2012-02-10 01:22:05 +0000592 {
Jim Ingham151c0322015-09-15 21:13:50 +0000593 lldb::StackFrameSP frame_sp = exe_ctx.GetFrameSP();
594 if (!frame_sp)
595 return true;
596
597 ConstString object_name;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000598
Jim Ingham151c0322015-09-15 21:13:50 +0000599 if (m_in_cplusplus_method)
Sean Callananfc55f5d2010-09-21 00:44:12 +0000600 {
Jim Ingham151c0322015-09-15 21:13:50 +0000601 object_name.SetCString("this");
602 }
603 else if (m_in_objectivec_method)
604 {
605 object_name.SetCString("self");
606 }
607 else
608 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000609 diagnostic_manager.PutCString(eDiagnosticSeverityError, "need object pointer but don't know the language");
Jim Ingham151c0322015-09-15 21:13:50 +0000610 return false;
611 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000612
Jim Ingham151c0322015-09-15 21:13:50 +0000613 Error object_ptr_error;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000614
Jim Ingham151c0322015-09-15 21:13:50 +0000615 object_ptr = GetObjectPointer(frame_sp, object_name, object_ptr_error);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000616
Jim Ingham151c0322015-09-15 21:13:50 +0000617 if (!object_ptr_error.Success())
618 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000619 diagnostic_manager.Printf(eDiagnosticSeverityWarning,
620 "couldn't get required object pointer (substituting NULL): %s",
621 object_ptr_error.AsCString());
Jim Ingham151c0322015-09-15 21:13:50 +0000622 object_ptr = 0;
623 }
624
625 if (m_in_objectivec_method)
626 {
627 ConstString cmd_name("_cmd");
628
629 cmd_ptr = GetObjectPointer(frame_sp, cmd_name, object_ptr_error);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000630
Sean Callanan1582ee62013-04-18 22:06:33 +0000631 if (!object_ptr_error.Success())
Sean Callanan17827832010-12-13 22:46:15 +0000632 {
Sean Callanan579e70c2016-03-19 00:03:59 +0000633 diagnostic_manager.Printf(eDiagnosticSeverityWarning,
634 "couldn't get cmd pointer (substituting NULL): %s",
635 object_ptr_error.AsCString());
Jim Ingham151c0322015-09-15 21:13:50 +0000636 cmd_ptr = 0;
Sean Callanan9d48e802010-12-14 00:42:36 +0000637 }
Sean Callananfc55f5d2010-09-21 00:44:12 +0000638 }
Jim Ingham151c0322015-09-15 21:13:50 +0000639 if (object_ptr)
640 args.push_back(object_ptr);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000641
Jim Ingham151c0322015-09-15 21:13:50 +0000642 if (m_in_objectivec_method)
643 args.push_back(cmd_ptr);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000644
Jim Ingham51148e92015-11-05 00:24:18 +0000645 args.push_back(struct_address);
646 }
647 else
648 {
649 args.push_back(struct_address);
Jim Ingham36f3b362010-10-14 23:45:03 +0000650 }
651 return true;
652}
653
Sean Callanan9fda9d22015-10-03 09:09:01 +0000654lldb::ExpressionVariableSP
655ClangUserExpression::GetResultAfterDematerialization(ExecutionContextScope *exe_scope)
Jim Ingham36f3b362010-10-14 23:45:03 +0000656{
Sean Callanan9fda9d22015-10-03 09:09:01 +0000657 return m_result_delegate.GetVariable();
658}
659
660void
661ClangUserExpression::ClangUserExpressionHelper::ResetDeclMap(ExecutionContext &exe_ctx, Materializer::PersistentVariableDelegate &delegate, bool keep_result_in_memory)
662{
663 m_expr_decl_map_up.reset(new ClangExpressionDeclMap(keep_result_in_memory, &delegate, exe_ctx));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000664}
Jim Ingham36f3b362010-10-14 23:45:03 +0000665
Jim Ingham151c0322015-09-15 21:13:50 +0000666clang::ASTConsumer *
Sean Callanan00294b32016-03-22 21:05:51 +0000667ClangUserExpression::ClangUserExpressionHelper::ASTTransformer(clang::ASTConsumer *passthrough)
Jim Ingham36f3b362010-10-14 23:45:03 +0000668{
Sean Callanan00294b32016-03-22 21:05:51 +0000669 m_result_synthesizer_up.reset(new ASTResultSynthesizer(passthrough, m_top_level, m_target));
Sean Callananc673a6e2010-12-07 10:00:20 +0000670
Jim Ingham151c0322015-09-15 21:13:50 +0000671 return m_result_synthesizer_up.get();
Sean Callanan1a8d4092010-08-27 01:01:44 +0000672}
673
Sean Callanan00294b32016-03-22 21:05:51 +0000674void
675ClangUserExpression::ClangUserExpressionHelper::CommitPersistentDecls()
676{
677 if (m_result_synthesizer_up.get())
678 {
679 m_result_synthesizer_up->CommitPersistentDecls();
680 }
681}
682
Sean Callanan9fda9d22015-10-03 09:09:01 +0000683ClangUserExpression::ResultDelegate::ResultDelegate()
684{
685}
686
687ConstString
688ClangUserExpression::ResultDelegate::GetName()
689{
690 return m_persistent_state->GetNextPersistentVariableName();
691}
692
693void
694ClangUserExpression::ResultDelegate::DidDematerialize(lldb::ExpressionVariableSP &variable)
695{
696 m_variable = variable;
697}
698
699void
700ClangUserExpression::ResultDelegate::RegisterPersistentState(PersistentExpressionState *persistent_state)
701{
702 m_persistent_state = persistent_state;
703}
704
705lldb::ExpressionVariableSP &
706ClangUserExpression::ResultDelegate::GetVariable()
707{
708 return m_variable;
709}
710