blob: 621441449c208bcafa51bc2727966ca092b6c967 [file] [log] [blame]
Greg Claytona2721472011-06-25 00:44:06 +00001//===-- ClangASTImporter.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
Zachary Turnerd133f6a2016-03-28 22:53:41 +000010#include "lldb/Symbol/ClangASTImporter.h"
Zachary Turnerd133f6a2016-03-28 22:53:41 +000011#include "lldb/Core/Module.h"
12#include "lldb/Symbol/ClangASTContext.h"
13#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
14#include "lldb/Symbol/ClangUtil.h"
15#include "lldb/Utility/LLDBAssert.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000016#include "lldb/Utility/Log.h"
Greg Claytona2721472011-06-25 00:44:06 +000017#include "clang/AST/Decl.h"
Sean Callanancbbe3ac2012-01-13 22:55:55 +000018#include "clang/AST/DeclCXX.h"
Sean Callanancc427fa2011-07-30 02:42:06 +000019#include "clang/AST/DeclObjC.h"
Greg Claytonf74c4032012-12-03 18:29:55 +000020#include "llvm/Support/raw_ostream.h"
Greg Claytona2721472011-06-25 00:44:06 +000021
22using namespace lldb_private;
23using namespace clang;
24
Kate Stoneb9c1b512016-09-06 20:57:50 +000025ClangASTMetrics::Counters ClangASTMetrics::global_counters = {0, 0, 0, 0, 0, 0};
26ClangASTMetrics::Counters ClangASTMetrics::local_counters = {0, 0, 0, 0, 0, 0};
Sean Callanan8106d802013-03-08 20:04:57 +000027
Kate Stoneb9c1b512016-09-06 20:57:50 +000028void ClangASTMetrics::DumpCounters(Log *log,
29 ClangASTMetrics::Counters &counters) {
30 log->Printf(" Number of visible Decl queries by name : %" PRIu64,
31 counters.m_visible_query_count);
32 log->Printf(" Number of lexical Decl queries : %" PRIu64,
33 counters.m_lexical_query_count);
34 log->Printf(" Number of imports initiated by LLDB : %" PRIu64,
35 counters.m_lldb_import_count);
36 log->Printf(" Number of imports conducted by Clang : %" PRIu64,
37 counters.m_clang_import_count);
38 log->Printf(" Number of Decls completed : %" PRIu64,
39 counters.m_decls_completed_count);
40 log->Printf(" Number of records laid out : %" PRIu64,
41 counters.m_record_layout_count);
Sean Callanan8106d802013-03-08 20:04:57 +000042}
43
Kate Stoneb9c1b512016-09-06 20:57:50 +000044void ClangASTMetrics::DumpCounters(Log *log) {
45 if (!log)
46 return;
47
48 log->Printf("== ClangASTMetrics output ==");
49 log->Printf("-- Global metrics --");
50 DumpCounters(log, global_counters);
51 log->Printf("-- Local metrics --");
52 DumpCounters(log, local_counters);
Sean Callanan8106d802013-03-08 20:04:57 +000053}
54
Kate Stoneb9c1b512016-09-06 20:57:50 +000055clang::QualType ClangASTImporter::CopyType(clang::ASTContext *dst_ast,
56 clang::ASTContext *src_ast,
57 clang::QualType type) {
58 MinionSP minion_sp(GetMinion(dst_ast, src_ast));
59
60 if (minion_sp)
61 return minion_sp->Import(type);
62
63 return QualType();
Greg Claytona2721472011-06-25 00:44:06 +000064}
65
Bruce Mitchener23a3b0e2015-09-22 17:04:24 +000066lldb::opaque_compiler_type_t
Kate Stoneb9c1b512016-09-06 20:57:50 +000067ClangASTImporter::CopyType(clang::ASTContext *dst_ast,
68 clang::ASTContext *src_ast,
69 lldb::opaque_compiler_type_t type) {
70 return CopyType(dst_ast, src_ast, QualType::getFromOpaquePtr(type))
71 .getAsOpaquePtr();
Sean Callanan80f78672011-11-16 19:07:39 +000072}
73
Kate Stoneb9c1b512016-09-06 20:57:50 +000074CompilerType ClangASTImporter::CopyType(ClangASTContext &dst_ast,
75 const CompilerType &src_type) {
76 clang::ASTContext *dst_clang_ast = dst_ast.getASTContext();
77 if (dst_clang_ast) {
78 ClangASTContext *src_ast =
79 llvm::dyn_cast_or_null<ClangASTContext>(src_type.GetTypeSystem());
80 if (src_ast) {
81 clang::ASTContext *src_clang_ast = src_ast->getASTContext();
82 if (src_clang_ast) {
83 lldb::opaque_compiler_type_t dst_clang_type = CopyType(
84 dst_clang_ast, src_clang_ast, src_type.GetOpaqueQualType());
Greg Claytone6b36cd2015-12-08 01:02:08 +000085
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 if (dst_clang_type)
87 return CompilerType(&dst_ast, dst_clang_type);
88 }
Greg Claytone6b36cd2015-12-08 01:02:08 +000089 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000090 }
91 return CompilerType();
Greg Claytone6b36cd2015-12-08 01:02:08 +000092}
93
Kate Stoneb9c1b512016-09-06 20:57:50 +000094clang::Decl *ClangASTImporter::CopyDecl(clang::ASTContext *dst_ast,
95 clang::ASTContext *src_ast,
96 clang::Decl *decl) {
97 MinionSP minion_sp;
Sean Callananbfb237bc2011-11-04 22:46:46 +000098
Kate Stoneb9c1b512016-09-06 20:57:50 +000099 minion_sp = GetMinion(dst_ast, src_ast);
Greg Claytona2721472011-06-25 00:44:06 +0000100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 if (minion_sp) {
102 clang::Decl *result = minion_sp->Import(decl);
103
104 if (!result) {
105 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
106
107 if (log) {
108 lldb::user_id_t user_id = LLDB_INVALID_UID;
109 ClangASTMetadata *metadata = GetDeclMetadata(decl);
110 if (metadata)
111 user_id = metadata->GetUserID();
112
113 if (NamedDecl *named_decl = dyn_cast<NamedDecl>(decl))
114 log->Printf(" [ClangASTImporter] WARNING: Failed to import a %s "
115 "'%s', metadata 0x%" PRIx64,
116 decl->getDeclKindName(),
117 named_decl->getNameAsString().c_str(), user_id);
Sean Callanan83b8ad02015-07-08 18:03:41 +0000118 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119 log->Printf(" [ClangASTImporter] WARNING: Failed to import a %s, "
120 "metadata 0x%" PRIx64,
121 decl->getDeclKindName(), user_id);
122 }
123 }
124
125 return result;
126 }
127
128 return nullptr;
129}
130
131class DeclContextOverride {
132private:
133 struct Backup {
134 clang::DeclContext *decl_context;
135 clang::DeclContext *lexical_decl_context;
136 };
137
138 std::map<clang::Decl *, Backup> m_backups;
139
140 void OverrideOne(clang::Decl *decl) {
141 if (m_backups.find(decl) != m_backups.end()) {
142 return;
143 }
144
145 m_backups[decl] = {decl->getDeclContext(), decl->getLexicalDeclContext()};
146
147 decl->setDeclContext(decl->getASTContext().getTranslationUnitDecl());
148 decl->setLexicalDeclContext(decl->getASTContext().getTranslationUnitDecl());
149 }
150
151 bool ChainPassesThrough(
152 clang::Decl *decl, clang::DeclContext *base,
153 clang::DeclContext *(clang::Decl::*contextFromDecl)(),
154 clang::DeclContext *(clang::DeclContext::*contextFromContext)()) {
155 for (DeclContext *decl_ctx = (decl->*contextFromDecl)(); decl_ctx;
156 decl_ctx = (decl_ctx->*contextFromContext)()) {
157 if (decl_ctx == base) {
158 return true;
159 }
160 }
161
162 return false;
163 }
164
165 clang::Decl *GetEscapedChild(clang::Decl *decl,
166 clang::DeclContext *base = nullptr) {
167 if (base) {
168 // decl's DeclContext chains must pass through base.
169
170 if (!ChainPassesThrough(decl, base, &clang::Decl::getDeclContext,
171 &clang::DeclContext::getParent) ||
172 !ChainPassesThrough(decl, base, &clang::Decl::getLexicalDeclContext,
173 &clang::DeclContext::getLexicalParent)) {
174 return decl;
175 }
176 } else {
177 base = clang::dyn_cast<clang::DeclContext>(decl);
178
179 if (!base) {
Sean Callanan83b8ad02015-07-08 18:03:41 +0000180 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000181 }
Sean Callanan83b8ad02015-07-08 18:03:41 +0000182 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183
184 if (clang::DeclContext *context =
185 clang::dyn_cast<clang::DeclContext>(decl)) {
186 for (clang::Decl *decl : context->decls()) {
187 if (clang::Decl *escaped_child = GetEscapedChild(decl)) {
188 return escaped_child;
Sean Callanan83b8ad02015-07-08 18:03:41 +0000189 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190 }
Sean Callanan83b8ad02015-07-08 18:03:41 +0000191 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192
193 return nullptr;
194 }
195
196 void Override(clang::Decl *decl) {
197 if (clang::Decl *escaped_child = GetEscapedChild(decl)) {
198 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
199
200 if (log)
201 log->Printf(" [ClangASTImporter] DeclContextOverride couldn't "
202 "override (%sDecl*)%p - its child (%sDecl*)%p escapes",
203 decl->getDeclKindName(), static_cast<void *>(decl),
204 escaped_child->getDeclKindName(),
205 static_cast<void *>(escaped_child));
206 lldbassert(0 && "Couldn't override!");
207 }
208
209 OverrideOne(decl);
210 }
211
Sean Callanan83b8ad02015-07-08 18:03:41 +0000212public:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213 DeclContextOverride() {}
214
215 void OverrideAllDeclsFromContainingFunction(clang::Decl *decl) {
216 for (DeclContext *decl_context = decl->getLexicalDeclContext();
217 decl_context; decl_context = decl_context->getLexicalParent()) {
218 DeclContext *redecl_context = decl_context->getRedeclContext();
219
220 if (llvm::isa<FunctionDecl>(redecl_context) &&
221 llvm::isa<TranslationUnitDecl>(redecl_context->getLexicalParent())) {
222 for (clang::Decl *child_decl : decl_context->decls()) {
223 Override(child_decl);
Sean Callanan83b8ad02015-07-08 18:03:41 +0000224 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000225 }
Sean Callanan83b8ad02015-07-08 18:03:41 +0000226 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000227 }
228
229 ~DeclContextOverride() {
230 for (const std::pair<clang::Decl *, Backup> &backup : m_backups) {
231 backup.first->setDeclContext(backup.second.decl_context);
232 backup.first->setLexicalDeclContext(backup.second.lexical_decl_context);
Sean Callanan83b8ad02015-07-08 18:03:41 +0000233 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000234 }
Sean Callanan83b8ad02015-07-08 18:03:41 +0000235};
236
Bruce Mitchener23a3b0e2015-09-22 17:04:24 +0000237lldb::opaque_compiler_type_t
Kate Stoneb9c1b512016-09-06 20:57:50 +0000238ClangASTImporter::DeportType(clang::ASTContext *dst_ctx,
239 clang::ASTContext *src_ctx,
240 lldb::opaque_compiler_type_t type) {
241 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan4a2a71f2015-09-02 16:39:23 +0000242
Kate Stoneb9c1b512016-09-06 20:57:50 +0000243 if (log)
244 log->Printf(" [ClangASTImporter] DeportType called on (%sType*)0x%llx "
245 "from (ASTContext*)%p to (ASTContext*)%p",
246 QualType::getFromOpaquePtr(type)->getTypeClassName(),
247 (unsigned long long)type, static_cast<void *>(src_ctx),
248 static_cast<void *>(dst_ctx));
Sean Callanane55bc8a2013-03-30 02:31:21 +0000249
Kate Stoneb9c1b512016-09-06 20:57:50 +0000250 MinionSP minion_sp(GetMinion(dst_ctx, src_ctx));
251
252 if (!minion_sp)
253 return nullptr;
254
255 std::set<NamedDecl *> decls_to_deport;
256 std::set<NamedDecl *> decls_already_deported;
257
258 DeclContextOverride decl_context_override;
259
260 if (const clang::TagType *tag_type =
261 clang::QualType::getFromOpaquePtr(type)->getAs<TagType>()) {
262 decl_context_override.OverrideAllDeclsFromContainingFunction(
263 tag_type->getDecl());
264 }
265
266 minion_sp->InitDeportWorkQueues(&decls_to_deport, &decls_already_deported);
267
268 lldb::opaque_compiler_type_t result = CopyType(dst_ctx, src_ctx, type);
269
270 minion_sp->ExecuteDeportWorkQueues();
271
272 if (!result)
273 return nullptr;
274
275 return result;
Sean Callananbb120042011-12-16 21:06:35 +0000276}
277
Kate Stoneb9c1b512016-09-06 20:57:50 +0000278clang::Decl *ClangASTImporter::DeportDecl(clang::ASTContext *dst_ctx,
279 clang::ASTContext *src_ctx,
280 clang::Decl *decl) {
281 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000282
Kate Stoneb9c1b512016-09-06 20:57:50 +0000283 if (log)
284 log->Printf(" [ClangASTImporter] DeportDecl called on (%sDecl*)%p from "
285 "(ASTContext*)%p to (ASTContext*)%p",
286 decl->getDeclKindName(), static_cast<void *>(decl),
287 static_cast<void *>(src_ctx), static_cast<void *>(dst_ctx));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000288
Kate Stoneb9c1b512016-09-06 20:57:50 +0000289 MinionSP minion_sp(GetMinion(dst_ctx, src_ctx));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000290
Kate Stoneb9c1b512016-09-06 20:57:50 +0000291 if (!minion_sp)
292 return nullptr;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000293
Kate Stoneb9c1b512016-09-06 20:57:50 +0000294 std::set<NamedDecl *> decls_to_deport;
295 std::set<NamedDecl *> decls_already_deported;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000296
Kate Stoneb9c1b512016-09-06 20:57:50 +0000297 DeclContextOverride decl_context_override;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000298
Kate Stoneb9c1b512016-09-06 20:57:50 +0000299 decl_context_override.OverrideAllDeclsFromContainingFunction(decl);
Sean Callanane55bc8a2013-03-30 02:31:21 +0000300
Kate Stoneb9c1b512016-09-06 20:57:50 +0000301 minion_sp->InitDeportWorkQueues(&decls_to_deport, &decls_already_deported);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000302
Kate Stoneb9c1b512016-09-06 20:57:50 +0000303 clang::Decl *result = CopyDecl(dst_ctx, src_ctx, decl);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000304
Kate Stoneb9c1b512016-09-06 20:57:50 +0000305 minion_sp->ExecuteDeportWorkQueues();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000306
Kate Stoneb9c1b512016-09-06 20:57:50 +0000307 if (!result)
308 return nullptr;
309
310 if (log)
311 log->Printf(
312 " [ClangASTImporter] DeportDecl deported (%sDecl*)%p to (%sDecl*)%p",
313 decl->getDeclKindName(), static_cast<void *>(decl),
314 result->getDeclKindName(), static_cast<void *>(result));
315
316 return result;
Sean Callanan0eed0d42011-12-06 03:41:14 +0000317}
318
Kate Stoneb9c1b512016-09-06 20:57:50 +0000319bool ClangASTImporter::CanImport(const CompilerType &type) {
320 if (!ClangUtil::IsClangType(type))
Zachary Turnerd133f6a2016-03-28 22:53:41 +0000321 return false;
Zachary Turnerd133f6a2016-03-28 22:53:41 +0000322
Kate Stoneb9c1b512016-09-06 20:57:50 +0000323 // TODO: remove external completion BOOL
324 // CompleteAndFetchChildren should get the Decl out and check for the
Zachary Turnerd133f6a2016-03-28 22:53:41 +0000325
Kate Stoneb9c1b512016-09-06 20:57:50 +0000326 clang::QualType qual_type(
327 ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type)));
Zachary Turnerd133f6a2016-03-28 22:53:41 +0000328
Kate Stoneb9c1b512016-09-06 20:57:50 +0000329 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
330 switch (type_class) {
331 case clang::Type::Record: {
332 const clang::CXXRecordDecl *cxx_record_decl =
333 qual_type->getAsCXXRecordDecl();
334 if (cxx_record_decl) {
335 if (ResolveDeclOrigin(cxx_record_decl, NULL, NULL))
Zachary Turnerd133f6a2016-03-28 22:53:41 +0000336 return true;
337 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000338 } break;
Zachary Turnerd133f6a2016-03-28 22:53:41 +0000339
Kate Stoneb9c1b512016-09-06 20:57:50 +0000340 case clang::Type::Enum: {
341 clang::EnumDecl *enum_decl =
342 llvm::cast<clang::EnumType>(qual_type)->getDecl();
343 if (enum_decl) {
344 if (ResolveDeclOrigin(enum_decl, NULL, NULL))
Greg Claytone6b36cd2015-12-08 01:02:08 +0000345 return true;
346 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000347 } break;
Greg Claytone6b36cd2015-12-08 01:02:08 +0000348
Kate Stoneb9c1b512016-09-06 20:57:50 +0000349 case clang::Type::ObjCObject:
350 case clang::Type::ObjCInterface: {
351 const clang::ObjCObjectType *objc_class_type =
352 llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
353 if (objc_class_type) {
354 clang::ObjCInterfaceDecl *class_interface_decl =
355 objc_class_type->getInterface();
356 // We currently can't complete objective C types through the newly added
Adrian Prantl05097242018-04-30 16:49:04 +0000357 // ASTContext because it only supports TagDecl objects right now...
Kate Stoneb9c1b512016-09-06 20:57:50 +0000358 if (class_interface_decl) {
359 if (ResolveDeclOrigin(class_interface_decl, NULL, NULL))
360 return true;
361 }
Greg Claytone6b36cd2015-12-08 01:02:08 +0000362 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000363 } break;
364
365 case clang::Type::Typedef:
366 return CanImport(CompilerType(type.GetTypeSystem(),
367 llvm::cast<clang::TypedefType>(qual_type)
368 ->getDecl()
369 ->getUnderlyingType()
370 .getAsOpaquePtr()));
371
372 case clang::Type::Auto:
373 return CanImport(CompilerType(type.GetTypeSystem(),
374 llvm::cast<clang::AutoType>(qual_type)
375 ->getDeducedType()
376 .getAsOpaquePtr()));
377
378 case clang::Type::Elaborated:
379 return CanImport(CompilerType(type.GetTypeSystem(),
380 llvm::cast<clang::ElaboratedType>(qual_type)
381 ->getNamedType()
382 .getAsOpaquePtr()));
383
384 case clang::Type::Paren:
385 return CanImport(CompilerType(
386 type.GetTypeSystem(),
387 llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
388
389 default:
390 break;
391 }
392
393 return false;
Greg Claytone6b36cd2015-12-08 01:02:08 +0000394}
395
Kate Stoneb9c1b512016-09-06 20:57:50 +0000396bool ClangASTImporter::Import(const CompilerType &type) {
397 if (!ClangUtil::IsClangType(type))
398 return false;
399 // TODO: remove external completion BOOL
400 // CompleteAndFetchChildren should get the Decl out and check for the
Greg Claytone6b36cd2015-12-08 01:02:08 +0000401
Kate Stoneb9c1b512016-09-06 20:57:50 +0000402 clang::QualType qual_type(
403 ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type)));
404
405 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
406 switch (type_class) {
407 case clang::Type::Record: {
408 const clang::CXXRecordDecl *cxx_record_decl =
409 qual_type->getAsCXXRecordDecl();
410 if (cxx_record_decl) {
411 if (ResolveDeclOrigin(cxx_record_decl, NULL, NULL))
412 return CompleteAndFetchChildren(qual_type);
413 }
414 } break;
415
416 case clang::Type::Enum: {
417 clang::EnumDecl *enum_decl =
418 llvm::cast<clang::EnumType>(qual_type)->getDecl();
419 if (enum_decl) {
420 if (ResolveDeclOrigin(enum_decl, NULL, NULL))
421 return CompleteAndFetchChildren(qual_type);
422 }
423 } break;
424
425 case clang::Type::ObjCObject:
426 case clang::Type::ObjCInterface: {
427 const clang::ObjCObjectType *objc_class_type =
428 llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
429 if (objc_class_type) {
430 clang::ObjCInterfaceDecl *class_interface_decl =
431 objc_class_type->getInterface();
432 // We currently can't complete objective C types through the newly added
Adrian Prantl05097242018-04-30 16:49:04 +0000433 // ASTContext because it only supports TagDecl objects right now...
Kate Stoneb9c1b512016-09-06 20:57:50 +0000434 if (class_interface_decl) {
435 if (ResolveDeclOrigin(class_interface_decl, NULL, NULL))
436 return CompleteAndFetchChildren(qual_type);
437 }
438 }
439 } break;
440
441 case clang::Type::Typedef:
442 return Import(CompilerType(type.GetTypeSystem(),
443 llvm::cast<clang::TypedefType>(qual_type)
444 ->getDecl()
445 ->getUnderlyingType()
446 .getAsOpaquePtr()));
447
448 case clang::Type::Auto:
449 return Import(CompilerType(type.GetTypeSystem(),
450 llvm::cast<clang::AutoType>(qual_type)
451 ->getDeducedType()
452 .getAsOpaquePtr()));
453
454 case clang::Type::Elaborated:
455 return Import(CompilerType(type.GetTypeSystem(),
456 llvm::cast<clang::ElaboratedType>(qual_type)
457 ->getNamedType()
458 .getAsOpaquePtr()));
459
460 case clang::Type::Paren:
461 return Import(CompilerType(
462 type.GetTypeSystem(),
463 llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
464
465 default:
466 break;
467 }
468 return false;
469}
470
471bool ClangASTImporter::CompleteType(const CompilerType &compiler_type) {
472 if (!CanImport(compiler_type))
473 return false;
474
475 if (Import(compiler_type)) {
476 ClangASTContext::CompleteTagDeclarationDefinition(compiler_type);
477 return true;
478 }
479
480 ClangASTContext::SetHasExternalStorage(compiler_type.GetOpaqueQualType(),
481 false);
482 return false;
483}
484
485bool ClangASTImporter::LayoutRecordType(
486 const clang::RecordDecl *record_decl, uint64_t &bit_size,
487 uint64_t &alignment,
488 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
489 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
490 &base_offsets,
491 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
492 &vbase_offsets) {
493 RecordDeclToLayoutMap::iterator pos =
494 m_record_decl_to_layout_map.find(record_decl);
495 bool success = false;
496 base_offsets.clear();
497 vbase_offsets.clear();
498 if (pos != m_record_decl_to_layout_map.end()) {
499 bit_size = pos->second.bit_size;
500 alignment = pos->second.alignment;
501 field_offsets.swap(pos->second.field_offsets);
502 base_offsets.swap(pos->second.base_offsets);
503 vbase_offsets.swap(pos->second.vbase_offsets);
504 m_record_decl_to_layout_map.erase(pos);
505 success = true;
506 } else {
507 bit_size = 0;
508 alignment = 0;
509 field_offsets.clear();
510 }
511 return success;
512}
513
514void ClangASTImporter::InsertRecordDecl(clang::RecordDecl *decl,
515 const LayoutInfo &layout) {
516 m_record_decl_to_layout_map.insert(std::make_pair(decl, layout));
517}
518
519void ClangASTImporter::CompleteDecl(clang::Decl *decl) {
520 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
521
522 if (log)
523 log->Printf(" [ClangASTImporter] CompleteDecl called on (%sDecl*)%p",
524 decl->getDeclKindName(), static_cast<void *>(decl));
525
526 if (ObjCInterfaceDecl *interface_decl = dyn_cast<ObjCInterfaceDecl>(decl)) {
527 if (!interface_decl->getDefinition()) {
528 interface_decl->startDefinition();
529 CompleteObjCInterfaceDecl(interface_decl);
530 }
531 } else if (ObjCProtocolDecl *protocol_decl =
532 dyn_cast<ObjCProtocolDecl>(decl)) {
533 if (!protocol_decl->getDefinition())
534 protocol_decl->startDefinition();
535 } else if (TagDecl *tag_decl = dyn_cast<TagDecl>(decl)) {
536 if (!tag_decl->getDefinition() && !tag_decl->isBeingDefined()) {
537 tag_decl->startDefinition();
538 CompleteTagDecl(tag_decl);
539 tag_decl->setCompleteDefinition(true);
540 }
541 } else {
542 assert(0 && "CompleteDecl called on a Decl that can't be completed");
543 }
544}
545
546bool ClangASTImporter::CompleteTagDecl(clang::TagDecl *decl) {
547 ClangASTMetrics::RegisterDeclCompletion();
548
549 DeclOrigin decl_origin = GetDeclOrigin(decl);
550
551 if (!decl_origin.Valid())
552 return false;
553
554 if (!ClangASTContext::GetCompleteDecl(decl_origin.ctx, decl_origin.decl))
555 return false;
556
557 MinionSP minion_sp(GetMinion(&decl->getASTContext(), decl_origin.ctx));
558
559 if (minion_sp)
560 minion_sp->ImportDefinitionTo(decl, decl_origin.decl);
561
562 return true;
563}
564
565bool ClangASTImporter::CompleteTagDeclWithOrigin(clang::TagDecl *decl,
566 clang::TagDecl *origin_decl) {
567 ClangASTMetrics::RegisterDeclCompletion();
568
569 clang::ASTContext *origin_ast_ctx = &origin_decl->getASTContext();
570
571 if (!ClangASTContext::GetCompleteDecl(origin_ast_ctx, origin_decl))
572 return false;
573
574 MinionSP minion_sp(GetMinion(&decl->getASTContext(), origin_ast_ctx));
575
576 if (minion_sp)
577 minion_sp->ImportDefinitionTo(decl, origin_decl);
578
579 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
580
581 OriginMap &origins = context_md->m_origins;
582
583 origins[decl] = DeclOrigin(origin_ast_ctx, origin_decl);
584
585 return true;
586}
587
588bool ClangASTImporter::CompleteObjCInterfaceDecl(
589 clang::ObjCInterfaceDecl *interface_decl) {
590 ClangASTMetrics::RegisterDeclCompletion();
591
592 DeclOrigin decl_origin = GetDeclOrigin(interface_decl);
593
594 if (!decl_origin.Valid())
595 return false;
596
597 if (!ClangASTContext::GetCompleteDecl(decl_origin.ctx, decl_origin.decl))
598 return false;
599
600 MinionSP minion_sp(
601 GetMinion(&interface_decl->getASTContext(), decl_origin.ctx));
602
603 if (minion_sp)
604 minion_sp->ImportDefinitionTo(interface_decl, decl_origin.decl);
605
606 if (ObjCInterfaceDecl *super_class = interface_decl->getSuperClass())
607 RequireCompleteType(clang::QualType(super_class->getTypeForDecl(), 0));
608
609 return true;
610}
611
612bool ClangASTImporter::CompleteAndFetchChildren(clang::QualType type) {
613 if (!RequireCompleteType(type))
614 return false;
615
616 if (const TagType *tag_type = type->getAs<TagType>()) {
617 TagDecl *tag_decl = tag_type->getDecl();
618
619 DeclOrigin decl_origin = GetDeclOrigin(tag_decl);
620
621 if (!decl_origin.Valid())
622 return false;
623
624 MinionSP minion_sp(GetMinion(&tag_decl->getASTContext(), decl_origin.ctx));
625
626 TagDecl *origin_tag_decl = llvm::dyn_cast<TagDecl>(decl_origin.decl);
627
628 for (Decl *origin_child_decl : origin_tag_decl->decls()) {
629 minion_sp->Import(origin_child_decl);
630 }
631
632 if (RecordDecl *record_decl = dyn_cast<RecordDecl>(origin_tag_decl)) {
633 record_decl->setHasLoadedFieldsFromExternalStorage(true);
634 }
635
636 return true;
637 }
638
639 if (const ObjCObjectType *objc_object_type = type->getAs<ObjCObjectType>()) {
640 if (ObjCInterfaceDecl *objc_interface_decl =
641 objc_object_type->getInterface()) {
642 DeclOrigin decl_origin = GetDeclOrigin(objc_interface_decl);
643
644 if (!decl_origin.Valid())
Sean Callanan6b200d02013-03-21 22:15:41 +0000645 return false;
Stephane Sezer9901e9c2015-04-08 21:52:45 +0000646
Kate Stoneb9c1b512016-09-06 20:57:50 +0000647 MinionSP minion_sp(
648 GetMinion(&objc_interface_decl->getASTContext(), decl_origin.ctx));
Stephane Sezer9901e9c2015-04-08 21:52:45 +0000649
Kate Stoneb9c1b512016-09-06 20:57:50 +0000650 ObjCInterfaceDecl *origin_interface_decl =
651 llvm::dyn_cast<ObjCInterfaceDecl>(decl_origin.decl);
652
653 for (Decl *origin_child_decl : origin_interface_decl->decls()) {
654 minion_sp->Import(origin_child_decl);
655 }
656
657 return true;
658 } else {
659 return false;
Sean Callanan6b200d02013-03-21 22:15:41 +0000660 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000661 }
662
663 return true;
Sean Callanan6b200d02013-03-21 22:15:41 +0000664}
665
Kate Stoneb9c1b512016-09-06 20:57:50 +0000666bool ClangASTImporter::RequireCompleteType(clang::QualType type) {
667 if (type.isNull())
668 return false;
669
670 if (const TagType *tag_type = type->getAs<TagType>()) {
671 TagDecl *tag_decl = tag_type->getDecl();
672
673 if (tag_decl->getDefinition() || tag_decl->isBeingDefined())
674 return true;
675
676 return CompleteTagDecl(tag_decl);
677 }
678 if (const ObjCObjectType *objc_object_type = type->getAs<ObjCObjectType>()) {
679 if (ObjCInterfaceDecl *objc_interface_decl =
680 objc_object_type->getInterface())
681 return CompleteObjCInterfaceDecl(objc_interface_decl);
Sean Callanan60217122012-04-13 00:10:03 +0000682 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000683 return false;
684 }
685 if (const ArrayType *array_type = type->getAsArrayTypeUnsafe()) {
686 return RequireCompleteType(array_type->getElementType());
687 }
688 if (const AtomicType *atomic_type = type->getAs<AtomicType>()) {
689 return RequireCompleteType(atomic_type->getPointeeType());
690 }
691
692 return true;
693}
694
695ClangASTMetadata *ClangASTImporter::GetDeclMetadata(const clang::Decl *decl) {
696 DeclOrigin decl_origin = GetDeclOrigin(decl);
697
698 if (decl_origin.Valid())
699 return ClangASTContext::GetMetadata(decl_origin.ctx, decl_origin.decl);
700 else
701 return ClangASTContext::GetMetadata(&decl->getASTContext(), decl);
Sean Callanan60217122012-04-13 00:10:03 +0000702}
703
Sean Callananf487bd82011-11-16 21:40:57 +0000704ClangASTImporter::DeclOrigin
Kate Stoneb9c1b512016-09-06 20:57:50 +0000705ClangASTImporter::GetDeclOrigin(const clang::Decl *decl) {
706 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
707
708 OriginMap &origins = context_md->m_origins;
709
710 OriginMap::iterator iter = origins.find(decl);
711
712 if (iter != origins.end())
713 return iter->second;
714 else
715 return DeclOrigin();
Sean Callananf487bd82011-11-16 21:40:57 +0000716}
717
Kate Stoneb9c1b512016-09-06 20:57:50 +0000718void ClangASTImporter::SetDeclOrigin(const clang::Decl *decl,
719 clang::Decl *original_decl) {
720 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
721
722 OriginMap &origins = context_md->m_origins;
723
724 OriginMap::iterator iter = origins.find(decl);
725
726 if (iter != origins.end()) {
727 iter->second.decl = original_decl;
728 iter->second.ctx = &original_decl->getASTContext();
729 } else {
730 origins[decl] = DeclOrigin(&original_decl->getASTContext(), original_decl);
731 }
Sean Callanan2cb5e522012-09-20 23:21:16 +0000732}
733
Kate Stoneb9c1b512016-09-06 20:57:50 +0000734void ClangASTImporter::RegisterNamespaceMap(const clang::NamespaceDecl *decl,
735 NamespaceMapSP &namespace_map) {
736 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
737
738 context_md->m_namespace_maps[decl] = namespace_map;
Sean Callanan503aa522011-10-12 00:12:34 +0000739}
740
Kate Stoneb9c1b512016-09-06 20:57:50 +0000741ClangASTImporter::NamespaceMapSP
742ClangASTImporter::GetNamespaceMap(const clang::NamespaceDecl *decl) {
743 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
Sean Callananf487bd82011-11-16 21:40:57 +0000744
Kate Stoneb9c1b512016-09-06 20:57:50 +0000745 NamespaceMetaMap &namespace_maps = context_md->m_namespace_maps;
746
747 NamespaceMetaMap::iterator iter = namespace_maps.find(decl);
748
749 if (iter != namespace_maps.end())
750 return iter->second;
751 else
752 return NamespaceMapSP();
Sean Callanan503aa522011-10-12 00:12:34 +0000753}
754
Kate Stoneb9c1b512016-09-06 20:57:50 +0000755void ClangASTImporter::BuildNamespaceMap(const clang::NamespaceDecl *decl) {
756 assert(decl);
757 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
Sean Callananf487bd82011-11-16 21:40:57 +0000758
Kate Stoneb9c1b512016-09-06 20:57:50 +0000759 const DeclContext *parent_context = decl->getDeclContext();
760 const NamespaceDecl *parent_namespace =
761 dyn_cast<NamespaceDecl>(parent_context);
762 NamespaceMapSP parent_map;
763
764 if (parent_namespace)
765 parent_map = GetNamespaceMap(parent_namespace);
766
767 NamespaceMapSP new_map;
768
769 new_map.reset(new NamespaceMap);
770
771 if (context_md->m_map_completer) {
772 std::string namespace_string = decl->getDeclName().getAsString();
773
774 context_md->m_map_completer->CompleteNamespaceMap(
775 new_map, ConstString(namespace_string.c_str()), parent_map);
776 }
777
778 context_md->m_namespace_maps[decl] = new_map;
Sean Callananb2269162011-10-21 22:18:07 +0000779}
780
Kate Stoneb9c1b512016-09-06 20:57:50 +0000781void ClangASTImporter::ForgetDestination(clang::ASTContext *dst_ast) {
782 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000783
Kate Stoneb9c1b512016-09-06 20:57:50 +0000784 if (log)
785 log->Printf(" [ClangASTImporter] Forgetting destination (ASTContext*)%p",
786 static_cast<void *>(dst_ast));
Sean Callanancbbe3ac2012-01-13 22:55:55 +0000787
Kate Stoneb9c1b512016-09-06 20:57:50 +0000788 m_metadata_map.erase(dst_ast);
Sean Callanan686b2312011-11-16 18:20:47 +0000789}
790
Kate Stoneb9c1b512016-09-06 20:57:50 +0000791void ClangASTImporter::ForgetSource(clang::ASTContext *dst_ast,
792 clang::ASTContext *src_ast) {
793 ASTContextMetadataSP md = MaybeGetContextMetadata(dst_ast);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000794
Kate Stoneb9c1b512016-09-06 20:57:50 +0000795 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000796
Kate Stoneb9c1b512016-09-06 20:57:50 +0000797 if (log)
798 log->Printf(" [ClangASTImporter] Forgetting source->dest "
799 "(ASTContext*)%p->(ASTContext*)%p",
800 static_cast<void *>(src_ast), static_cast<void *>(dst_ast));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000801
Kate Stoneb9c1b512016-09-06 20:57:50 +0000802 if (!md)
Sean Callananb2269162011-10-21 22:18:07 +0000803 return;
Sean Callananb2269162011-10-21 22:18:07 +0000804
Kate Stoneb9c1b512016-09-06 20:57:50 +0000805 md->m_minions.erase(src_ast);
Sean Callanane55bc8a2013-03-30 02:31:21 +0000806
Kate Stoneb9c1b512016-09-06 20:57:50 +0000807 for (OriginMap::iterator iter = md->m_origins.begin();
808 iter != md->m_origins.end();) {
809 if (iter->second.ctx == src_ast)
810 md->m_origins.erase(iter++);
Sean Callananb0b87a52011-11-16 22:23:28 +0000811 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000812 ++iter;
813 }
Greg Clayton3418c852011-08-10 02:10:13 +0000814}
Sean Callanan931a0de2013-10-09 22:33:34 +0000815
Kate Stoneb9c1b512016-09-06 20:57:50 +0000816ClangASTImporter::MapCompleter::~MapCompleter() { return; }
817
818void ClangASTImporter::Minion::InitDeportWorkQueues(
819 std::set<clang::NamedDecl *> *decls_to_deport,
820 std::set<clang::NamedDecl *> *decls_already_deported) {
821 assert(!m_decls_to_deport);
822 assert(!m_decls_already_deported);
823
824 m_decls_to_deport = decls_to_deport;
825 m_decls_already_deported = decls_already_deported;
826}
827
828void ClangASTImporter::Minion::ExecuteDeportWorkQueues() {
829 assert(m_decls_to_deport);
830 assert(m_decls_already_deported);
831
832 ASTContextMetadataSP to_context_md =
833 m_master.GetContextMetadata(&getToContext());
834
835 while (!m_decls_to_deport->empty()) {
836 NamedDecl *decl = *m_decls_to_deport->begin();
837
838 m_decls_already_deported->insert(decl);
839 m_decls_to_deport->erase(decl);
840
841 DeclOrigin &origin = to_context_md->m_origins[decl];
842 UNUSED_IF_ASSERT_DISABLED(origin);
843
844 assert(origin.ctx ==
845 m_source_ctx); // otherwise we should never have added this
846 // because it doesn't need to be deported
847
848 Decl *original_decl = to_context_md->m_origins[decl].decl;
849
850 ClangASTContext::GetCompleteDecl(m_source_ctx, original_decl);
851
852 if (TagDecl *tag_decl = dyn_cast<TagDecl>(decl)) {
853 if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl)) {
854 if (original_tag_decl->isCompleteDefinition()) {
855 ImportDefinitionTo(tag_decl, original_tag_decl);
856 tag_decl->setCompleteDefinition(true);
857 }
858 }
859
860 tag_decl->setHasExternalLexicalStorage(false);
861 tag_decl->setHasExternalVisibleStorage(false);
862 } else if (ObjCContainerDecl *container_decl =
863 dyn_cast<ObjCContainerDecl>(decl)) {
864 container_decl->setHasExternalLexicalStorage(false);
865 container_decl->setHasExternalVisibleStorage(false);
866 }
867
868 to_context_md->m_origins.erase(decl);
869 }
870
871 m_decls_to_deport = nullptr;
872 m_decls_already_deported = nullptr;
873}
874
875void ClangASTImporter::Minion::ImportDefinitionTo(clang::Decl *to,
876 clang::Decl *from) {
877 ASTImporter::Imported(from, to);
878
879 /*
880 if (to_objc_interface)
881 to_objc_interface->startDefinition();
882
883 CXXRecordDecl *to_cxx_record = dyn_cast<CXXRecordDecl>(to);
884
885 if (to_cxx_record)
886 to_cxx_record->startDefinition();
887 */
888
889 ImportDefinition(from);
890
891 if (clang::TagDecl *to_tag = dyn_cast<clang::TagDecl>(to)) {
892 if (clang::TagDecl *from_tag = dyn_cast<clang::TagDecl>(from)) {
893 to_tag->setCompleteDefinition(from_tag->isCompleteDefinition());
894 }
895 }
896
Adrian Prantl05097242018-04-30 16:49:04 +0000897 // If we're dealing with an Objective-C class, ensure that the inheritance
898 // has been set up correctly. The ASTImporter may not do this correctly if
899 // the class was originally sourced from symbols.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000900
901 if (ObjCInterfaceDecl *to_objc_interface = dyn_cast<ObjCInterfaceDecl>(to)) {
902 do {
903 ObjCInterfaceDecl *to_superclass = to_objc_interface->getSuperClass();
904
905 if (to_superclass)
906 break; // we're not going to override it if it's set
907
908 ObjCInterfaceDecl *from_objc_interface =
909 dyn_cast<ObjCInterfaceDecl>(from);
910
911 if (!from_objc_interface)
912 break;
913
914 ObjCInterfaceDecl *from_superclass = from_objc_interface->getSuperClass();
915
916 if (!from_superclass)
917 break;
918
919 Decl *imported_from_superclass_decl = Import(from_superclass);
920
921 if (!imported_from_superclass_decl)
922 break;
923
924 ObjCInterfaceDecl *imported_from_superclass =
925 dyn_cast<ObjCInterfaceDecl>(imported_from_superclass_decl);
926
927 if (!imported_from_superclass)
928 break;
929
930 if (!to_objc_interface->hasDefinition())
931 to_objc_interface->startDefinition();
932
933 to_objc_interface->setSuperClass(m_source_ctx->getTrivialTypeSourceInfo(
934 m_source_ctx->getObjCInterfaceType(imported_from_superclass)));
935 } while (0);
936 }
937}
938
939clang::Decl *ClangASTImporter::Minion::Imported(clang::Decl *from,
940 clang::Decl *to) {
941 ClangASTMetrics::RegisterClangImport();
942
943 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
944
945 lldb::user_id_t user_id = LLDB_INVALID_UID;
946 ClangASTMetadata *metadata = m_master.GetDeclMetadata(from);
947 if (metadata)
948 user_id = metadata->GetUserID();
949
950 if (log) {
951 if (NamedDecl *from_named_decl = dyn_cast<clang::NamedDecl>(from)) {
952 std::string name_string;
953 llvm::raw_string_ostream name_stream(name_string);
954 from_named_decl->printName(name_stream);
955 name_stream.flush();
956
957 log->Printf(" [ClangASTImporter] Imported (%sDecl*)%p, named %s (from "
958 "(Decl*)%p), metadata 0x%" PRIx64,
959 from->getDeclKindName(), static_cast<void *>(to),
960 name_string.c_str(), static_cast<void *>(from), user_id);
961 } else {
962 log->Printf(" [ClangASTImporter] Imported (%sDecl*)%p (from "
963 "(Decl*)%p), metadata 0x%" PRIx64,
964 from->getDeclKindName(), static_cast<void *>(to),
965 static_cast<void *>(from), user_id);
966 }
967 }
968
969 ASTContextMetadataSP to_context_md =
970 m_master.GetContextMetadata(&to->getASTContext());
971 ASTContextMetadataSP from_context_md =
972 m_master.MaybeGetContextMetadata(m_source_ctx);
973
974 if (from_context_md) {
975 OriginMap &origins = from_context_md->m_origins;
976
977 OriginMap::iterator origin_iter = origins.find(from);
978
979 if (origin_iter != origins.end()) {
980 if (to_context_md->m_origins.find(to) == to_context_md->m_origins.end() ||
981 user_id != LLDB_INVALID_UID) {
982 if (origin_iter->second.ctx != &to->getASTContext())
983 to_context_md->m_origins[to] = origin_iter->second;
984 }
985
986 MinionSP direct_completer =
987 m_master.GetMinion(&to->getASTContext(), origin_iter->second.ctx);
988
989 if (direct_completer.get() != this)
990 direct_completer->ASTImporter::Imported(origin_iter->second.decl, to);
991
992 if (log)
993 log->Printf(" [ClangASTImporter] Propagated origin "
994 "(Decl*)%p/(ASTContext*)%p from (ASTContext*)%p to "
995 "(ASTContext*)%p",
996 static_cast<void *>(origin_iter->second.decl),
997 static_cast<void *>(origin_iter->second.ctx),
998 static_cast<void *>(&from->getASTContext()),
999 static_cast<void *>(&to->getASTContext()));
1000 } else {
1001 if (m_decls_to_deport && m_decls_already_deported) {
1002 if (isa<TagDecl>(to) || isa<ObjCInterfaceDecl>(to)) {
1003 RecordDecl *from_record_decl = dyn_cast<RecordDecl>(from);
1004 if (from_record_decl == nullptr ||
Jonas Devliegherea6682a42018-12-15 00:15:33 +00001005 !from_record_decl->isInjectedClassName()) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001006 NamedDecl *to_named_decl = dyn_cast<NamedDecl>(to);
1007
1008 if (!m_decls_already_deported->count(to_named_decl))
1009 m_decls_to_deport->insert(to_named_decl);
1010 }
1011 }
1012 }
1013
1014 if (to_context_md->m_origins.find(to) == to_context_md->m_origins.end() ||
1015 user_id != LLDB_INVALID_UID) {
1016 to_context_md->m_origins[to] = DeclOrigin(m_source_ctx, from);
1017 }
1018
1019 if (log)
1020 log->Printf(" [ClangASTImporter] Decl has no origin information in "
1021 "(ASTContext*)%p",
1022 static_cast<void *>(&from->getASTContext()));
1023 }
1024
1025 if (clang::NamespaceDecl *to_namespace =
1026 dyn_cast<clang::NamespaceDecl>(to)) {
1027 clang::NamespaceDecl *from_namespace =
1028 dyn_cast<clang::NamespaceDecl>(from);
1029
1030 NamespaceMetaMap &namespace_maps = from_context_md->m_namespace_maps;
1031
1032 NamespaceMetaMap::iterator namespace_map_iter =
1033 namespace_maps.find(from_namespace);
1034
1035 if (namespace_map_iter != namespace_maps.end())
1036 to_context_md->m_namespace_maps[to_namespace] =
1037 namespace_map_iter->second;
1038 }
1039 } else {
1040 to_context_md->m_origins[to] = DeclOrigin(m_source_ctx, from);
1041
1042 if (log)
1043 log->Printf(" [ClangASTImporter] Sourced origin "
1044 "(Decl*)%p/(ASTContext*)%p into (ASTContext*)%p",
1045 static_cast<void *>(from), static_cast<void *>(m_source_ctx),
1046 static_cast<void *>(&to->getASTContext()));
1047 }
1048
1049 if (TagDecl *from_tag_decl = dyn_cast<TagDecl>(from)) {
1050 TagDecl *to_tag_decl = dyn_cast<TagDecl>(to);
1051
1052 to_tag_decl->setHasExternalLexicalStorage();
Gabor Martonb795ed92018-11-26 17:09:50 +00001053 to_tag_decl->getPrimaryContext()->setMustBuildLookupTable();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001054
1055 if (log)
1056 log->Printf(
1057 " [ClangASTImporter] To is a TagDecl - attributes %s%s [%s->%s]",
1058 (to_tag_decl->hasExternalLexicalStorage() ? " Lexical" : ""),
1059 (to_tag_decl->hasExternalVisibleStorage() ? " Visible" : ""),
1060 (from_tag_decl->isCompleteDefinition() ? "complete" : "incomplete"),
1061 (to_tag_decl->isCompleteDefinition() ? "complete" : "incomplete"));
1062 }
1063
1064 if (isa<NamespaceDecl>(from)) {
1065 NamespaceDecl *to_namespace_decl = dyn_cast<NamespaceDecl>(to);
1066
1067 m_master.BuildNamespaceMap(to_namespace_decl);
1068
1069 to_namespace_decl->setHasExternalVisibleStorage();
1070 }
1071
1072 if (isa<ObjCContainerDecl>(from)) {
1073 ObjCContainerDecl *to_container_decl = dyn_cast<ObjCContainerDecl>(to);
1074
1075 to_container_decl->setHasExternalLexicalStorage();
1076 to_container_decl->setHasExternalVisibleStorage();
1077
1078 /*to_interface_decl->setExternallyCompleted();*/
1079
1080 if (log) {
1081 if (ObjCInterfaceDecl *to_interface_decl =
1082 llvm::dyn_cast<ObjCInterfaceDecl>(to_container_decl)) {
1083 log->Printf(
1084 " [ClangASTImporter] To is an ObjCInterfaceDecl - attributes "
1085 "%s%s%s",
1086 (to_interface_decl->hasExternalLexicalStorage() ? " Lexical" : ""),
1087 (to_interface_decl->hasExternalVisibleStorage() ? " Visible" : ""),
1088 (to_interface_decl->hasDefinition() ? " HasDefinition" : ""));
1089 } else {
1090 log->Printf(
1091 " [ClangASTImporter] To is an %sDecl - attributes %s%s",
1092 ((Decl *)to_container_decl)->getDeclKindName(),
1093 (to_container_decl->hasExternalLexicalStorage() ? " Lexical" : ""),
1094 (to_container_decl->hasExternalVisibleStorage() ? " Visible" : ""));
1095 }
1096 }
1097 }
1098
1099 return clang::ASTImporter::Imported(from, to);
1100}
1101
1102clang::Decl *ClangASTImporter::Minion::GetOriginalDecl(clang::Decl *To) {
1103 ASTContextMetadataSP to_context_md =
1104 m_master.GetContextMetadata(&To->getASTContext());
1105
1106 if (!to_context_md)
1107 return nullptr;
1108
1109 OriginMap::iterator iter = to_context_md->m_origins.find(To);
1110
1111 if (iter == to_context_md->m_origins.end())
1112 return nullptr;
1113
1114 return const_cast<clang::Decl *>(iter->second.decl);
Sean Callanan931a0de2013-10-09 22:33:34 +00001115}