blob: d102fb404557dcb4e344877f9040d432e1cfbc65 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
2//
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 Callanan4dbb2712015-09-25 20:35:58 +000010#include "ClangExpressionDeclMap.h"
11
12#include "ASTDumper.h"
13#include "ClangASTSource.h"
14#include "ClangModulesDeclVendor.h"
15#include "ClangPersistentVariables.h"
16
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017#include "lldb/Core/Address.h"
18#include "lldb/Core/Module.h"
Greg Clayton9191db42013-10-21 18:40:51 +000019#include "lldb/Core/ModuleSpec.h"
Greg Clayton7349bd92011-05-09 20:18:18 +000020#include "lldb/Core/RegisterValue.h"
Sean Callanane4ec90e2010-12-16 03:17:46 +000021#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan9b3569b2011-12-10 03:12:34 +000022#include "lldb/Core/ValueObjectVariable.h"
Sean Callanan96d27302013-04-11 00:09:05 +000023#include "lldb/Expression/Materializer.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024#include "lldb/Symbol/ClangASTContext.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000025#include "lldb/Symbol/CompileUnit.h"
Paul Hermand628cbb2015-09-15 23:44:17 +000026#include "lldb/Symbol/CompilerDecl.h"
Greg Clayton99558cc42015-08-24 23:46:31 +000027#include "lldb/Symbol/CompilerDeclContext.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028#include "lldb/Symbol/Function.h"
29#include "lldb/Symbol/ObjectFile.h"
30#include "lldb/Symbol/SymbolContext.h"
Siva Chandra9293fc42016-01-07 23:32:34 +000031#include "lldb/Symbol/SymbolFile.h"
Sean Callanan503aa522011-10-12 00:12:34 +000032#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033#include "lldb/Symbol/Type.h"
34#include "lldb/Symbol/TypeList.h"
35#include "lldb/Symbol/Variable.h"
36#include "lldb/Symbol/VariableList.h"
Sean Callanana0d56432014-11-11 02:49:44 +000037#include "lldb/Target/CPPLanguageRuntime.h"
Sean Callanan1d180662010-07-20 23:31:16 +000038#include "lldb/Target/ExecutionContext.h"
Sean Callanane0b23b52012-11-15 02:02:04 +000039#include "lldb/Target/ObjCLanguageRuntime.h"
Sean Callananea22d422010-07-16 00:09:46 +000040#include "lldb/Target/Process.h"
Sean Callananf4b9bd32010-10-05 20:18:48 +000041#include "lldb/Target/RegisterContext.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000042#include "lldb/Target/StackFrame.h"
Sean Callanan1d180662010-07-20 23:31:16 +000043#include "lldb/Target/Target.h"
Jim Ingham895c9822010-12-07 01:56:02 +000044#include "lldb/Target/Thread.h"
Zachary Turner01c32432017-02-14 19:06:07 +000045#include "lldb/Utility/Endian.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000046#include "lldb/Utility/Log.h"
Zachary Turner97206d52017-05-12 04:51:55 +000047#include "lldb/Utility/Status.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000048#include "lldb/lldb-private.h"
49#include "clang/AST/ASTConsumer.h"
50#include "clang/AST/ASTContext.h"
Sean Callanan68e44232017-09-28 20:20:25 +000051#include "clang/AST/ASTImporter.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000052#include "clang/AST/Decl.h"
53#include "clang/AST/DeclarationName.h"
Sean Callanan68e44232017-09-28 20:20:25 +000054#include "clang/AST/RecursiveASTVisitor.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055
Siva Chandra0f4873d2015-09-03 23:27:10 +000056#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
57
Greg Clayton83c5cd92010-11-14 22:13:40 +000058using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059using namespace lldb_private;
60using namespace clang;
61
Kate Stoneb9c1b512016-09-06 20:57:50 +000062namespace {
63const char *g_lldb_local_vars_namespace_cstr = "$__lldb_local_vars";
Siva Chandra03ff5c82016-02-05 19:10:04 +000064} // anonymous namespace
65
Kate Stoneb9c1b512016-09-06 20:57:50 +000066ClangExpressionDeclMap::ClangExpressionDeclMap(
67 bool keep_result_in_memory,
68 Materializer::PersistentVariableDelegate *result_delegate,
69 ExecutionContext &exe_ctx)
70 : ClangASTSource(exe_ctx.GetTargetSP()), m_found_entities(),
71 m_struct_members(), m_keep_result_in_memory(keep_result_in_memory),
72 m_result_delegate(result_delegate), m_parser_vars(), m_struct_vars() {
73 EnableStructVars();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000074}
75
Kate Stoneb9c1b512016-09-06 20:57:50 +000076ClangExpressionDeclMap::~ClangExpressionDeclMap() {
77 // Note: The model is now that the parser's AST context and all associated
78 // data does not vanish until the expression has been executed. This means
79 // that valuable lookup data (like namespaces) doesn't vanish, but
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000080
Kate Stoneb9c1b512016-09-06 20:57:50 +000081 DidParse();
82 DisableStructVars();
Sean Callanan979f74d2010-12-03 01:38:59 +000083}
Sean Callananbe3a1b12010-10-26 00:31:56 +000084
Kate Stoneb9c1b512016-09-06 20:57:50 +000085bool ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx,
86 Materializer *materializer) {
87 ClangASTMetrics::ClearLocalCounters();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000088
Kate Stoneb9c1b512016-09-06 20:57:50 +000089 EnableParserVars();
90 m_parser_vars->m_exe_ctx = exe_ctx;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000091
Kate Stoneb9c1b512016-09-06 20:57:50 +000092 Target *target = exe_ctx.GetTargetPtr();
93 if (exe_ctx.GetFramePtr())
94 m_parser_vars->m_sym_ctx =
95 exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
96 else if (exe_ctx.GetThreadPtr() &&
97 exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0))
98 m_parser_vars->m_sym_ctx =
99 exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(
100 lldb::eSymbolContextEverything);
101 else if (exe_ctx.GetProcessPtr()) {
102 m_parser_vars->m_sym_ctx.Clear(true);
103 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
104 } else if (target) {
105 m_parser_vars->m_sym_ctx.Clear(true);
106 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
107 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000108
Kate Stoneb9c1b512016-09-06 20:57:50 +0000109 if (target) {
110 m_parser_vars->m_persistent_vars = llvm::cast<ClangPersistentVariables>(
111 target->GetPersistentExpressionStateForLanguage(eLanguageTypeC));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000112
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113 if (!target->GetScratchClangASTContext())
114 return false;
115 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000116
Kate Stoneb9c1b512016-09-06 20:57:50 +0000117 m_parser_vars->m_target_info = GetTargetInfo();
118 m_parser_vars->m_materializer = materializer;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000119
Kate Stoneb9c1b512016-09-06 20:57:50 +0000120 return true;
Sean Callanan979f74d2010-12-03 01:38:59 +0000121}
122
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123void ClangExpressionDeclMap::InstallCodeGenerator(
124 clang::ASTConsumer *code_gen) {
125 assert(m_parser_vars);
126 m_parser_vars->m_code_gen = code_gen;
Sean Callanan80c97592015-05-01 00:47:29 +0000127}
128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129void ClangExpressionDeclMap::DidParse() {
130 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8106d802013-03-08 20:04:57 +0000131
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132 if (log)
133 ClangASTMetrics::DumpCounters(log);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 if (m_parser_vars.get()) {
136 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
137 entity_index < num_entities; ++entity_index) {
138 ExpressionVariableSP var_sp(
139 m_found_entities.GetVariableAtIndex(entity_index));
140 if (var_sp)
141 llvm::cast<ClangExpressionVariable>(var_sp.get())
142 ->DisableParserVars(GetParserID());
Sean Callanan6b1b9532010-10-08 01:58:41 +0000143 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144
145 for (size_t pvar_index = 0,
146 num_pvars = m_parser_vars->m_persistent_vars->GetSize();
147 pvar_index < num_pvars; ++pvar_index) {
148 ExpressionVariableSP pvar_sp(
149 m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
150 if (ClangExpressionVariable *clang_var =
151 llvm::dyn_cast<ClangExpressionVariable>(pvar_sp.get()))
152 clang_var->DisableParserVars(GetParserID());
153 }
154
155 DisableParserVars();
156 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000157}
158
Sean Callanan549c9f72010-07-13 21:41:46 +0000159// Interface for IRForTarget
160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161ClangExpressionDeclMap::TargetInfo ClangExpressionDeclMap::GetTargetInfo() {
162 assert(m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164 TargetInfo ret;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000165
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
Sean Callanan933693b2012-02-10 01:22:05 +0000167
Kate Stoneb9c1b512016-09-06 20:57:50 +0000168 Process *process = exe_ctx.GetProcessPtr();
169 if (process) {
170 ret.byte_order = process->GetByteOrder();
171 ret.address_byte_size = process->GetAddressByteSize();
172 } else {
173 Target *target = exe_ctx.GetTargetPtr();
174 if (target) {
175 ret.byte_order = target->GetArchitecture().GetByteOrder();
176 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan933693b2012-02-10 01:22:05 +0000177 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178 }
Sean Callanan933693b2012-02-10 01:22:05 +0000179
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 return ret;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000181}
182
Sean Callanan68e44232017-09-28 20:20:25 +0000183namespace {
184/// This class walks an AST and ensures that all DeclContexts defined inside the
185/// current source file are properly complete.
186///
187/// This is used to ensure that persistent types defined in the current source
188/// file migrate completely to the persistent AST context before they are
189/// reused. If that didn't happen, it would be impoossible to complete them
190/// because their origin would be gone.
191///
192/// The stragtegy used by this class is to check the SourceLocation (to be
193/// specific, the FileID) and see if it's the FileID for the current expression.
194/// Alternate strategies could include checking whether an ExternalASTMerger,
195/// set up to not have the current context as a source, can find an original for
196/// the type.
197class Completer : public clang::RecursiveASTVisitor<Completer> {
198private:
199 clang::ASTImporter &m_exporter; /// Used to import Decl contents
200 clang::FileID m_file; /// The file that's going away
201 llvm::DenseSet<clang::Decl *> m_completed; /// Visited Decls, to avoid cycles
202
203 bool ImportAndCheckCompletable(clang::Decl *decl) {
204 (void)m_exporter.Import(decl);
205 if (m_completed.count(decl))
206 return false;
207 if (!llvm::isa<DeclContext>(decl))
208 return false;
209 const clang::SourceLocation loc = decl->getLocation();
210 if (!loc.isValid())
211 return false;
212 const clang::FileID file =
213 m_exporter.getFromContext().getSourceManager().getFileID(loc);
214 if (file != m_file)
215 return false;
216 // We are assuming the Decl was parsed in this very expression, so it should
217 // not have external storage.
218 lldbassert(!llvm::cast<DeclContext>(decl)->hasExternalLexicalStorage());
219 return true;
220 }
221
222 void Complete(clang::Decl *decl) {
223 m_completed.insert(decl);
224 auto *decl_context = llvm::cast<DeclContext>(decl);
225 (void)m_exporter.Import(decl);
226 m_exporter.CompleteDecl(decl);
227 for (Decl *child : decl_context->decls())
228 if (ImportAndCheckCompletable(child))
229 Complete(child);
230 }
231
232 void MaybeComplete(clang::Decl *decl) {
233 if (ImportAndCheckCompletable(decl))
234 Complete(decl);
235 }
236
237public:
238 Completer(clang::ASTImporter &exporter, clang::FileID file)
239 : m_exporter(exporter), m_file(file) {}
240
241 // Implements the RecursiveASTVisitor's core API. It is called on each Decl
242 // that the RecursiveASTVisitor encounters, and returns true if the traversal
243 // should continue.
244 bool VisitDecl(clang::Decl *decl) {
245 MaybeComplete(decl);
246 return true;
247 }
248};
249}
250
251static void CompleteAllDeclContexts(clang::ASTImporter &exporter,
252 clang::FileID file,
253 clang::QualType root) {
254 clang::QualType canonical_type = root.getCanonicalType();
255 if (clang::TagDecl *tag_decl = canonical_type->getAsTagDecl()) {
256 Completer(exporter, file).TraverseDecl(tag_decl);
257 } else if (auto interface_type = llvm::dyn_cast<ObjCInterfaceType>(
258 canonical_type.getTypePtr())) {
259 Completer(exporter, file).TraverseDecl(interface_type->getDecl());
260 } else {
261 Completer(exporter, file).TraverseType(canonical_type);
262 }
263}
264
265static clang::QualType ExportAllDeclaredTypes(
266 clang::ExternalASTMerger &merger,
267 clang::ASTContext &source, clang::FileManager &source_file_manager,
268 const clang::ExternalASTMerger::OriginMap &source_origin_map,
269 clang::FileID file, clang::QualType root) {
270 clang::ExternalASTMerger::ImporterSource importer_source =
271 { source, source_file_manager, source_origin_map };
272 merger.AddSources(importer_source);
273 clang::ASTImporter &exporter = merger.ImporterForOrigin(source);
274 CompleteAllDeclContexts(exporter, file, root);
275 clang::QualType ret = exporter.Import(root);
276 merger.RemoveSources(importer_source);
277 return ret;
278}
279
280TypeFromUser ClangExpressionDeclMap::DeportType(ClangASTContext &target,
281 ClangASTContext &source,
282 TypeFromParser parser_type) {
283 assert (&target == m_target->GetScratchClangASTContext());
284 assert ((TypeSystem*)&source == parser_type.GetTypeSystem());
285 assert (source.getASTContext() == m_ast_context);
286
287 if (m_ast_importer_sp) {
288 return TypeFromUser(m_ast_importer_sp->DeportType(
289 target.getASTContext(), source.getASTContext(),
290 parser_type.GetOpaqueQualType()),
291 &target);
292 } else if (m_merger_up) {
293 clang::FileID source_file =
294 source.getASTContext()->getSourceManager().getFileID(
295 source.getASTContext()->getTranslationUnitDecl()->getLocation());
296 auto scratch_ast_context = static_cast<ClangASTContextForExpressions*>(
297 m_target->GetScratchClangASTContext());
298 clang::QualType exported_type = ExportAllDeclaredTypes(
299 scratch_ast_context->GetMergerUnchecked(),
300 *source.getASTContext(), *source.getFileManager(),
301 m_merger_up->GetOrigins(),
302 source_file,
303 clang::QualType::getFromOpaquePtr(parser_type.GetOpaqueQualType()));
304 return TypeFromUser(exported_type.getAsOpaquePtr(), &target);
305 } else {
306 lldbassert(!"No mechanism for deporting a type!");
307 return TypeFromUser();
308 }
309}
310
Kate Stoneb9c1b512016-09-06 20:57:50 +0000311bool ClangExpressionDeclMap::AddPersistentVariable(const NamedDecl *decl,
312 const ConstString &name,
313 TypeFromParser parser_type,
314 bool is_result,
315 bool is_lvalue) {
316 assert(m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000317
Kate Stoneb9c1b512016-09-06 20:57:50 +0000318 ClangASTContext *ast =
319 llvm::dyn_cast_or_null<ClangASTContext>(parser_type.GetTypeSystem());
320 if (ast == nullptr)
321 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +0000322
Kate Stoneb9c1b512016-09-06 20:57:50 +0000323 if (m_parser_vars->m_materializer && is_result) {
Zachary Turner97206d52017-05-12 04:51:55 +0000324 Status err;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000325
Sean Callanan933693b2012-02-10 01:22:05 +0000326 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
327 Target *target = exe_ctx.GetTargetPtr();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000328 if (target == nullptr)
329 return false;
Greg Claytonc14ee322011-09-22 04:58:26 +0000330
Sean Callanan68e44232017-09-28 20:20:25 +0000331 TypeFromUser user_type =
332 DeportType(*target->GetScratchClangASTContext(), *ast, parser_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000333
Kate Stoneb9c1b512016-09-06 20:57:50 +0000334 uint32_t offset = m_parser_vars->m_materializer->AddResultVariable(
335 user_type, is_lvalue, m_keep_result_in_memory, m_result_delegate, err);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000336
Kate Stoneb9c1b512016-09-06 20:57:50 +0000337 ClangExpressionVariable *var = new ClangExpressionVariable(
338 exe_ctx.GetBestExecutionContextScope(), name, user_type,
339 m_parser_vars->m_target_info.byte_order,
340 m_parser_vars->m_target_info.address_byte_size);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000341
Kate Stoneb9c1b512016-09-06 20:57:50 +0000342 m_found_entities.AddNewlyConstructedVariable(var);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000343
Sean Callananbc8ac342015-09-04 20:49:51 +0000344 var->EnableParserVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000345
Kate Stoneb9c1b512016-09-06 20:57:50 +0000346 ClangExpressionVariable::ParserVars *parser_vars =
347 var->GetParserVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000348
Sean Callanan3c495c12013-01-15 23:29:36 +0000349 parser_vars->m_named_decl = decl;
350 parser_vars->m_parser_type = parser_type;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000351
Kate Stoneb9c1b512016-09-06 20:57:50 +0000352 var->EnableJITVars(GetParserID());
353
354 ClangExpressionVariable::JITVars *jit_vars = var->GetJITVars(GetParserID());
355
356 jit_vars->m_offset = offset;
357
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000358 return true;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000359 }
360
361 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
362 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
363 Target *target = exe_ctx.GetTargetPtr();
364 if (target == NULL)
365 return false;
366
367 ClangASTContext *context(target->GetScratchClangASTContext());
368
Sean Callanan68e44232017-09-28 20:20:25 +0000369 TypeFromUser user_type = DeportType(*context, *ast, parser_type);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000370
371 if (!user_type.GetOpaqueQualType()) {
372 if (log)
373 log->Printf("Persistent variable's type wasn't copied successfully");
374 return false;
375 }
376
377 if (!m_parser_vars->m_target_info.IsValid())
378 return false;
379
380 ClangExpressionVariable *var = llvm::cast<ClangExpressionVariable>(
381 m_parser_vars->m_persistent_vars
382 ->CreatePersistentVariable(
383 exe_ctx.GetBestExecutionContextScope(), name, user_type,
384 m_parser_vars->m_target_info.byte_order,
385 m_parser_vars->m_target_info.address_byte_size)
386 .get());
387
388 if (!var)
389 return false;
390
391 var->m_frozen_sp->SetHasCompleteType();
392
393 if (is_result)
394 var->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
395 else
396 var->m_flags |=
397 ClangExpressionVariable::EVKeepInTarget; // explicitly-declared
398 // persistent variables should
399 // persist
400
401 if (is_lvalue) {
402 var->m_flags |= ClangExpressionVariable::EVIsProgramReference;
403 } else {
404 var->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
405 var->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
406 }
407
408 if (m_keep_result_in_memory) {
409 var->m_flags |= ClangExpressionVariable::EVKeepInTarget;
410 }
411
412 if (log)
413 log->Printf("Created persistent variable with flags 0x%hx", var->m_flags);
414
415 var->EnableParserVars(GetParserID());
416
417 ClangExpressionVariable::ParserVars *parser_vars =
418 var->GetParserVars(GetParserID());
419
420 parser_vars->m_named_decl = decl;
421 parser_vars->m_parser_type = parser_type;
422
423 return true;
Sean Callanan2235f322010-08-11 03:57:18 +0000424}
425
Kate Stoneb9c1b512016-09-06 20:57:50 +0000426bool ClangExpressionDeclMap::AddValueToStruct(const NamedDecl *decl,
427 const ConstString &name,
428 llvm::Value *value, size_t size,
429 lldb::offset_t alignment) {
430 assert(m_struct_vars.get());
431 assert(m_parser_vars.get());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000432
Kate Stoneb9c1b512016-09-06 20:57:50 +0000433 bool is_persistent_variable = false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000434
Kate Stoneb9c1b512016-09-06 20:57:50 +0000435 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000436
Kate Stoneb9c1b512016-09-06 20:57:50 +0000437 m_struct_vars->m_struct_laid_out = false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000438
Kate Stoneb9c1b512016-09-06 20:57:50 +0000439 if (ClangExpressionVariable::FindVariableInList(m_struct_members, decl,
440 GetParserID()))
441 return true;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000442
Kate Stoneb9c1b512016-09-06 20:57:50 +0000443 ClangExpressionVariable *var(ClangExpressionVariable::FindVariableInList(
444 m_found_entities, decl, GetParserID()));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000445
Kate Stoneb9c1b512016-09-06 20:57:50 +0000446 if (!var) {
447 var = ClangExpressionVariable::FindVariableInList(
448 *m_parser_vars->m_persistent_vars, decl, GetParserID());
449 is_persistent_variable = true;
450 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000451
Kate Stoneb9c1b512016-09-06 20:57:50 +0000452 if (!var)
453 return false;
454
455 if (log)
456 log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
457 static_cast<const void *>(decl), name.GetCString(),
458 var->GetName().GetCString());
459
460 // We know entity->m_parser_vars is valid because we used a parser variable
461 // to find it
462
463 ClangExpressionVariable::ParserVars *parser_vars =
464 llvm::cast<ClangExpressionVariable>(var)->GetParserVars(GetParserID());
465
466 parser_vars->m_llvm_value = value;
467
468 if (ClangExpressionVariable::JITVars *jit_vars =
469 llvm::cast<ClangExpressionVariable>(var)->GetJITVars(GetParserID())) {
470 // We already laid this out; do not touch
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000471
Sean Callanan823bb4c2010-08-30 22:17:16 +0000472 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000473 log->Printf("Already placed at 0x%llx",
474 (unsigned long long)jit_vars->m_offset);
475 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000476
Kate Stoneb9c1b512016-09-06 20:57:50 +0000477 llvm::cast<ClangExpressionVariable>(var)->EnableJITVars(GetParserID());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000478
Kate Stoneb9c1b512016-09-06 20:57:50 +0000479 ClangExpressionVariable::JITVars *jit_vars =
480 llvm::cast<ClangExpressionVariable>(var)->GetJITVars(GetParserID());
Sean Callanan3c495c12013-01-15 23:29:36 +0000481
Kate Stoneb9c1b512016-09-06 20:57:50 +0000482 jit_vars->m_alignment = alignment;
483 jit_vars->m_size = size;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000484
Kate Stoneb9c1b512016-09-06 20:57:50 +0000485 m_struct_members.AddVariable(var->shared_from_this());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000486
Kate Stoneb9c1b512016-09-06 20:57:50 +0000487 if (m_parser_vars->m_materializer) {
488 uint32_t offset = 0;
489
Zachary Turner97206d52017-05-12 04:51:55 +0000490 Status err;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000491
492 if (is_persistent_variable) {
493 ExpressionVariableSP var_sp(var->shared_from_this());
494 offset = m_parser_vars->m_materializer->AddPersistentVariable(
495 var_sp, nullptr, err);
496 } else {
497 if (const lldb_private::Symbol *sym = parser_vars->m_lldb_sym)
498 offset = m_parser_vars->m_materializer->AddSymbol(*sym, err);
499 else if (const RegisterInfo *reg_info = var->GetRegisterInfo())
500 offset = m_parser_vars->m_materializer->AddRegister(*reg_info, err);
501 else if (parser_vars->m_lldb_var)
502 offset = m_parser_vars->m_materializer->AddVariable(
503 parser_vars->m_lldb_var, err);
Sean Callanan1582ee62013-04-18 22:06:33 +0000504 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000505
Kate Stoneb9c1b512016-09-06 20:57:50 +0000506 if (!err.Success())
507 return false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000508
Kate Stoneb9c1b512016-09-06 20:57:50 +0000509 if (log)
510 log->Printf("Placed at 0x%llx", (unsigned long long)offset);
Sean Callanan3c495c12013-01-15 23:29:36 +0000511
Kate Stoneb9c1b512016-09-06 20:57:50 +0000512 jit_vars->m_offset =
513 offset; // TODO DoStructLayout() should not change this.
514 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000515
Kate Stoneb9c1b512016-09-06 20:57:50 +0000516 return true;
517}
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000518
Kate Stoneb9c1b512016-09-06 20:57:50 +0000519bool ClangExpressionDeclMap::DoStructLayout() {
520 assert(m_struct_vars.get());
Sean Callanan3dd6a422013-04-11 21:16:36 +0000521
Kate Stoneb9c1b512016-09-06 20:57:50 +0000522 if (m_struct_vars->m_struct_laid_out)
523 return true;
Sean Callanandf667652013-04-11 02:05:11 +0000524
Kate Stoneb9c1b512016-09-06 20:57:50 +0000525 if (!m_parser_vars->m_materializer)
526 return false;
527
528 m_struct_vars->m_struct_alignment =
529 m_parser_vars->m_materializer->GetStructAlignment();
530 m_struct_vars->m_struct_size =
531 m_parser_vars->m_materializer->GetStructByteSize();
532 m_struct_vars->m_struct_laid_out = true;
533 return true;
534}
535
536bool ClangExpressionDeclMap::GetStructInfo(uint32_t &num_elements, size_t &size,
537 lldb::offset_t &alignment) {
538 assert(m_struct_vars.get());
539
540 if (!m_struct_vars->m_struct_laid_out)
541 return false;
542
543 num_elements = m_struct_members.GetSize();
544 size = m_struct_vars->m_struct_size;
545 alignment = m_struct_vars->m_struct_alignment;
546
547 return true;
548}
549
550bool ClangExpressionDeclMap::GetStructElement(const NamedDecl *&decl,
551 llvm::Value *&value,
552 lldb::offset_t &offset,
553 ConstString &name,
554 uint32_t index) {
555 assert(m_struct_vars.get());
556
557 if (!m_struct_vars->m_struct_laid_out)
558 return false;
559
560 if (index >= m_struct_members.GetSize())
561 return false;
562
563 ExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
564
565 if (!member_sp)
566 return false;
567
568 ClangExpressionVariable::ParserVars *parser_vars =
569 llvm::cast<ClangExpressionVariable>(member_sp.get())
570 ->GetParserVars(GetParserID());
571 ClangExpressionVariable::JITVars *jit_vars =
572 llvm::cast<ClangExpressionVariable>(member_sp.get())
573 ->GetJITVars(GetParserID());
574
575 if (!parser_vars || !jit_vars || !member_sp->GetValueObject())
576 return false;
577
578 decl = parser_vars->m_named_decl;
579 value = parser_vars->m_llvm_value;
580 offset = jit_vars->m_offset;
581 name = member_sp->GetName();
582
583 return true;
584}
585
586bool ClangExpressionDeclMap::GetFunctionInfo(const NamedDecl *decl,
587 uint64_t &ptr) {
588 ClangExpressionVariable *entity(ClangExpressionVariable::FindVariableInList(
589 m_found_entities, decl, GetParserID()));
590
591 if (!entity)
592 return false;
593
594 // We know m_parser_vars is valid since we searched for the variable by
595 // its NamedDecl
596
597 ClangExpressionVariable::ParserVars *parser_vars =
598 entity->GetParserVars(GetParserID());
599
600 ptr = parser_vars->m_lldb_value.GetScalar().ULongLong();
601
602 return true;
603}
604
605addr_t ClangExpressionDeclMap::GetSymbolAddress(Target &target,
606 Process *process,
607 const ConstString &name,
608 lldb::SymbolType symbol_type,
609 lldb_private::Module *module) {
610 SymbolContextList sc_list;
611
612 if (module)
613 module->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
614 else
615 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
616
617 const uint32_t num_matches = sc_list.GetSize();
618 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
619
620 for (uint32_t i = 0;
621 i < num_matches &&
622 (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS);
623 i++) {
624 SymbolContext sym_ctx;
625 sc_list.GetContextAtIndex(i, sym_ctx);
626
627 const Address sym_address = sym_ctx.symbol->GetAddress();
628
629 if (!sym_address.IsValid())
630 continue;
631
632 switch (sym_ctx.symbol->GetType()) {
633 case eSymbolTypeCode:
634 case eSymbolTypeTrampoline:
635 symbol_load_addr = sym_address.GetCallableLoadAddress(&target);
636 break;
637
638 case eSymbolTypeResolver:
639 symbol_load_addr = sym_address.GetCallableLoadAddress(&target, true);
640 break;
641
642 case eSymbolTypeReExported: {
643 ConstString reexport_name = sym_ctx.symbol->GetReExportedSymbolName();
644 if (reexport_name) {
645 ModuleSP reexport_module_sp;
646 ModuleSpec reexport_module_spec;
647 reexport_module_spec.GetPlatformFileSpec() =
648 sym_ctx.symbol->GetReExportedSymbolSharedLibrary();
649 if (reexport_module_spec.GetPlatformFileSpec()) {
650 reexport_module_sp =
651 target.GetImages().FindFirstModule(reexport_module_spec);
652 if (!reexport_module_sp) {
653 reexport_module_spec.GetPlatformFileSpec().GetDirectory().Clear();
654 reexport_module_sp =
655 target.GetImages().FindFirstModule(reexport_module_spec);
656 }
Sean Callanandf667652013-04-11 02:05:11 +0000657 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000658 symbol_load_addr = GetSymbolAddress(
659 target, process, sym_ctx.symbol->GetReExportedSymbolName(),
660 symbol_type, reexport_module_sp.get());
661 }
662 } break;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000663
Kate Stoneb9c1b512016-09-06 20:57:50 +0000664 case eSymbolTypeData:
665 case eSymbolTypeRuntime:
666 case eSymbolTypeVariable:
667 case eSymbolTypeLocal:
668 case eSymbolTypeParam:
669 case eSymbolTypeInvalid:
670 case eSymbolTypeAbsolute:
671 case eSymbolTypeException:
672 case eSymbolTypeSourceFile:
673 case eSymbolTypeHeaderFile:
674 case eSymbolTypeObjectFile:
675 case eSymbolTypeCommonBlock:
676 case eSymbolTypeBlock:
677 case eSymbolTypeVariableType:
678 case eSymbolTypeLineEntry:
679 case eSymbolTypeLineHeader:
680 case eSymbolTypeScopeBegin:
681 case eSymbolTypeScopeEnd:
682 case eSymbolTypeAdditional:
683 case eSymbolTypeCompiler:
684 case eSymbolTypeInstrumentation:
685 case eSymbolTypeUndefined:
686 case eSymbolTypeObjCClass:
687 case eSymbolTypeObjCMetaClass:
688 case eSymbolTypeObjCIVar:
689 symbol_load_addr = sym_address.GetLoadAddress(&target);
690 break;
Sean Callanandf667652013-04-11 02:05:11 +0000691 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000692 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000693
Kate Stoneb9c1b512016-09-06 20:57:50 +0000694 if (symbol_load_addr == LLDB_INVALID_ADDRESS && process) {
695 ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
Sean Callanan549c9f72010-07-13 21:41:46 +0000696
Kate Stoneb9c1b512016-09-06 20:57:50 +0000697 if (runtime) {
698 symbol_load_addr = runtime->LookupRuntimeSymbol(name);
Greg Clayton084db102011-06-23 04:25:29 +0000699 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000700 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000701
Kate Stoneb9c1b512016-09-06 20:57:50 +0000702 return symbol_load_addr;
Sean Callananc3a16002011-01-17 23:42:46 +0000703}
704
Kate Stoneb9c1b512016-09-06 20:57:50 +0000705addr_t ClangExpressionDeclMap::GetSymbolAddress(const ConstString &name,
706 lldb::SymbolType symbol_type) {
707 assert(m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000708
Kate Stoneb9c1b512016-09-06 20:57:50 +0000709 if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
710 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000711
Kate Stoneb9c1b512016-09-06 20:57:50 +0000712 return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(),
713 m_parser_vars->m_exe_ctx.GetProcessPtr(), name,
714 symbol_type);
Sean Callanand9ca42a2011-05-08 02:21:26 +0000715}
716
Kate Stoneb9c1b512016-09-06 20:57:50 +0000717lldb::VariableSP ClangExpressionDeclMap::FindGlobalVariable(
718 Target &target, ModuleSP &module, const ConstString &name,
719 CompilerDeclContext *namespace_decl, TypeFromUser *type) {
720 VariableList vars;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000721
Kate Stoneb9c1b512016-09-06 20:57:50 +0000722 if (module && namespace_decl)
723 module->FindGlobalVariables(name, namespace_decl, true, -1, vars);
724 else
725 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000726
Kate Stoneb9c1b512016-09-06 20:57:50 +0000727 if (vars.GetSize()) {
728 if (type) {
729 for (size_t i = 0; i < vars.GetSize(); ++i) {
730 VariableSP var_sp = vars.GetVariableAtIndex(i);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000731
Kate Stoneb9c1b512016-09-06 20:57:50 +0000732 if (ClangASTContext::AreTypesSame(
733 *type, var_sp->GetType()->GetFullCompilerType()))
734 return var_sp;
735 }
736 } else {
737 return vars.GetVariableAtIndex(0);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000738 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000739 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000740
Kate Stoneb9c1b512016-09-06 20:57:50 +0000741 return VariableSP();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000742}
743
Kate Stoneb9c1b512016-09-06 20:57:50 +0000744ClangASTContext *ClangExpressionDeclMap::GetClangASTContext() {
745 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
746 if (frame == nullptr)
747 return nullptr;
Siva Chandra03ff5c82016-02-05 19:10:04 +0000748
Kate Stoneb9c1b512016-09-06 20:57:50 +0000749 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
750 lldb::eSymbolContextBlock);
751 if (sym_ctx.block == nullptr)
752 return nullptr;
Siva Chandra03ff5c82016-02-05 19:10:04 +0000753
Kate Stoneb9c1b512016-09-06 20:57:50 +0000754 CompilerDeclContext frame_decl_context = sym_ctx.block->GetDeclContext();
755 if (!frame_decl_context)
756 return nullptr;
Siva Chandra03ff5c82016-02-05 19:10:04 +0000757
Kate Stoneb9c1b512016-09-06 20:57:50 +0000758 return llvm::dyn_cast_or_null<ClangASTContext>(
759 frame_decl_context.GetTypeSystem());
Siva Chandra03ff5c82016-02-05 19:10:04 +0000760}
761
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000762// Interface for ClangASTSource
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000763
Kate Stoneb9c1b512016-09-06 20:57:50 +0000764void ClangExpressionDeclMap::FindExternalVisibleDecls(
765 NameSearchContext &context) {
766 assert(m_ast_context);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000767
Kate Stoneb9c1b512016-09-06 20:57:50 +0000768 ClangASTMetrics::RegisterVisibleQuery();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000769
Kate Stoneb9c1b512016-09-06 20:57:50 +0000770 const ConstString name(context.m_decl_name.getAsString().c_str());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000771
Kate Stoneb9c1b512016-09-06 20:57:50 +0000772 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000773
Kate Stoneb9c1b512016-09-06 20:57:50 +0000774 if (GetImportInProgress()) {
775 if (log && log->GetVerbose())
776 log->Printf("Ignoring a query during an import");
777 return;
778 }
779
780 static unsigned int invocation_id = 0;
781 unsigned int current_id = invocation_id++;
782
783 if (log) {
784 if (!context.m_decl_context)
785 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for "
786 "'%s' in a NULL DeclContext",
787 current_id, name.GetCString());
788 else if (const NamedDecl *context_named_decl =
789 dyn_cast<NamedDecl>(context.m_decl_context))
790 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for "
791 "'%s' in '%s'",
792 current_id, name.GetCString(),
793 context_named_decl->getNameAsString().c_str());
794 else
795 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for "
796 "'%s' in a '%s'",
797 current_id, name.GetCString(),
798 context.m_decl_context->getDeclKindName());
799 }
800
801 if (const NamespaceDecl *namespace_context =
802 dyn_cast<NamespaceDecl>(context.m_decl_context)) {
803 if (namespace_context->getName().str() ==
804 std::string(g_lldb_local_vars_namespace_cstr)) {
805 CompilerDeclContext compiler_decl_ctx(
806 GetClangASTContext(), const_cast<void *>(static_cast<const void *>(
807 context.m_decl_context)));
808 FindExternalVisibleDecls(context, lldb::ModuleSP(), compiler_decl_ctx,
809 current_id);
810 return;
Sean Callanan6abfabf2010-11-19 20:20:02 +0000811 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000812
Kate Stoneb9c1b512016-09-06 20:57:50 +0000813 ClangASTImporter::NamespaceMapSP namespace_map =
Sean Callanan68e44232017-09-28 20:20:25 +0000814 m_ast_importer_sp
815 ? m_ast_importer_sp->GetNamespaceMap(namespace_context)
816 : ClangASTImporter::NamespaceMapSP();
817
818 if (!namespace_map)
819 return;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000820
821 if (log && log->GetVerbose())
822 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
823 current_id, static_cast<void *>(namespace_map.get()),
824 (int)namespace_map->size());
Sean Callanan68e44232017-09-28 20:20:25 +0000825
Kate Stoneb9c1b512016-09-06 20:57:50 +0000826 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(),
827 e = namespace_map->end();
828 i != e; ++i) {
829 if (log)
830 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
831 current_id, i->second.GetName().AsCString(),
832 i->first->GetFileSpec().GetFilename().GetCString());
833
834 FindExternalVisibleDecls(context, i->first, i->second, current_id);
835 }
836 } else if (isa<TranslationUnitDecl>(context.m_decl_context)) {
837 CompilerDeclContext namespace_decl;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000838
Sean Callanan503aa522011-10-12 00:12:34 +0000839 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000840 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000841
Kate Stoneb9c1b512016-09-06 20:57:50 +0000842 FindExternalVisibleDecls(context, lldb::ModuleSP(), namespace_decl,
843 current_id);
844 }
Sean Callananc02a1c02017-04-24 23:14:04 +0000845
846 ClangASTSource::FindExternalVisibleDecls(context);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000847}
848
849void ClangExpressionDeclMap::FindExternalVisibleDecls(
850 NameSearchContext &context, lldb::ModuleSP module_sp,
851 CompilerDeclContext &namespace_decl, unsigned int current_id) {
852 assert(m_ast_context);
853
854 std::function<void(clang::FunctionDecl *)> MaybeRegisterFunctionBody =
855 [this](clang::FunctionDecl *copied_function_decl) {
856 if (copied_function_decl->getBody() && m_parser_vars->m_code_gen) {
857 DeclGroupRef decl_group_ref(copied_function_decl);
858 m_parser_vars->m_code_gen->HandleTopLevelDecl(decl_group_ref);
859 }
860 };
861
862 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
863
864 SymbolContextList sc_list;
865
866 const ConstString name(context.m_decl_name.getAsString().c_str());
Sean Callanan1b3c43b2017-09-26 17:25:34 +0000867 if (IgnoreName(name, false))
Kate Stoneb9c1b512016-09-06 20:57:50 +0000868 return;
869
870 // Only look for functions by name out in our symbols if the function
871 // doesn't start with our phony prefix of '$'
872 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
873 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
874 SymbolContext sym_ctx;
875 if (frame != nullptr)
876 sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
877 lldb::eSymbolContextBlock);
878
879 // Try the persistent decls, which take precedence over all else.
880 if (!namespace_decl) {
881 do {
882 if (!target)
883 break;
884
885 ClangASTContext *scratch_clang_ast_context =
886 target->GetScratchClangASTContext();
887
888 if (!scratch_clang_ast_context)
889 break;
890
891 ASTContext *scratch_ast_context =
892 scratch_clang_ast_context->getASTContext();
893
894 if (!scratch_ast_context)
895 break;
896
897 NamedDecl *persistent_decl =
898 m_parser_vars->m_persistent_vars->GetPersistentDecl(name);
899
900 if (!persistent_decl)
901 break;
902
Sean Callanan68e44232017-09-28 20:20:25 +0000903 Decl *parser_persistent_decl = CopyDecl(persistent_decl);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000904
905 if (!parser_persistent_decl)
906 break;
907
908 NamedDecl *parser_named_decl =
909 dyn_cast<NamedDecl>(parser_persistent_decl);
910
911 if (!parser_named_decl)
912 break;
913
914 if (clang::FunctionDecl *parser_function_decl =
915 llvm::dyn_cast<clang::FunctionDecl>(parser_named_decl)) {
916 MaybeRegisterFunctionBody(parser_function_decl);
917 }
918
919 if (log)
920 log->Printf(" CEDM::FEVD[%u] Found persistent decl %s", current_id,
921 name.GetCString());
922
923 context.AddNamedDecl(parser_named_decl);
924 } while (0);
925 }
926
Sean Callanan1b3c43b2017-09-26 17:25:34 +0000927 if (name.GetCString()[0] == '$' && !namespace_decl) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000928 static ConstString g_lldb_class_name("$__lldb_class");
929
930 if (name == g_lldb_class_name) {
931 // Clang is looking for the type of "this"
932
933 if (frame == NULL)
934 return;
935
936 // Find the block that defines the function represented by "sym_ctx"
937 Block *function_block = sym_ctx.GetFunctionBlock();
938
939 if (!function_block)
940 return;
941
942 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
943
944 if (!function_decl_ctx)
945 return;
946
947 clang::CXXMethodDecl *method_decl =
948 ClangASTContext::DeclContextGetAsCXXMethodDecl(function_decl_ctx);
949
950 if (method_decl) {
951 clang::CXXRecordDecl *class_decl = method_decl->getParent();
952
953 QualType class_qual_type(class_decl->getTypeForDecl(), 0);
954
955 TypeFromUser class_user_type(
956 class_qual_type.getAsOpaquePtr(),
957 ClangASTContext::GetASTContext(&class_decl->getASTContext()));
958
959 if (log) {
960 ASTDumper ast_dumper(class_qual_type);
961 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s",
962 current_id, ast_dumper.GetCString());
Siva Chandra03ff5c82016-02-05 19:10:04 +0000963 }
964
Kate Stoneb9c1b512016-09-06 20:57:50 +0000965 AddThisType(context, class_user_type, current_id);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000966
Kate Stoneb9c1b512016-09-06 20:57:50 +0000967 if (method_decl->isInstance()) {
968 // self is a pointer to the object
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000969
Kate Stoneb9c1b512016-09-06 20:57:50 +0000970 QualType class_pointer_type =
971 method_decl->getASTContext().getPointerType(class_qual_type);
972
973 TypeFromUser self_user_type(
974 class_pointer_type.getAsOpaquePtr(),
975 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
976
977 m_struct_vars->m_object_pointer_type = self_user_type;
978 }
979 } else {
980 // This branch will get hit if we are executing code in the context of a
981 // function that
982 // claims to have an object pointer (through DW_AT_object_pointer?) but
983 // is not formally a
984 // method of the class. In that case, just look up the "this" variable
985 // in the current
986 // scope and use its type.
987 // FIXME: This code is formally correct, but clang doesn't currently
988 // emit DW_AT_object_pointer
989 // for C++ so it hasn't actually been tested.
990
991 VariableList *vars = frame->GetVariableList(false);
992
993 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
994
995 if (this_var && this_var->IsInScope(frame) &&
996 this_var->LocationIsValidForFrame(frame)) {
997 Type *this_type = this_var->GetType();
998
999 if (!this_type)
Sean Callananb2269162011-10-21 22:18:07 +00001000 return;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001001
Kate Stoneb9c1b512016-09-06 20:57:50 +00001002 TypeFromUser pointee_type =
1003 this_type->GetForwardCompilerType().GetPointeeType();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001004
Kate Stoneb9c1b512016-09-06 20:57:50 +00001005 if (pointee_type.IsValid()) {
1006 if (log) {
1007 ASTDumper ast_dumper(pointee_type);
1008 log->Printf(" FEVD[%u] Adding type for $__lldb_class: %s",
1009 current_id, ast_dumper.GetCString());
1010 }
1011
1012 AddThisType(context, pointee_type, current_id);
1013 TypeFromUser this_user_type(this_type->GetFullCompilerType());
1014 m_struct_vars->m_object_pointer_type = this_user_type;
1015 return;
1016 }
Sean Callanan503aa522011-10-12 00:12:34 +00001017 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001018 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001019
Kate Stoneb9c1b512016-09-06 20:57:50 +00001020 return;
1021 }
1022
1023 static ConstString g_lldb_objc_class_name("$__lldb_objc_class");
1024 if (name == g_lldb_objc_class_name) {
1025 // Clang is looking for the type of "*self"
1026
1027 if (!frame)
1028 return;
1029
1030 SymbolContext sym_ctx = frame->GetSymbolContext(
1031 lldb::eSymbolContextFunction | lldb::eSymbolContextBlock);
1032
1033 // Find the block that defines the function represented by "sym_ctx"
1034 Block *function_block = sym_ctx.GetFunctionBlock();
1035
1036 if (!function_block)
1037 return;
1038
1039 CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
1040
1041 if (!function_decl_ctx)
1042 return;
1043
1044 clang::ObjCMethodDecl *method_decl =
1045 ClangASTContext::DeclContextGetAsObjCMethodDecl(function_decl_ctx);
1046
1047 if (method_decl) {
1048 ObjCInterfaceDecl *self_interface = method_decl->getClassInterface();
1049
1050 if (!self_interface)
1051 return;
1052
1053 const clang::Type *interface_type = self_interface->getTypeForDecl();
1054
1055 if (!interface_type)
1056 return; // This is unlikely, but we have seen crashes where this
1057 // occurred
1058
1059 TypeFromUser class_user_type(
1060 QualType(interface_type, 0).getAsOpaquePtr(),
1061 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1062
1063 if (log) {
1064 ASTDumper ast_dumper(interface_type);
1065 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s",
1066 current_id, ast_dumper.GetCString());
1067 }
1068
1069 AddOneType(context, class_user_type, current_id);
1070
1071 if (method_decl->isInstanceMethod()) {
1072 // self is a pointer to the object
1073
1074 QualType class_pointer_type =
1075 method_decl->getASTContext().getObjCObjectPointerType(
1076 QualType(interface_type, 0));
1077
1078 TypeFromUser self_user_type(
1079 class_pointer_type.getAsOpaquePtr(),
1080 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1081
1082 m_struct_vars->m_object_pointer_type = self_user_type;
1083 } else {
1084 // self is a Class pointer
1085 QualType class_type = method_decl->getASTContext().getObjCClassType();
1086
1087 TypeFromUser self_user_type(
1088 class_type.getAsOpaquePtr(),
1089 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1090
1091 m_struct_vars->m_object_pointer_type = self_user_type;
1092 }
1093
1094 return;
1095 } else {
1096 // This branch will get hit if we are executing code in the context of a
1097 // function that
1098 // claims to have an object pointer (through DW_AT_object_pointer?) but
1099 // is not formally a
1100 // method of the class. In that case, just look up the "self" variable
1101 // in the current
1102 // scope and use its type.
1103
1104 VariableList *vars = frame->GetVariableList(false);
1105
1106 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1107
1108 if (self_var && self_var->IsInScope(frame) &&
1109 self_var->LocationIsValidForFrame(frame)) {
1110 Type *self_type = self_var->GetType();
1111
1112 if (!self_type)
1113 return;
1114
1115 CompilerType self_clang_type = self_type->GetFullCompilerType();
1116
1117 if (ClangASTContext::IsObjCClassType(self_clang_type)) {
1118 return;
1119 } else if (ClangASTContext::IsObjCObjectPointerType(
1120 self_clang_type)) {
1121 self_clang_type = self_clang_type.GetPointeeType();
1122
1123 if (!self_clang_type)
1124 return;
1125
1126 if (log) {
1127 ASTDumper ast_dumper(self_type->GetFullCompilerType());
1128 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s",
1129 current_id, ast_dumper.GetCString());
1130 }
1131
1132 TypeFromUser class_user_type(self_clang_type);
1133
1134 AddOneType(context, class_user_type, current_id);
1135
1136 TypeFromUser self_user_type(self_type->GetFullCompilerType());
1137
1138 m_struct_vars->m_object_pointer_type = self_user_type;
1139 return;
1140 }
1141 }
1142 }
1143
1144 return;
1145 }
1146
1147 if (name == ConstString(g_lldb_local_vars_namespace_cstr)) {
1148 CompilerDeclContext frame_decl_context =
1149 sym_ctx.block != nullptr ? sym_ctx.block->GetDeclContext()
1150 : CompilerDeclContext();
1151
1152 if (frame_decl_context) {
1153 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(
1154 frame_decl_context.GetTypeSystem());
1155
1156 if (ast) {
1157 clang::NamespaceDecl *namespace_decl =
1158 ClangASTContext::GetUniqueNamespaceDeclaration(
Sean Callanan1b3c43b2017-09-26 17:25:34 +00001159 m_ast_context, name.GetCString(), nullptr);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001160 if (namespace_decl) {
1161 context.AddNamedDecl(namespace_decl);
1162 clang::DeclContext *clang_decl_ctx =
1163 clang::Decl::castToDeclContext(namespace_decl);
1164 clang_decl_ctx->setHasExternalVisibleStorage(true);
1165 context.m_found.local_vars_nsp = true;
1166 }
1167 }
1168 }
1169
1170 return;
1171 }
1172
1173 // any other $__lldb names should be weeded out now
Sean Callanan1b3c43b2017-09-26 17:25:34 +00001174 if (name.GetStringRef().startswith("$__lldb"))
Kate Stoneb9c1b512016-09-06 20:57:50 +00001175 return;
1176
1177 ExpressionVariableSP pvar_sp(
1178 m_parser_vars->m_persistent_vars->GetVariable(name));
1179
1180 if (pvar_sp) {
1181 AddOneVariable(context, pvar_sp, current_id);
1182 return;
1183 }
1184
1185 const char *reg_name(&name.GetCString()[1]);
1186
1187 if (m_parser_vars->m_exe_ctx.GetRegisterContext()) {
1188 const RegisterInfo *reg_info(
1189 m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(
1190 reg_name));
1191
1192 if (reg_info) {
Sean Callanan503aa522011-10-12 00:12:34 +00001193 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001194 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id,
1195 reg_info->name);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001196
Kate Stoneb9c1b512016-09-06 20:57:50 +00001197 AddOneRegister(context, reg_info, current_id);
1198 }
1199 }
1200 } else {
1201 ValueObjectSP valobj;
1202 VariableSP var;
1203
1204 bool local_var_lookup =
1205 !namespace_decl || (namespace_decl.GetName() ==
1206 ConstString(g_lldb_local_vars_namespace_cstr));
1207 if (frame && local_var_lookup) {
1208 CompilerDeclContext compiler_decl_context =
1209 sym_ctx.block != nullptr ? sym_ctx.block->GetDeclContext()
1210 : CompilerDeclContext();
1211
1212 if (compiler_decl_context) {
1213 // Make sure that the variables are parsed so that we have the
1214 // declarations.
1215 VariableListSP vars = frame->GetInScopeVariableList(true);
1216 for (size_t i = 0; i < vars->GetSize(); i++)
1217 vars->GetVariableAtIndex(i)->GetDecl();
1218
1219 // Search for declarations matching the name. Do not include imported
1220 // decls
1221 // in the search if we are looking for decls in the artificial namespace
1222 // $__lldb_local_vars.
1223 std::vector<CompilerDecl> found_decls =
1224 compiler_decl_context.FindDeclByName(name,
1225 namespace_decl.IsValid());
1226
1227 bool variable_found = false;
1228 for (CompilerDecl decl : found_decls) {
1229 for (size_t vi = 0, ve = vars->GetSize(); vi != ve; ++vi) {
1230 VariableSP candidate_var = vars->GetVariableAtIndex(vi);
1231 if (candidate_var->GetDecl() == decl) {
1232 var = candidate_var;
1233 break;
1234 }
1235 }
1236
Sean Callananc02a1c02017-04-24 23:14:04 +00001237 if (var && !variable_found) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001238 variable_found = true;
1239 valobj = ValueObjectVariable::Create(frame, var);
1240 AddOneVariable(context, var, valobj, current_id);
1241 context.m_found.variable = true;
1242 }
1243 }
1244 if (variable_found)
1245 return;
1246 }
1247 }
1248 if (target) {
1249 var = FindGlobalVariable(*target, module_sp, name, &namespace_decl, NULL);
1250
1251 if (var) {
1252 valobj = ValueObjectVariable::Create(target, var);
1253 AddOneVariable(context, var, valobj, current_id);
1254 context.m_found.variable = true;
1255 return;
1256 }
Sean Callanan503aa522011-10-12 00:12:34 +00001257 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00001258
Kate Stoneb9c1b512016-09-06 20:57:50 +00001259 std::vector<clang::NamedDecl *> decls_from_modules;
Sean Callanan503aa522011-10-12 00:12:34 +00001260
Kate Stoneb9c1b512016-09-06 20:57:50 +00001261 if (target) {
1262 if (ClangModulesDeclVendor *decl_vendor =
1263 target->GetClangModulesDeclVendor()) {
1264 decl_vendor->FindDecls(name, false, UINT32_MAX, decls_from_modules);
1265 }
1266 }
Sean Callananb3a36df2016-03-19 00:51:43 +00001267
Sean Callananc02a1c02017-04-24 23:14:04 +00001268 const bool include_inlines = false;
1269 const bool append = false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001270
Sean Callananc02a1c02017-04-24 23:14:04 +00001271 if (namespace_decl && module_sp) {
1272 const bool include_symbols = false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001273
Sean Callananc02a1c02017-04-24 23:14:04 +00001274 module_sp->FindFunctions(name, &namespace_decl, eFunctionNameTypeBase,
1275 include_symbols, include_inlines, append,
1276 sc_list);
1277 } else if (target && !namespace_decl) {
1278 const bool include_symbols = true;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001279
Sean Callananc02a1c02017-04-24 23:14:04 +00001280 // TODO Fix FindFunctions so that it doesn't return
1281 // instance methods for eFunctionNameTypeBase.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001282
Sean Callananc02a1c02017-04-24 23:14:04 +00001283 target->GetImages().FindFunctions(name, eFunctionNameTypeFull,
1284 include_symbols, include_inlines,
1285 append, sc_list);
1286 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001287
Sean Callananc02a1c02017-04-24 23:14:04 +00001288 // If we found more than one function, see if we can use the
1289 // frame's decl context to remove functions that are shadowed
1290 // by other functions which match in type but are nearer in scope.
1291 //
1292 // AddOneFunction will not add a function whose type has already been
1293 // added, so if there's another function in the list with a matching
1294 // type, check to see if their decl context is a parent of the current
1295 // frame's or was imported via a and using statement, and pick the
1296 // best match according to lookup rules.
1297 if (sc_list.GetSize() > 1) {
1298 // Collect some info about our frame's context.
1299 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1300 SymbolContext frame_sym_ctx;
1301 if (frame != nullptr)
1302 frame_sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction |
1303 lldb::eSymbolContextBlock);
1304 CompilerDeclContext frame_decl_context =
1305 frame_sym_ctx.block != nullptr ? frame_sym_ctx.block->GetDeclContext()
1306 : CompilerDeclContext();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001307
Sean Callananc02a1c02017-04-24 23:14:04 +00001308 // We can't do this without a compiler decl context for our frame.
1309 if (frame_decl_context) {
1310 clang::DeclContext *frame_decl_ctx =
1311 (clang::DeclContext *)frame_decl_context.GetOpaqueDeclContext();
1312 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(
1313 frame_decl_context.GetTypeSystem());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001314
Sean Callananc02a1c02017-04-24 23:14:04 +00001315 // Structure to hold the info needed when comparing function
1316 // declarations.
1317 struct FuncDeclInfo {
1318 ConstString m_name;
1319 CompilerType m_copied_type;
1320 uint32_t m_decl_lvl;
1321 SymbolContext m_sym_ctx;
1322 };
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001323
Sean Callananc02a1c02017-04-24 23:14:04 +00001324 // First, symplify things by looping through the symbol contexts
1325 // to remove unwanted functions and separate out the functions we
1326 // want to compare and prune into a separate list.
1327 // Cache the info needed about the function declarations in a
1328 // vector for efficiency.
1329 SymbolContextList sc_sym_list;
1330 uint32_t num_indices = sc_list.GetSize();
1331 std::vector<FuncDeclInfo> fdi_cache;
1332 fdi_cache.reserve(num_indices);
1333 for (uint32_t index = 0; index < num_indices; ++index) {
1334 FuncDeclInfo fdi;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001335 SymbolContext sym_ctx;
1336 sc_list.GetContextAtIndex(index, sym_ctx);
1337
Sean Callananc02a1c02017-04-24 23:14:04 +00001338 // We don't know enough about symbols to compare them,
1339 // but we should keep them in the list.
1340 Function *function = sym_ctx.function;
1341 if (!function) {
1342 sc_sym_list.Append(sym_ctx);
1343 continue;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001344 }
Sean Callananc02a1c02017-04-24 23:14:04 +00001345 // Filter out functions without declaration contexts, as well as
1346 // class/instance methods, since they'll be skipped in the
1347 // code that follows anyway.
1348 CompilerDeclContext func_decl_context = function->GetDeclContext();
1349 if (!func_decl_context ||
1350 func_decl_context.IsClassMethod(nullptr, nullptr, nullptr))
1351 continue;
1352 // We can only prune functions for which we can copy the type.
1353 CompilerType func_clang_type =
1354 function->GetType()->GetFullCompilerType();
1355 CompilerType copied_func_type = GuardedCopyType(func_clang_type);
1356 if (!copied_func_type) {
1357 sc_sym_list.Append(sym_ctx);
1358 continue;
1359 }
1360
1361 fdi.m_sym_ctx = sym_ctx;
1362 fdi.m_name = function->GetName();
1363 fdi.m_copied_type = copied_func_type;
1364 fdi.m_decl_lvl = LLDB_INVALID_DECL_LEVEL;
1365 if (fdi.m_copied_type && func_decl_context) {
1366 // Call CountDeclLevels to get the number of parent scopes we
1367 // have to look through before we find the function declaration.
1368 // When comparing functions of the same type, the one with a
1369 // lower count will be closer to us in the lookup scope and
1370 // shadows the other.
1371 clang::DeclContext *func_decl_ctx =
1372 (clang::DeclContext *)func_decl_context.GetOpaqueDeclContext();
1373 fdi.m_decl_lvl = ast->CountDeclLevels(
1374 frame_decl_ctx, func_decl_ctx, &fdi.m_name, &fdi.m_copied_type);
1375 }
1376 fdi_cache.emplace_back(fdi);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001377 }
1378
Sean Callananc02a1c02017-04-24 23:14:04 +00001379 // Loop through the functions in our cache looking for matching types,
1380 // then compare their scope levels to see which is closer.
1381 std::multimap<CompilerType, const FuncDeclInfo *> matches;
1382 for (const FuncDeclInfo &fdi : fdi_cache) {
1383 const CompilerType t = fdi.m_copied_type;
1384 auto q = matches.find(t);
1385 if (q != matches.end()) {
1386 if (q->second->m_decl_lvl > fdi.m_decl_lvl)
1387 // This function is closer; remove the old set.
1388 matches.erase(t);
1389 else if (q->second->m_decl_lvl < fdi.m_decl_lvl)
1390 // The functions in our set are closer - skip this one.
1391 continue;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001392 }
Sean Callananc02a1c02017-04-24 23:14:04 +00001393 matches.insert(std::make_pair(t, &fdi));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001394 }
1395
Sean Callananc02a1c02017-04-24 23:14:04 +00001396 // Loop through our matches and add their symbol contexts to our list.
1397 SymbolContextList sc_func_list;
1398 for (const auto &q : matches)
1399 sc_func_list.Append(q.second->m_sym_ctx);
1400
1401 // Rejoin the lists with the functions in front.
1402 sc_list = sc_func_list;
1403 sc_list.Append(sc_sym_list);
1404 }
1405 }
1406
1407 if (sc_list.GetSize()) {
1408 Symbol *extern_symbol = NULL;
1409 Symbol *non_extern_symbol = NULL;
1410
1411 for (uint32_t index = 0, num_indices = sc_list.GetSize();
1412 index < num_indices; ++index) {
1413 SymbolContext sym_ctx;
1414 sc_list.GetContextAtIndex(index, sym_ctx);
1415
1416 if (sym_ctx.function) {
1417 CompilerDeclContext decl_ctx = sym_ctx.function->GetDeclContext();
1418
1419 if (!decl_ctx)
1420 continue;
1421
1422 // Filter out class/instance methods.
1423 if (decl_ctx.IsClassMethod(nullptr, nullptr, nullptr))
1424 continue;
1425
1426 AddOneFunction(context, sym_ctx.function, NULL, current_id);
1427 context.m_found.function_with_type_info = true;
1428 context.m_found.function = true;
1429 } else if (sym_ctx.symbol) {
1430 if (sym_ctx.symbol->GetType() == eSymbolTypeReExported && target) {
1431 sym_ctx.symbol = sym_ctx.symbol->ResolveReExportedSymbol(*target);
1432 if (sym_ctx.symbol == NULL)
1433 continue;
1434 }
1435
1436 if (sym_ctx.symbol->IsExternal())
1437 extern_symbol = sym_ctx.symbol;
1438 else
1439 non_extern_symbol = sym_ctx.symbol;
1440 }
1441 }
1442
1443 if (!context.m_found.function_with_type_info) {
1444 for (clang::NamedDecl *decl : decls_from_modules) {
1445 if (llvm::isa<clang::FunctionDecl>(decl)) {
1446 clang::NamedDecl *copied_decl =
Sean Callanan68e44232017-09-28 20:20:25 +00001447 llvm::cast_or_null<FunctionDecl>(CopyDecl(decl));
Sean Callananc02a1c02017-04-24 23:14:04 +00001448 if (copied_decl) {
1449 context.AddNamedDecl(copied_decl);
1450 context.m_found.function_with_type_info = true;
1451 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001452 }
1453 }
1454 }
1455
1456 if (!context.m_found.function_with_type_info) {
Sean Callananc02a1c02017-04-24 23:14:04 +00001457 if (extern_symbol) {
1458 AddOneFunction(context, NULL, extern_symbol, current_id);
1459 context.m_found.function = true;
1460 } else if (non_extern_symbol) {
1461 AddOneFunction(context, NULL, non_extern_symbol, current_id);
1462 context.m_found.function = true;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001463 }
1464 }
Sean Callananb3a36df2016-03-19 00:51:43 +00001465 }
Sean Callananc02a1c02017-04-24 23:14:04 +00001466
1467 if (!context.m_found.function_with_type_info) {
1468 // Try the modules next.
1469
1470 do {
1471 if (ClangModulesDeclVendor *modules_decl_vendor =
1472 m_target->GetClangModulesDeclVendor()) {
1473 bool append = false;
1474 uint32_t max_matches = 1;
1475 std::vector<clang::NamedDecl *> decls;
1476
1477 if (!modules_decl_vendor->FindDecls(name, append, max_matches, decls))
1478 break;
1479
1480 clang::NamedDecl *const decl_from_modules = decls[0];
1481
1482 if (llvm::isa<clang::FunctionDecl>(decl_from_modules)) {
1483 if (log) {
1484 log->Printf(" CAS::FEVD[%u] Matching function found for "
1485 "\"%s\" in the modules",
1486 current_id, name.GetCString());
1487 }
1488
Sean Callanan68e44232017-09-28 20:20:25 +00001489 clang::Decl *copied_decl = CopyDecl(decl_from_modules);
Sean Callananc02a1c02017-04-24 23:14:04 +00001490 clang::FunctionDecl *copied_function_decl =
1491 copied_decl ? dyn_cast<clang::FunctionDecl>(copied_decl)
1492 : nullptr;
1493
1494 if (!copied_function_decl) {
1495 if (log)
1496 log->Printf(" CAS::FEVD[%u] - Couldn't export a function "
1497 "declaration from the modules",
1498 current_id);
1499
1500 break;
1501 }
1502
1503 MaybeRegisterFunctionBody(copied_function_decl);
1504
1505 context.AddNamedDecl(copied_function_decl);
1506
1507 context.m_found.function_with_type_info = true;
1508 context.m_found.function = true;
1509 } else if (llvm::isa<clang::VarDecl>(decl_from_modules)) {
1510 if (log) {
1511 log->Printf(" CAS::FEVD[%u] Matching variable found for "
1512 "\"%s\" in the modules",
1513 current_id, name.GetCString());
1514 }
1515
Sean Callanan68e44232017-09-28 20:20:25 +00001516 clang::Decl *copied_decl = CopyDecl(decl_from_modules);
Sean Callananc02a1c02017-04-24 23:14:04 +00001517 clang::VarDecl *copied_var_decl =
1518 copied_decl ? dyn_cast_or_null<clang::VarDecl>(copied_decl)
1519 : nullptr;
1520
1521 if (!copied_var_decl) {
1522 if (log)
1523 log->Printf(" CAS::FEVD[%u] - Couldn't export a variable "
1524 "declaration from the modules",
1525 current_id);
1526
1527 break;
1528 }
1529
1530 context.AddNamedDecl(copied_var_decl);
1531
1532 context.m_found.variable = true;
1533 }
1534 }
1535 } while (0);
1536 }
1537
1538 if (target && !context.m_found.variable && !namespace_decl) {
1539 // We couldn't find a non-symbol variable for this. Now we'll hunt for
1540 // a generic
1541 // data symbol, and -- if it is found -- treat it as a variable.
Sean Callanan9c99faa2017-05-16 23:46:13 +00001542 Status error;
1543
1544 const Symbol *data_symbol =
1545 m_parser_vars->m_sym_ctx.FindBestGlobalDataSymbol(name, error);
1546
1547 if (!error.Success()) {
1548 const unsigned diag_id =
1549 m_ast_context->getDiagnostics().getCustomDiagID(
1550 clang::DiagnosticsEngine::Level::Error, "%0");
1551 m_ast_context->getDiagnostics().Report(diag_id) << error.AsCString();
1552 }
1553
Sean Callananc02a1c02017-04-24 23:14:04 +00001554 if (data_symbol) {
1555 std::string warning("got name from symbols: ");
1556 warning.append(name.AsCString());
1557 const unsigned diag_id =
1558 m_ast_context->getDiagnostics().getCustomDiagID(
1559 clang::DiagnosticsEngine::Level::Warning, "%0");
1560 m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str();
1561 AddOneGenericVariable(context, *data_symbol, current_id);
1562 context.m_found.variable = true;
1563 }
1564 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001565 }
Sean Callanan6b4067c2010-07-17 00:43:37 +00001566}
Greg Claytona2721472011-06-25 00:44:06 +00001567
Kate Stoneb9c1b512016-09-06 20:57:50 +00001568// static opaque_compiler_type_t
1569// MaybePromoteToBlockPointerType
Saleem Abdulrasoola68f7b62014-03-20 06:08:36 +00001570//(
1571// ASTContext *ast_context,
Bruce Mitchener23a3b0e2015-09-22 17:04:24 +00001572// opaque_compiler_type_t candidate_type
Saleem Abdulrasoola68f7b62014-03-20 06:08:36 +00001573//)
1574//{
1575// if (!candidate_type)
1576// return candidate_type;
1577//
1578// QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
1579//
Kate Stoneb9c1b512016-09-06 20:57:50 +00001580// const PointerType *candidate_pointer_type =
1581// dyn_cast<PointerType>(candidate_qual_type);
Saleem Abdulrasoola68f7b62014-03-20 06:08:36 +00001582//
1583// if (!candidate_pointer_type)
1584// return candidate_type;
1585//
1586// QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
1587//
Kate Stoneb9c1b512016-09-06 20:57:50 +00001588// const RecordType *pointee_record_type =
1589// dyn_cast<RecordType>(pointee_qual_type);
Saleem Abdulrasoola68f7b62014-03-20 06:08:36 +00001590//
1591// if (!pointee_record_type)
1592// return candidate_type;
1593//
1594// RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
1595//
1596// if (!pointee_record_decl->isRecord())
1597// return candidate_type;
1598//
Kate Stoneb9c1b512016-09-06 20:57:50 +00001599// if
1600// (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
Saleem Abdulrasoola68f7b62014-03-20 06:08:36 +00001601// return candidate_type;
1602//
Kate Stoneb9c1b512016-09-06 20:57:50 +00001603// QualType generic_function_type =
1604// ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
1605// QualType block_pointer_type =
1606// ast_context->getBlockPointerType(generic_function_type);
Saleem Abdulrasoola68f7b62014-03-20 06:08:36 +00001607//
1608// return block_pointer_type.getAsOpaquePtr();
1609//}
Sean Callanan75383bf2012-03-06 21:56:33 +00001610
Kate Stoneb9c1b512016-09-06 20:57:50 +00001611bool ClangExpressionDeclMap::GetVariableValue(VariableSP &var,
1612 lldb_private::Value &var_location,
1613 TypeFromUser *user_type,
1614 TypeFromParser *parser_type) {
1615 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001616
Kate Stoneb9c1b512016-09-06 20:57:50 +00001617 Type *var_type = var->GetType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001618
Kate Stoneb9c1b512016-09-06 20:57:50 +00001619 if (!var_type) {
Sean Callananea22d422010-07-16 00:09:46 +00001620 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001621 log->PutCString("Skipped a definition because it has no type");
1622 return false;
1623 }
1624
1625 CompilerType var_clang_type = var_type->GetFullCompilerType();
1626
1627 if (!var_clang_type) {
1628 if (log)
1629 log->PutCString("Skipped a definition because it has no Clang type");
1630 return false;
1631 }
1632
1633 ClangASTContext *clang_ast = llvm::dyn_cast_or_null<ClangASTContext>(
1634 var_type->GetForwardCompilerType().GetTypeSystem());
1635
1636 if (!clang_ast) {
1637 if (log)
1638 log->PutCString("Skipped a definition because it has no Clang AST");
1639 return false;
1640 }
1641
1642 ASTContext *ast = clang_ast->getASTContext();
1643
1644 if (!ast) {
1645 if (log)
1646 log->PutCString(
1647 "There is no AST context for the current execution context");
1648 return false;
1649 }
1650 // var_clang_type = MaybePromoteToBlockPointerType (ast, var_clang_type);
1651
1652 DWARFExpression &var_location_expr = var->LocationExpression();
1653
1654 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Zachary Turner97206d52017-05-12 04:51:55 +00001655 Status err;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001656
1657 if (var->GetLocationIsConstantValueData()) {
1658 DataExtractor const_value_extractor;
1659
1660 if (var_location_expr.GetExpressionData(const_value_extractor)) {
1661 var_location = Value(const_value_extractor.GetDataStart(),
1662 const_value_extractor.GetByteSize());
1663 var_location.SetValueType(Value::eValueTypeHostAddress);
1664 } else {
1665 if (log)
1666 log->Printf("Error evaluating constant variable: %s", err.AsCString());
1667 return false;
Greg Clayton7b462cc2010-10-15 22:48:33 +00001668 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001669 }
1670
1671 CompilerType type_to_use = GuardedCopyType(var_clang_type);
1672
1673 if (!type_to_use) {
1674 if (log)
1675 log->Printf(
1676 "Couldn't copy a variable's type into the parser's AST context");
1677
1678 return false;
1679 }
1680
1681 if (parser_type)
1682 *parser_type = TypeFromParser(type_to_use);
1683
1684 if (var_location.GetContextType() == Value::eContextTypeInvalid)
1685 var_location.SetCompilerType(type_to_use);
1686
1687 if (var_location.GetValueType() == Value::eValueTypeFileAddress) {
1688 SymbolContext var_sc;
1689 var->CalculateSymbolContext(&var_sc);
1690
1691 if (!var_sc.module_sp)
1692 return false;
1693
1694 Address so_addr(var_location.GetScalar().ULongLong(),
1695 var_sc.module_sp->GetSectionList());
1696
1697 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
1698
1699 if (load_addr != LLDB_INVALID_ADDRESS) {
1700 var_location.GetScalar() = load_addr;
1701 var_location.SetValueType(Value::eValueTypeLoadAddress);
1702 }
1703 }
1704
1705 if (user_type)
1706 *user_type = TypeFromUser(var_clang_type);
1707
1708 return true;
Sean Callanan468574b2010-06-22 23:46:24 +00001709}
1710
Kate Stoneb9c1b512016-09-06 20:57:50 +00001711void ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
1712 VariableSP var,
1713 ValueObjectSP valobj,
1714 unsigned int current_id) {
1715 assert(m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001716
Kate Stoneb9c1b512016-09-06 20:57:50 +00001717 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001718
Kate Stoneb9c1b512016-09-06 20:57:50 +00001719 TypeFromUser ut;
1720 TypeFromParser pt;
1721 Value var_location;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001722
Kate Stoneb9c1b512016-09-06 20:57:50 +00001723 if (!GetVariableValue(var, var_location, &ut, &pt))
1724 return;
1725
1726 clang::QualType parser_opaque_type =
1727 QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
1728
1729 if (parser_opaque_type.isNull())
1730 return;
1731
1732 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr()) {
1733 if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
1734 CompleteType(tag_type->getDecl());
1735 if (const ObjCObjectPointerType *objc_object_ptr_type =
1736 dyn_cast<ObjCObjectPointerType>(parser_type))
1737 CompleteType(objc_object_ptr_type->getInterfaceDecl());
1738 }
1739
1740 bool is_reference = pt.IsReferenceType();
1741
1742 NamedDecl *var_decl = NULL;
1743 if (is_reference)
1744 var_decl = context.AddVarDecl(pt);
1745 else
1746 var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
1747
1748 std::string decl_name(context.m_decl_name.getAsString());
1749 ConstString entity_name(decl_name.c_str());
1750 ClangExpressionVariable *entity(new ClangExpressionVariable(valobj));
1751 m_found_entities.AddNewlyConstructedVariable(entity);
1752
1753 assert(entity);
1754 entity->EnableParserVars(GetParserID());
1755 ClangExpressionVariable::ParserVars *parser_vars =
1756 entity->GetParserVars(GetParserID());
1757 parser_vars->m_parser_type = pt;
1758 parser_vars->m_named_decl = var_decl;
1759 parser_vars->m_llvm_value = NULL;
1760 parser_vars->m_lldb_value = var_location;
1761 parser_vars->m_lldb_var = var;
1762
1763 if (is_reference)
1764 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
1765
1766 if (log) {
1767 ASTDumper orig_dumper(ut.GetOpaqueQualType());
1768 ASTDumper ast_dumper(var_decl);
1769 log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s (original %s)",
1770 current_id, decl_name.c_str(), ast_dumper.GetCString(),
1771 orig_dumper.GetCString());
1772 }
1773}
1774
1775void ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
1776 ExpressionVariableSP &pvar_sp,
1777 unsigned int current_id) {
1778 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1779
1780 TypeFromUser user_type(
1781 llvm::cast<ClangExpressionVariable>(pvar_sp.get())->GetTypeFromUser());
1782
1783 TypeFromParser parser_type(GuardedCopyType(user_type));
1784
1785 if (!parser_type.GetOpaqueQualType()) {
1786 if (log)
1787 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s",
1788 current_id, pvar_sp->GetName().GetCString());
1789 return;
1790 }
1791
1792 NamedDecl *var_decl =
1793 context.AddVarDecl(parser_type.GetLValueReferenceType());
1794
1795 llvm::cast<ClangExpressionVariable>(pvar_sp.get())
1796 ->EnableParserVars(GetParserID());
1797 ClangExpressionVariable::ParserVars *parser_vars =
1798 llvm::cast<ClangExpressionVariable>(pvar_sp.get())
1799 ->GetParserVars(GetParserID());
1800 parser_vars->m_parser_type = parser_type;
1801 parser_vars->m_named_decl = var_decl;
1802 parser_vars->m_llvm_value = NULL;
1803 parser_vars->m_lldb_value.Clear();
1804
1805 if (log) {
1806 ASTDumper ast_dumper(var_decl);
1807 log->Printf(" CEDM::FEVD[%u] Added pvar %s, returned %s", current_id,
1808 pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
1809 }
1810}
1811
1812void ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
1813 const Symbol &symbol,
1814 unsigned int current_id) {
1815 assert(m_parser_vars.get());
1816
1817 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1818
1819 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1820
1821 if (target == NULL)
1822 return;
1823
1824 ASTContext *scratch_ast_context =
1825 target->GetScratchClangASTContext()->getASTContext();
1826
1827 TypeFromUser user_type(
1828 ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid)
1829 .GetPointerType()
1830 .GetLValueReferenceType());
1831 TypeFromParser parser_type(
1832 ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid)
1833 .GetPointerType()
1834 .GetLValueReferenceType());
1835 NamedDecl *var_decl = context.AddVarDecl(parser_type);
1836
1837 std::string decl_name(context.m_decl_name.getAsString());
1838 ConstString entity_name(decl_name.c_str());
1839 ClangExpressionVariable *entity(new ClangExpressionVariable(
1840 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), entity_name,
1841 user_type, m_parser_vars->m_target_info.byte_order,
1842 m_parser_vars->m_target_info.address_byte_size));
1843 m_found_entities.AddNewlyConstructedVariable(entity);
1844
1845 entity->EnableParserVars(GetParserID());
1846 ClangExpressionVariable::ParserVars *parser_vars =
1847 entity->GetParserVars(GetParserID());
1848
1849 const Address symbol_address = symbol.GetAddress();
1850 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
1851
1852 // parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType,
1853 // user_type.GetOpaqueQualType());
1854 parser_vars->m_lldb_value.SetCompilerType(user_type);
1855 parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
1856 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
1857
1858 parser_vars->m_parser_type = parser_type;
1859 parser_vars->m_named_decl = var_decl;
1860 parser_vars->m_llvm_value = NULL;
1861 parser_vars->m_lldb_sym = &symbol;
1862
1863 if (log) {
1864 ASTDumper ast_dumper(var_decl);
1865
1866 log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id,
1867 decl_name.c_str(), ast_dumper.GetCString());
1868 }
1869}
1870
1871bool ClangExpressionDeclMap::ResolveUnknownTypes() {
1872 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1873 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1874
Sean Callanan68e44232017-09-28 20:20:25 +00001875 ClangASTContextForExpressions *scratch_ast_context =
1876 static_cast<ClangASTContextForExpressions*>(
1877 target->GetScratchClangASTContext());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001878
1879 for (size_t index = 0, num_entities = m_found_entities.GetSize();
1880 index < num_entities; ++index) {
1881 ExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
1882
1883 ClangExpressionVariable::ParserVars *parser_vars =
1884 llvm::cast<ClangExpressionVariable>(entity.get())
1885 ->GetParserVars(GetParserID());
1886
1887 if (entity->m_flags & ClangExpressionVariable::EVUnknownType) {
1888 const NamedDecl *named_decl = parser_vars->m_named_decl;
1889 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
1890
1891 if (!var_decl) {
Sean Callanane0a64f72011-12-01 21:04:37 +00001892 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001893 log->Printf("Entity of unknown type does not have a VarDecl");
1894 return false;
1895 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001896
Kate Stoneb9c1b512016-09-06 20:57:50 +00001897 if (log) {
1898 ASTDumper ast_dumper(const_cast<VarDecl *>(var_decl));
1899 log->Printf("Variable of unknown type now has Decl %s",
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001900 ast_dumper.GetCString());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001901 }
1902
1903 QualType var_type = var_decl->getType();
1904 TypeFromParser parser_type(
1905 var_type.getAsOpaquePtr(),
1906 ClangASTContext::GetASTContext(&var_decl->getASTContext()));
1907
Sean Callanan68e44232017-09-28 20:20:25 +00001908 lldb::opaque_compiler_type_t copied_type = 0;
1909 if (m_ast_importer_sp) {
1910 copied_type = m_ast_importer_sp->CopyType(
1911 scratch_ast_context->getASTContext(), &var_decl->getASTContext(),
1912 var_type.getAsOpaquePtr());
1913 } else if (HasMerger()) {
1914 copied_type = CopyTypeWithMerger(
1915 var_decl->getASTContext(),
1916 scratch_ast_context->GetMergerUnchecked(),
1917 var_type).getAsOpaquePtr();
1918 } else {
1919 lldbassert(!"No mechanism to copy a resolved unknown type!");
1920 return false;
1921 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001922
1923 if (!copied_type) {
1924 if (log)
1925 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't "
1926 "import the type for a variable");
1927
1928 return (bool)lldb::ExpressionVariableSP();
1929 }
1930
1931 TypeFromUser user_type(copied_type, scratch_ast_context);
1932
1933 // parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType,
1934 // user_type.GetOpaqueQualType());
1935 parser_vars->m_lldb_value.SetCompilerType(user_type);
1936 parser_vars->m_parser_type = parser_type;
1937
1938 entity->SetCompilerType(user_type);
1939
1940 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
Greg Clayton7b462cc2010-10-15 22:48:33 +00001941 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001942 }
1943
1944 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001945}
Sean Callanan5666b672010-08-04 01:02:13 +00001946
Kate Stoneb9c1b512016-09-06 20:57:50 +00001947void ClangExpressionDeclMap::AddOneRegister(NameSearchContext &context,
1948 const RegisterInfo *reg_info,
1949 unsigned int current_id) {
1950 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001951
Kate Stoneb9c1b512016-09-06 20:57:50 +00001952 CompilerType clang_type =
1953 ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(
1954 m_ast_context, reg_info->encoding, reg_info->byte_size * 8);
Sean Callanan7736a202016-04-29 18:09:03 +00001955
Kate Stoneb9c1b512016-09-06 20:57:50 +00001956 if (!clang_type) {
1957 if (log)
1958 log->Printf(" Tried to add a type for %s, but couldn't get one",
1959 context.m_decl_name.getAsString().c_str());
1960 return;
1961 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001962
Kate Stoneb9c1b512016-09-06 20:57:50 +00001963 TypeFromParser parser_clang_type(clang_type);
Sean Callananfa4fab72013-02-01 06:55:48 +00001964
Kate Stoneb9c1b512016-09-06 20:57:50 +00001965 NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001966
Kate Stoneb9c1b512016-09-06 20:57:50 +00001967 ClangExpressionVariable *entity(new ClangExpressionVariable(
1968 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
1969 m_parser_vars->m_target_info.byte_order,
1970 m_parser_vars->m_target_info.address_byte_size));
1971 m_found_entities.AddNewlyConstructedVariable(entity);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001972
Kate Stoneb9c1b512016-09-06 20:57:50 +00001973 std::string decl_name(context.m_decl_name.getAsString());
1974 entity->SetName(ConstString(decl_name.c_str()));
1975 entity->SetRegisterInfo(reg_info);
1976 entity->EnableParserVars(GetParserID());
1977 ClangExpressionVariable::ParserVars *parser_vars =
1978 entity->GetParserVars(GetParserID());
1979 parser_vars->m_parser_type = parser_clang_type;
1980 parser_vars->m_named_decl = var_decl;
1981 parser_vars->m_llvm_value = NULL;
1982 parser_vars->m_lldb_value.Clear();
1983 entity->m_flags |= ClangExpressionVariable::EVBareRegister;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001984
Kate Stoneb9c1b512016-09-06 20:57:50 +00001985 if (log) {
1986 ASTDumper ast_dumper(var_decl);
1987 log->Printf(" CEDM::FEVD[%d] Added register %s, returned %s", current_id,
1988 context.m_decl_name.getAsString().c_str(),
1989 ast_dumper.GetCString());
1990 }
1991}
1992
1993void ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
1994 Function *function, Symbol *symbol,
1995 unsigned int current_id) {
1996 assert(m_parser_vars.get());
1997
1998 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1999
2000 NamedDecl *function_decl = NULL;
2001 Address fun_address;
2002 CompilerType function_clang_type;
2003
2004 bool is_indirect_function = false;
2005
2006 if (function) {
2007 Type *function_type = function->GetType();
2008
Luke Drummondf5bb1d62016-12-19 17:22:44 +00002009 const auto lang = function->GetCompileUnit()->GetLanguage();
2010 const auto name = function->GetMangled().GetMangledName().AsCString();
2011 const bool extern_c = (Language::LanguageIsC(lang) &&
2012 !CPlusPlusLanguage::IsCPPMangledName(name)) ||
2013 (Language::LanguageIsObjC(lang) &&
2014 !Language::LanguageIsCPlusPlus(lang));
Kate Stoneb9c1b512016-09-06 20:57:50 +00002015
2016 if (!extern_c) {
2017 TypeSystem *type_system = function->GetDeclContext().GetTypeSystem();
2018 if (ClangASTContext *src_ast =
2019 llvm::dyn_cast<ClangASTContext>(type_system)) {
2020 clang::DeclContext *src_decl_context =
2021 (clang::DeclContext *)function->GetDeclContext()
2022 .GetOpaqueDeclContext();
2023 clang::FunctionDecl *src_function_decl =
2024 llvm::dyn_cast_or_null<clang::FunctionDecl>(src_decl_context);
Sean Callanan09e91ac2017-05-11 22:08:05 +00002025 if (src_function_decl &&
2026 src_function_decl->getTemplateSpecializationInfo()) {
2027 clang::FunctionTemplateDecl *function_template =
2028 src_function_decl->getTemplateSpecializationInfo()->getTemplate();
2029 clang::FunctionTemplateDecl *copied_function_template =
2030 llvm::dyn_cast_or_null<clang::FunctionTemplateDecl>(
Sean Callanan68e44232017-09-28 20:20:25 +00002031 CopyDecl(function_template));
Sean Callanan09e91ac2017-05-11 22:08:05 +00002032 if (copied_function_template) {
2033 if (log) {
2034 ASTDumper ast_dumper((clang::Decl *)copied_function_template);
2035
2036 StreamString ss;
2037
2038 function->DumpSymbolContext(&ss);
2039
2040 log->Printf(" CEDM::FEVD[%u] Imported decl for function template"
2041 " %s (description %s), returned %s",
2042 current_id,
2043 copied_function_template->getNameAsString().c_str(),
2044 ss.GetData(), ast_dumper.GetCString());
2045 }
2046
2047 context.AddNamedDecl(copied_function_template);
2048 }
2049 } else if (src_function_decl) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002050 if (clang::FunctionDecl *copied_function_decl =
2051 llvm::dyn_cast_or_null<clang::FunctionDecl>(
Sean Callanan68e44232017-09-28 20:20:25 +00002052 CopyDecl(src_function_decl))) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002053 if (log) {
2054 ASTDumper ast_dumper((clang::Decl *)copied_function_decl);
2055
2056 StreamString ss;
2057
2058 function->DumpSymbolContext(&ss);
2059
2060 log->Printf(" CEDM::FEVD[%u] Imported decl for function %s "
2061 "(description %s), returned %s",
2062 current_id,
2063 copied_function_decl->getNameAsString().c_str(),
2064 ss.GetData(), ast_dumper.GetCString());
2065 }
2066
2067 context.AddNamedDecl(copied_function_decl);
2068 return;
2069 } else {
2070 if (log) {
2071 log->Printf(" Failed to import the function decl for '%s'",
2072 src_function_decl->getName().str().c_str());
2073 }
2074 }
Sean Callanan7736a202016-04-29 18:09:03 +00002075 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002076 }
Sean Callananfc55f5d2010-09-21 00:44:12 +00002077 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002078
Kate Stoneb9c1b512016-09-06 20:57:50 +00002079 if (!function_type) {
2080 if (log)
2081 log->PutCString(" Skipped a function because it has no type");
2082 return;
2083 }
2084
2085 function_clang_type = function_type->GetFullCompilerType();
2086
2087 if (!function_clang_type) {
2088 if (log)
2089 log->PutCString(" Skipped a function because it has no Clang type");
2090 return;
2091 }
2092
2093 fun_address = function->GetAddressRange().GetBaseAddress();
2094
2095 CompilerType copied_function_type = GuardedCopyType(function_clang_type);
2096 if (copied_function_type) {
2097 function_decl = context.AddFunDecl(copied_function_type, extern_c);
2098
2099 if (!function_decl) {
2100 if (log) {
2101 log->Printf(
2102 " Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}",
2103 function_type->GetName().GetCString(), function_type->GetID());
2104 }
2105
Sean Callanan3b436d22015-10-23 21:45:02 +00002106 return;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002107 }
2108 } else {
2109 // We failed to copy the type we found
2110 if (log) {
2111 log->Printf(" Failed to import the function type '%s' {0x%8.8" PRIx64
2112 "} into the expression parser AST contenxt",
2113 function_type->GetName().GetCString(),
2114 function_type->GetID());
2115 }
2116
2117 return;
2118 }
2119 } else if (symbol) {
2120 fun_address = symbol->GetAddress();
2121 function_decl = context.AddGenericFunDecl();
2122 is_indirect_function = symbol->IsIndirect();
2123 } else {
2124 if (log)
2125 log->PutCString(" AddOneFunction called with no function and no symbol");
2126 return;
2127 }
2128
2129 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
2130
2131 lldb::addr_t load_addr =
2132 fun_address.GetCallableLoadAddress(target, is_indirect_function);
2133
2134 ClangExpressionVariable *entity(new ClangExpressionVariable(
2135 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
2136 m_parser_vars->m_target_info.byte_order,
2137 m_parser_vars->m_target_info.address_byte_size));
2138 m_found_entities.AddNewlyConstructedVariable(entity);
2139
2140 std::string decl_name(context.m_decl_name.getAsString());
2141 entity->SetName(ConstString(decl_name.c_str()));
2142 entity->SetCompilerType(function_clang_type);
2143 entity->EnableParserVars(GetParserID());
2144
2145 ClangExpressionVariable::ParserVars *parser_vars =
2146 entity->GetParserVars(GetParserID());
2147
2148 if (load_addr != LLDB_INVALID_ADDRESS) {
2149 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
2150 parser_vars->m_lldb_value.GetScalar() = load_addr;
2151 } else {
2152 // We have to try finding a file address.
2153
2154 lldb::addr_t file_addr = fun_address.GetFileAddress();
2155
2156 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress);
2157 parser_vars->m_lldb_value.GetScalar() = file_addr;
2158 }
2159
2160 parser_vars->m_named_decl = function_decl;
2161 parser_vars->m_llvm_value = NULL;
2162
2163 if (log) {
2164 ASTDumper ast_dumper(function_decl);
2165
2166 StreamString ss;
2167
2168 fun_address.Dump(&ss,
2169 m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
2170 Address::DumpStyleResolvedDescription);
2171
2172 log->Printf(
2173 " CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
2174 current_id, (function ? "specific" : "generic"), decl_name.c_str(),
2175 ss.GetData(), ast_dumper.GetCString());
2176 }
2177}
2178
2179void ClangExpressionDeclMap::AddThisType(NameSearchContext &context,
2180 TypeFromUser &ut,
2181 unsigned int current_id) {
2182 CompilerType copied_clang_type = GuardedCopyType(ut);
2183
2184 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
2185
2186 if (!copied_clang_type) {
2187 if (log)
2188 log->Printf(
2189 "ClangExpressionDeclMap::AddThisType - Couldn't import the type");
Sean Callanan3b436d22015-10-23 21:45:02 +00002190
2191 return;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002192 }
2193
2194 if (copied_clang_type.IsAggregateType() &&
2195 copied_clang_type.GetCompleteType()) {
2196 CompilerType void_clang_type =
2197 ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid);
2198 CompilerType void_ptr_clang_type = void_clang_type.GetPointerType();
2199
2200 CompilerType method_type = ClangASTContext::CreateFunctionType(
2201 m_ast_context, void_clang_type, &void_ptr_clang_type, 1, false, 0);
2202
2203 const bool is_virtual = false;
2204 const bool is_static = false;
2205 const bool is_inline = false;
2206 const bool is_explicit = false;
2207 const bool is_attr_used = true;
2208 const bool is_artificial = false;
2209
2210 CXXMethodDecl *method_decl =
2211 ClangASTContext::GetASTContext(m_ast_context)
2212 ->AddMethodToCXXRecordType(
2213 copied_clang_type.GetOpaqueQualType(), "$__lldb_expr",
2214 method_type, lldb::eAccessPublic, is_virtual, is_static,
2215 is_inline, is_explicit, is_attr_used, is_artificial);
2216
2217 if (log) {
2218 ASTDumper method_ast_dumper((clang::Decl *)method_decl);
2219 ASTDumper type_ast_dumper(copied_clang_type);
2220
2221 log->Printf(" CEDM::AddThisType Added function $__lldb_expr "
2222 "(description %s) for this type %s",
2223 method_ast_dumper.GetCString(), type_ast_dumper.GetCString());
2224 }
2225 }
2226
2227 if (!copied_clang_type.IsValid())
2228 return;
2229
2230 TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(
2231 QualType::getFromOpaquePtr(copied_clang_type.GetOpaqueQualType()));
2232
2233 if (!type_source_info)
2234 return;
2235
2236 // Construct a typedef type because if "*this" is a templated type we can't
2237 // just return ClassTemplateSpecializationDecls in response to name queries.
2238 // Using a typedef makes this much more robust.
2239
2240 TypedefDecl *typedef_decl = TypedefDecl::Create(
2241 *m_ast_context, m_ast_context->getTranslationUnitDecl(), SourceLocation(),
2242 SourceLocation(), context.m_decl_name.getAsIdentifierInfo(),
2243 type_source_info);
2244
2245 if (!typedef_decl)
2246 return;
2247
2248 context.AddNamedDecl(typedef_decl);
2249
2250 return;
Sean Callananfa4fab72013-02-01 06:55:48 +00002251}
2252
Kate Stoneb9c1b512016-09-06 20:57:50 +00002253void ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
2254 TypeFromUser &ut,
2255 unsigned int current_id) {
2256 CompilerType copied_clang_type = GuardedCopyType(ut);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002257
Kate Stoneb9c1b512016-09-06 20:57:50 +00002258 if (!copied_clang_type) {
2259 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Sean Callananfa4fab72013-02-01 06:55:48 +00002260
Kate Stoneb9c1b512016-09-06 20:57:50 +00002261 if (log)
2262 log->Printf(
2263 "ClangExpressionDeclMap::AddOneType - Couldn't import the type");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002264
Kate Stoneb9c1b512016-09-06 20:57:50 +00002265 return;
2266 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002267
Kate Stoneb9c1b512016-09-06 20:57:50 +00002268 context.AddTypeDecl(copied_clang_type);
Sean Callanan5666b672010-08-04 01:02:13 +00002269}