1 //===-- ClangASTImporter.cpp ------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "lldb/Symbol/ClangASTImporter.h"
10 #include "lldb/Core/Module.h"
11 #include "lldb/Symbol/ClangASTContext.h"
12 #include "lldb/Symbol/ClangASTMetadata.h"
13 #include "lldb/Symbol/ClangUtil.h"
14 #include "lldb/Utility/LLDBAssert.h"
15 #include "lldb/Utility/Log.h"
16 #include "clang/AST/Decl.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/DeclObjC.h"
19 #include "clang/Sema/Lookup.h"
20 #include "clang/Sema/Sema.h"
21 #include "llvm/Support/raw_ostream.h"
22
23 #include <memory>
24
25 using namespace lldb_private;
26 using namespace clang;
27
CopyType(ClangASTContext & dst_ast,const CompilerType & src_type)28 CompilerType ClangASTImporter::CopyType(ClangASTContext &dst_ast,
29 const CompilerType &src_type) {
30 clang::ASTContext &dst_clang_ast = dst_ast.getASTContext();
31
32 ClangASTContext *src_ast =
33 llvm::dyn_cast_or_null<ClangASTContext>(src_type.GetTypeSystem());
34 if (!src_ast)
35 return CompilerType();
36
37 clang::ASTContext &src_clang_ast = src_ast->getASTContext();
38
39 clang::QualType src_qual_type = ClangUtil::GetQualType(src_type);
40
41 ImporterDelegateSP delegate_sp(GetDelegate(&dst_clang_ast, &src_clang_ast));
42 if (!delegate_sp)
43 return CompilerType();
44
45 ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, &dst_clang_ast);
46
47 llvm::Expected<QualType> ret_or_error = delegate_sp->Import(src_qual_type);
48 if (!ret_or_error) {
49 Log *log =
50 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS);
51 LLDB_LOG_ERROR(log, ret_or_error.takeError(),
52 "Couldn't import type: {0}");
53 return CompilerType();
54 }
55
56 lldb::opaque_compiler_type_t dst_clang_type = ret_or_error->getAsOpaquePtr();
57
58 if (dst_clang_type)
59 return CompilerType(&dst_ast, dst_clang_type);
60 return CompilerType();
61 }
62
CopyDecl(clang::ASTContext * dst_ast,clang::Decl * decl)63 clang::Decl *ClangASTImporter::CopyDecl(clang::ASTContext *dst_ast,
64 clang::Decl *decl) {
65 ImporterDelegateSP delegate_sp;
66
67 clang::ASTContext *src_ast = &decl->getASTContext();
68 delegate_sp = GetDelegate(dst_ast, src_ast);
69
70 ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, dst_ast);
71
72 if (!delegate_sp)
73 return nullptr;
74
75 llvm::Expected<clang::Decl *> result = delegate_sp->Import(decl);
76 if (!result) {
77 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
78 LLDB_LOG_ERROR(log, result.takeError(), "Couldn't import decl: {0}");
79 if (log) {
80 lldb::user_id_t user_id = LLDB_INVALID_UID;
81 ClangASTMetadata *metadata = GetDeclMetadata(decl);
82 if (metadata)
83 user_id = metadata->GetUserID();
84
85 if (NamedDecl *named_decl = dyn_cast<NamedDecl>(decl))
86 LLDB_LOGF(log,
87 " [ClangASTImporter] WARNING: Failed to import a %s "
88 "'%s', metadata 0x%" PRIx64,
89 decl->getDeclKindName(),
90 named_decl->getNameAsString().c_str(), user_id);
91 else
92 LLDB_LOGF(log,
93 " [ClangASTImporter] WARNING: Failed to import a %s, "
94 "metadata 0x%" PRIx64,
95 decl->getDeclKindName(), user_id);
96 }
97 return nullptr;
98 }
99
100 return *result;
101 }
102
103 class DeclContextOverride {
104 private:
105 struct Backup {
106 clang::DeclContext *decl_context;
107 clang::DeclContext *lexical_decl_context;
108 };
109
110 llvm::DenseMap<clang::Decl *, Backup> m_backups;
111
OverrideOne(clang::Decl * decl)112 void OverrideOne(clang::Decl *decl) {
113 if (m_backups.find(decl) != m_backups.end()) {
114 return;
115 }
116
117 m_backups[decl] = {decl->getDeclContext(), decl->getLexicalDeclContext()};
118
119 decl->setDeclContext(decl->getASTContext().getTranslationUnitDecl());
120 decl->setLexicalDeclContext(decl->getASTContext().getTranslationUnitDecl());
121 }
122
ChainPassesThrough(clang::Decl * decl,clang::DeclContext * base,clang::DeclContext * (clang::Decl::* contextFromDecl)(),clang::DeclContext * (clang::DeclContext::* contextFromContext)())123 bool ChainPassesThrough(
124 clang::Decl *decl, clang::DeclContext *base,
125 clang::DeclContext *(clang::Decl::*contextFromDecl)(),
126 clang::DeclContext *(clang::DeclContext::*contextFromContext)()) {
127 for (DeclContext *decl_ctx = (decl->*contextFromDecl)(); decl_ctx;
128 decl_ctx = (decl_ctx->*contextFromContext)()) {
129 if (decl_ctx == base) {
130 return true;
131 }
132 }
133
134 return false;
135 }
136
GetEscapedChild(clang::Decl * decl,clang::DeclContext * base=nullptr)137 clang::Decl *GetEscapedChild(clang::Decl *decl,
138 clang::DeclContext *base = nullptr) {
139 if (base) {
140 // decl's DeclContext chains must pass through base.
141
142 if (!ChainPassesThrough(decl, base, &clang::Decl::getDeclContext,
143 &clang::DeclContext::getParent) ||
144 !ChainPassesThrough(decl, base, &clang::Decl::getLexicalDeclContext,
145 &clang::DeclContext::getLexicalParent)) {
146 return decl;
147 }
148 } else {
149 base = clang::dyn_cast<clang::DeclContext>(decl);
150
151 if (!base) {
152 return nullptr;
153 }
154 }
155
156 if (clang::DeclContext *context =
157 clang::dyn_cast<clang::DeclContext>(decl)) {
158 for (clang::Decl *decl : context->decls()) {
159 if (clang::Decl *escaped_child = GetEscapedChild(decl)) {
160 return escaped_child;
161 }
162 }
163 }
164
165 return nullptr;
166 }
167
Override(clang::Decl * decl)168 void Override(clang::Decl *decl) {
169 if (clang::Decl *escaped_child = GetEscapedChild(decl)) {
170 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
171
172 LLDB_LOGF(log,
173 " [ClangASTImporter] DeclContextOverride couldn't "
174 "override (%sDecl*)%p - its child (%sDecl*)%p escapes",
175 decl->getDeclKindName(), static_cast<void *>(decl),
176 escaped_child->getDeclKindName(),
177 static_cast<void *>(escaped_child));
178 lldbassert(0 && "Couldn't override!");
179 }
180
181 OverrideOne(decl);
182 }
183
184 public:
DeclContextOverride()185 DeclContextOverride() {}
186
OverrideAllDeclsFromContainingFunction(clang::Decl * decl)187 void OverrideAllDeclsFromContainingFunction(clang::Decl *decl) {
188 for (DeclContext *decl_context = decl->getLexicalDeclContext();
189 decl_context; decl_context = decl_context->getLexicalParent()) {
190 DeclContext *redecl_context = decl_context->getRedeclContext();
191
192 if (llvm::isa<FunctionDecl>(redecl_context) &&
193 llvm::isa<TranslationUnitDecl>(redecl_context->getLexicalParent())) {
194 for (clang::Decl *child_decl : decl_context->decls()) {
195 Override(child_decl);
196 }
197 }
198 }
199 }
200
~DeclContextOverride()201 ~DeclContextOverride() {
202 for (const std::pair<clang::Decl *, Backup> &backup : m_backups) {
203 backup.first->setDeclContext(backup.second.decl_context);
204 backup.first->setLexicalDeclContext(backup.second.lexical_decl_context);
205 }
206 }
207 };
208
209 namespace {
210 /// Completes all imported TagDecls at the end of the scope.
211 ///
212 /// While in a CompleteTagDeclsScope, every decl that could be completed will
213 /// be completed at the end of the scope (including all Decls that are
214 /// imported while completing the original Decls).
215 class CompleteTagDeclsScope : public ClangASTImporter::NewDeclListener {
216 ClangASTImporter::ImporterDelegateSP m_delegate;
217 llvm::SmallVector<NamedDecl *, 32> m_decls_to_complete;
218 llvm::SmallPtrSet<NamedDecl *, 32> m_decls_already_completed;
219 clang::ASTContext *m_dst_ctx;
220 clang::ASTContext *m_src_ctx;
221 ClangASTImporter &importer;
222
223 public:
224 /// Constructs a CompleteTagDeclsScope.
225 /// \param importer The ClangASTImporter that we should observe.
226 /// \param dst_ctx The ASTContext to which Decls are imported.
227 /// \param src_ctx The ASTContext from which Decls are imported.
CompleteTagDeclsScope(ClangASTImporter & importer,clang::ASTContext * dst_ctx,clang::ASTContext * src_ctx)228 explicit CompleteTagDeclsScope(ClangASTImporter &importer,
229 clang::ASTContext *dst_ctx,
230 clang::ASTContext *src_ctx)
231 : m_delegate(importer.GetDelegate(dst_ctx, src_ctx)), m_dst_ctx(dst_ctx),
232 m_src_ctx(src_ctx), importer(importer) {
233 m_delegate->SetImportListener(this);
234 }
235
~CompleteTagDeclsScope()236 virtual ~CompleteTagDeclsScope() {
237 ClangASTImporter::ASTContextMetadataSP to_context_md =
238 importer.GetContextMetadata(m_dst_ctx);
239
240 // Complete all decls we collected until now.
241 while (!m_decls_to_complete.empty()) {
242 NamedDecl *decl = m_decls_to_complete.pop_back_val();
243 m_decls_already_completed.insert(decl);
244
245 // We should only complete decls coming from the source context.
246 assert(to_context_md->m_origins[decl].ctx == m_src_ctx);
247
248 Decl *original_decl = to_context_md->m_origins[decl].decl;
249
250 // Complete the decl now.
251 ClangASTContext::GetCompleteDecl(m_src_ctx, original_decl);
252 if (auto *tag_decl = dyn_cast<TagDecl>(decl)) {
253 if (auto *original_tag_decl = dyn_cast<TagDecl>(original_decl)) {
254 if (original_tag_decl->isCompleteDefinition()) {
255 m_delegate->ImportDefinitionTo(tag_decl, original_tag_decl);
256 tag_decl->setCompleteDefinition(true);
257 }
258 }
259
260 tag_decl->setHasExternalLexicalStorage(false);
261 tag_decl->setHasExternalVisibleStorage(false);
262 } else if (auto *container_decl = dyn_cast<ObjCContainerDecl>(decl)) {
263 container_decl->setHasExternalLexicalStorage(false);
264 container_decl->setHasExternalVisibleStorage(false);
265 }
266
267 to_context_md->m_origins.erase(decl);
268 }
269
270 // Stop listening to imported decls. We do this after clearing the
271 // Decls we needed to import to catch all Decls they might have pulled in.
272 m_delegate->RemoveImportListener();
273 }
274
NewDeclImported(clang::Decl * from,clang::Decl * to)275 void NewDeclImported(clang::Decl *from, clang::Decl *to) override {
276 // Filter out decls that we can't complete later.
277 if (!isa<TagDecl>(to) && !isa<ObjCInterfaceDecl>(to))
278 return;
279 RecordDecl *from_record_decl = dyn_cast<RecordDecl>(from);
280 // We don't need to complete injected class name decls.
281 if (from_record_decl && from_record_decl->isInjectedClassName())
282 return;
283
284 NamedDecl *to_named_decl = dyn_cast<NamedDecl>(to);
285 // Check if we already completed this type.
286 if (m_decls_already_completed.count(to_named_decl) != 0)
287 return;
288 m_decls_to_complete.push_back(to_named_decl);
289 }
290 };
291 } // namespace
292
DeportType(ClangASTContext & dst,const CompilerType & src_type)293 CompilerType ClangASTImporter::DeportType(ClangASTContext &dst,
294 const CompilerType &src_type) {
295 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
296
297 ClangASTContext *src_ctxt =
298 llvm::cast<ClangASTContext>(src_type.GetTypeSystem());
299
300 LLDB_LOG(log,
301 " [ClangASTImporter] DeportType called on ({0}Type*){1:x} "
302 "from (ASTContext*){2:x} to (ASTContext*){3:x}",
303 src_type.GetTypeName(), src_type.GetOpaqueQualType(),
304 &src_ctxt->getASTContext(), &dst.getASTContext());
305
306 DeclContextOverride decl_context_override;
307
308 if (auto *t = ClangUtil::GetQualType(src_type)->getAs<TagType>())
309 decl_context_override.OverrideAllDeclsFromContainingFunction(t->getDecl());
310
311 CompleteTagDeclsScope complete_scope(*this, &dst.getASTContext(),
312 &src_ctxt->getASTContext());
313 return CopyType(dst, src_type);
314 }
315
DeportDecl(clang::ASTContext * dst_ctx,clang::Decl * decl)316 clang::Decl *ClangASTImporter::DeportDecl(clang::ASTContext *dst_ctx,
317 clang::Decl *decl) {
318 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
319
320 clang::ASTContext *src_ctx = &decl->getASTContext();
321 LLDB_LOGF(log,
322 " [ClangASTImporter] DeportDecl called on (%sDecl*)%p from "
323 "(ASTContext*)%p to (ASTContext*)%p",
324 decl->getDeclKindName(), static_cast<void *>(decl),
325 static_cast<void *>(src_ctx), static_cast<void *>(dst_ctx));
326
327 DeclContextOverride decl_context_override;
328
329 decl_context_override.OverrideAllDeclsFromContainingFunction(decl);
330
331 clang::Decl *result;
332 {
333 CompleteTagDeclsScope complete_scope(*this, dst_ctx, src_ctx);
334 result = CopyDecl(dst_ctx, decl);
335 }
336
337 if (!result)
338 return nullptr;
339
340 LLDB_LOGF(
341 log,
342 " [ClangASTImporter] DeportDecl deported (%sDecl*)%p to (%sDecl*)%p",
343 decl->getDeclKindName(), static_cast<void *>(decl),
344 result->getDeclKindName(), static_cast<void *>(result));
345
346 return result;
347 }
348
CanImport(const CompilerType & type)349 bool ClangASTImporter::CanImport(const CompilerType &type) {
350 if (!ClangUtil::IsClangType(type))
351 return false;
352
353 // TODO: remove external completion BOOL
354 // CompleteAndFetchChildren should get the Decl out and check for the
355
356 clang::QualType qual_type(
357 ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type)));
358
359 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
360 switch (type_class) {
361 case clang::Type::Record: {
362 const clang::CXXRecordDecl *cxx_record_decl =
363 qual_type->getAsCXXRecordDecl();
364 if (cxx_record_decl) {
365 if (GetDeclOrigin(cxx_record_decl).Valid())
366 return true;
367 }
368 } break;
369
370 case clang::Type::Enum: {
371 clang::EnumDecl *enum_decl =
372 llvm::cast<clang::EnumType>(qual_type)->getDecl();
373 if (enum_decl) {
374 if (GetDeclOrigin(enum_decl).Valid())
375 return true;
376 }
377 } break;
378
379 case clang::Type::ObjCObject:
380 case clang::Type::ObjCInterface: {
381 const clang::ObjCObjectType *objc_class_type =
382 llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
383 if (objc_class_type) {
384 clang::ObjCInterfaceDecl *class_interface_decl =
385 objc_class_type->getInterface();
386 // We currently can't complete objective C types through the newly added
387 // ASTContext because it only supports TagDecl objects right now...
388 if (class_interface_decl) {
389 if (GetDeclOrigin(class_interface_decl).Valid())
390 return true;
391 }
392 }
393 } break;
394
395 case clang::Type::Typedef:
396 return CanImport(CompilerType(type.GetTypeSystem(),
397 llvm::cast<clang::TypedefType>(qual_type)
398 ->getDecl()
399 ->getUnderlyingType()
400 .getAsOpaquePtr()));
401
402 case clang::Type::Auto:
403 return CanImport(CompilerType(type.GetTypeSystem(),
404 llvm::cast<clang::AutoType>(qual_type)
405 ->getDeducedType()
406 .getAsOpaquePtr()));
407
408 case clang::Type::Elaborated:
409 return CanImport(CompilerType(type.GetTypeSystem(),
410 llvm::cast<clang::ElaboratedType>(qual_type)
411 ->getNamedType()
412 .getAsOpaquePtr()));
413
414 case clang::Type::Paren:
415 return CanImport(CompilerType(
416 type.GetTypeSystem(),
417 llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
418
419 default:
420 break;
421 }
422
423 return false;
424 }
425
Import(const CompilerType & type)426 bool ClangASTImporter::Import(const CompilerType &type) {
427 if (!ClangUtil::IsClangType(type))
428 return false;
429 // TODO: remove external completion BOOL
430 // CompleteAndFetchChildren should get the Decl out and check for the
431
432 clang::QualType qual_type(
433 ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type)));
434
435 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
436 switch (type_class) {
437 case clang::Type::Record: {
438 const clang::CXXRecordDecl *cxx_record_decl =
439 qual_type->getAsCXXRecordDecl();
440 if (cxx_record_decl) {
441 if (GetDeclOrigin(cxx_record_decl).Valid())
442 return CompleteAndFetchChildren(qual_type);
443 }
444 } break;
445
446 case clang::Type::Enum: {
447 clang::EnumDecl *enum_decl =
448 llvm::cast<clang::EnumType>(qual_type)->getDecl();
449 if (enum_decl) {
450 if (GetDeclOrigin(enum_decl).Valid())
451 return CompleteAndFetchChildren(qual_type);
452 }
453 } break;
454
455 case clang::Type::ObjCObject:
456 case clang::Type::ObjCInterface: {
457 const clang::ObjCObjectType *objc_class_type =
458 llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
459 if (objc_class_type) {
460 clang::ObjCInterfaceDecl *class_interface_decl =
461 objc_class_type->getInterface();
462 // We currently can't complete objective C types through the newly added
463 // ASTContext because it only supports TagDecl objects right now...
464 if (class_interface_decl) {
465 if (GetDeclOrigin(class_interface_decl).Valid())
466 return CompleteAndFetchChildren(qual_type);
467 }
468 }
469 } break;
470
471 case clang::Type::Typedef:
472 return Import(CompilerType(type.GetTypeSystem(),
473 llvm::cast<clang::TypedefType>(qual_type)
474 ->getDecl()
475 ->getUnderlyingType()
476 .getAsOpaquePtr()));
477
478 case clang::Type::Auto:
479 return Import(CompilerType(type.GetTypeSystem(),
480 llvm::cast<clang::AutoType>(qual_type)
481 ->getDeducedType()
482 .getAsOpaquePtr()));
483
484 case clang::Type::Elaborated:
485 return Import(CompilerType(type.GetTypeSystem(),
486 llvm::cast<clang::ElaboratedType>(qual_type)
487 ->getNamedType()
488 .getAsOpaquePtr()));
489
490 case clang::Type::Paren:
491 return Import(CompilerType(
492 type.GetTypeSystem(),
493 llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
494
495 default:
496 break;
497 }
498 return false;
499 }
500
CompleteType(const CompilerType & compiler_type)501 bool ClangASTImporter::CompleteType(const CompilerType &compiler_type) {
502 if (!CanImport(compiler_type))
503 return false;
504
505 if (Import(compiler_type)) {
506 ClangASTContext::CompleteTagDeclarationDefinition(compiler_type);
507 return true;
508 }
509
510 ClangASTContext::SetHasExternalStorage(compiler_type.GetOpaqueQualType(),
511 false);
512 return false;
513 }
514
LayoutRecordType(const clang::RecordDecl * record_decl,uint64_t & bit_size,uint64_t & alignment,llvm::DenseMap<const clang::FieldDecl *,uint64_t> & field_offsets,llvm::DenseMap<const clang::CXXRecordDecl *,clang::CharUnits> & base_offsets,llvm::DenseMap<const clang::CXXRecordDecl *,clang::CharUnits> & vbase_offsets)515 bool ClangASTImporter::LayoutRecordType(
516 const clang::RecordDecl *record_decl, uint64_t &bit_size,
517 uint64_t &alignment,
518 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
519 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
520 &base_offsets,
521 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
522 &vbase_offsets) {
523 RecordDeclToLayoutMap::iterator pos =
524 m_record_decl_to_layout_map.find(record_decl);
525 bool success = false;
526 base_offsets.clear();
527 vbase_offsets.clear();
528 if (pos != m_record_decl_to_layout_map.end()) {
529 bit_size = pos->second.bit_size;
530 alignment = pos->second.alignment;
531 field_offsets.swap(pos->second.field_offsets);
532 base_offsets.swap(pos->second.base_offsets);
533 vbase_offsets.swap(pos->second.vbase_offsets);
534 m_record_decl_to_layout_map.erase(pos);
535 success = true;
536 } else {
537 bit_size = 0;
538 alignment = 0;
539 field_offsets.clear();
540 }
541 return success;
542 }
543
SetRecordLayout(clang::RecordDecl * decl,const LayoutInfo & layout)544 void ClangASTImporter::SetRecordLayout(clang::RecordDecl *decl,
545 const LayoutInfo &layout) {
546 m_record_decl_to_layout_map.insert(std::make_pair(decl, layout));
547 }
548
CompleteDecl(clang::Decl * decl)549 void ClangASTImporter::CompleteDecl(clang::Decl *decl) {
550 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
551
552 LLDB_LOGF(log, " [ClangASTImporter] CompleteDecl called on (%sDecl*)%p",
553 decl->getDeclKindName(), static_cast<void *>(decl));
554
555 if (ObjCInterfaceDecl *interface_decl = dyn_cast<ObjCInterfaceDecl>(decl)) {
556 if (!interface_decl->getDefinition()) {
557 interface_decl->startDefinition();
558 CompleteObjCInterfaceDecl(interface_decl);
559 }
560 } else if (ObjCProtocolDecl *protocol_decl =
561 dyn_cast<ObjCProtocolDecl>(decl)) {
562 if (!protocol_decl->getDefinition())
563 protocol_decl->startDefinition();
564 } else if (TagDecl *tag_decl = dyn_cast<TagDecl>(decl)) {
565 if (!tag_decl->getDefinition() && !tag_decl->isBeingDefined()) {
566 tag_decl->startDefinition();
567 CompleteTagDecl(tag_decl);
568 tag_decl->setCompleteDefinition(true);
569 }
570 } else {
571 assert(0 && "CompleteDecl called on a Decl that can't be completed");
572 }
573 }
574
CompleteTagDecl(clang::TagDecl * decl)575 bool ClangASTImporter::CompleteTagDecl(clang::TagDecl *decl) {
576 DeclOrigin decl_origin = GetDeclOrigin(decl);
577
578 if (!decl_origin.Valid())
579 return false;
580
581 if (!ClangASTContext::GetCompleteDecl(decl_origin.ctx, decl_origin.decl))
582 return false;
583
584 ImporterDelegateSP delegate_sp(
585 GetDelegate(&decl->getASTContext(), decl_origin.ctx));
586
587 ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp,
588 &decl->getASTContext());
589 if (delegate_sp)
590 delegate_sp->ImportDefinitionTo(decl, decl_origin.decl);
591
592 return true;
593 }
594
CompleteTagDeclWithOrigin(clang::TagDecl * decl,clang::TagDecl * origin_decl)595 bool ClangASTImporter::CompleteTagDeclWithOrigin(clang::TagDecl *decl,
596 clang::TagDecl *origin_decl) {
597 clang::ASTContext *origin_ast_ctx = &origin_decl->getASTContext();
598
599 if (!ClangASTContext::GetCompleteDecl(origin_ast_ctx, origin_decl))
600 return false;
601
602 ImporterDelegateSP delegate_sp(
603 GetDelegate(&decl->getASTContext(), origin_ast_ctx));
604
605 if (delegate_sp)
606 delegate_sp->ImportDefinitionTo(decl, origin_decl);
607
608 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
609
610 OriginMap &origins = context_md->m_origins;
611
612 origins[decl] = DeclOrigin(origin_ast_ctx, origin_decl);
613
614 return true;
615 }
616
CompleteObjCInterfaceDecl(clang::ObjCInterfaceDecl * interface_decl)617 bool ClangASTImporter::CompleteObjCInterfaceDecl(
618 clang::ObjCInterfaceDecl *interface_decl) {
619 DeclOrigin decl_origin = GetDeclOrigin(interface_decl);
620
621 if (!decl_origin.Valid())
622 return false;
623
624 if (!ClangASTContext::GetCompleteDecl(decl_origin.ctx, decl_origin.decl))
625 return false;
626
627 ImporterDelegateSP delegate_sp(
628 GetDelegate(&interface_decl->getASTContext(), decl_origin.ctx));
629
630 if (delegate_sp)
631 delegate_sp->ImportDefinitionTo(interface_decl, decl_origin.decl);
632
633 if (ObjCInterfaceDecl *super_class = interface_decl->getSuperClass())
634 RequireCompleteType(clang::QualType(super_class->getTypeForDecl(), 0));
635
636 return true;
637 }
638
CompleteAndFetchChildren(clang::QualType type)639 bool ClangASTImporter::CompleteAndFetchChildren(clang::QualType type) {
640 if (!RequireCompleteType(type))
641 return false;
642
643 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS);
644
645 if (const TagType *tag_type = type->getAs<TagType>()) {
646 TagDecl *tag_decl = tag_type->getDecl();
647
648 DeclOrigin decl_origin = GetDeclOrigin(tag_decl);
649
650 if (!decl_origin.Valid())
651 return false;
652
653 ImporterDelegateSP delegate_sp(
654 GetDelegate(&tag_decl->getASTContext(), decl_origin.ctx));
655
656 ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp,
657 &tag_decl->getASTContext());
658
659 TagDecl *origin_tag_decl = llvm::dyn_cast<TagDecl>(decl_origin.decl);
660
661 for (Decl *origin_child_decl : origin_tag_decl->decls()) {
662 llvm::Expected<Decl *> imported_or_err =
663 delegate_sp->Import(origin_child_decl);
664 if (!imported_or_err) {
665 LLDB_LOG_ERROR(log, imported_or_err.takeError(),
666 "Couldn't import decl: {0}");
667 return false;
668 }
669 }
670
671 if (RecordDecl *record_decl = dyn_cast<RecordDecl>(origin_tag_decl))
672 record_decl->setHasLoadedFieldsFromExternalStorage(true);
673
674 return true;
675 }
676
677 if (const ObjCObjectType *objc_object_type = type->getAs<ObjCObjectType>()) {
678 if (ObjCInterfaceDecl *objc_interface_decl =
679 objc_object_type->getInterface()) {
680 DeclOrigin decl_origin = GetDeclOrigin(objc_interface_decl);
681
682 if (!decl_origin.Valid())
683 return false;
684
685 ImporterDelegateSP delegate_sp(
686 GetDelegate(&objc_interface_decl->getASTContext(), decl_origin.ctx));
687
688 ObjCInterfaceDecl *origin_interface_decl =
689 llvm::dyn_cast<ObjCInterfaceDecl>(decl_origin.decl);
690
691 for (Decl *origin_child_decl : origin_interface_decl->decls()) {
692 llvm::Expected<Decl *> imported_or_err =
693 delegate_sp->Import(origin_child_decl);
694 if (!imported_or_err) {
695 LLDB_LOG_ERROR(log, imported_or_err.takeError(),
696 "Couldn't import decl: {0}");
697 return false;
698 }
699 }
700
701 return true;
702 }
703 return false;
704 }
705
706 return true;
707 }
708
RequireCompleteType(clang::QualType type)709 bool ClangASTImporter::RequireCompleteType(clang::QualType type) {
710 if (type.isNull())
711 return false;
712
713 if (const TagType *tag_type = type->getAs<TagType>()) {
714 TagDecl *tag_decl = tag_type->getDecl();
715
716 if (tag_decl->getDefinition() || tag_decl->isBeingDefined())
717 return true;
718
719 return CompleteTagDecl(tag_decl);
720 }
721 if (const ObjCObjectType *objc_object_type = type->getAs<ObjCObjectType>()) {
722 if (ObjCInterfaceDecl *objc_interface_decl =
723 objc_object_type->getInterface())
724 return CompleteObjCInterfaceDecl(objc_interface_decl);
725 return false;
726 }
727 if (const ArrayType *array_type = type->getAsArrayTypeUnsafe())
728 return RequireCompleteType(array_type->getElementType());
729 if (const AtomicType *atomic_type = type->getAs<AtomicType>())
730 return RequireCompleteType(atomic_type->getPointeeType());
731
732 return true;
733 }
734
GetDeclMetadata(const clang::Decl * decl)735 ClangASTMetadata *ClangASTImporter::GetDeclMetadata(const clang::Decl *decl) {
736 DeclOrigin decl_origin = GetDeclOrigin(decl);
737
738 if (decl_origin.Valid()) {
739 ClangASTContext *ast = ClangASTContext::GetASTContext(decl_origin.ctx);
740 return ast->GetMetadata(decl_origin.decl);
741 }
742 ClangASTContext *ast = ClangASTContext::GetASTContext(&decl->getASTContext());
743 return ast->GetMetadata(decl);
744 }
745
746 ClangASTImporter::DeclOrigin
GetDeclOrigin(const clang::Decl * decl)747 ClangASTImporter::GetDeclOrigin(const clang::Decl *decl) {
748 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
749
750 OriginMap &origins = context_md->m_origins;
751
752 OriginMap::iterator iter = origins.find(decl);
753
754 if (iter != origins.end())
755 return iter->second;
756 return DeclOrigin();
757 }
758
SetDeclOrigin(const clang::Decl * decl,clang::Decl * original_decl)759 void ClangASTImporter::SetDeclOrigin(const clang::Decl *decl,
760 clang::Decl *original_decl) {
761 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
762
763 OriginMap &origins = context_md->m_origins;
764
765 OriginMap::iterator iter = origins.find(decl);
766
767 if (iter != origins.end()) {
768 iter->second.decl = original_decl;
769 iter->second.ctx = &original_decl->getASTContext();
770 return;
771 }
772 origins[decl] = DeclOrigin(&original_decl->getASTContext(), original_decl);
773 }
774
RegisterNamespaceMap(const clang::NamespaceDecl * decl,NamespaceMapSP & namespace_map)775 void ClangASTImporter::RegisterNamespaceMap(const clang::NamespaceDecl *decl,
776 NamespaceMapSP &namespace_map) {
777 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
778
779 context_md->m_namespace_maps[decl] = namespace_map;
780 }
781
782 ClangASTImporter::NamespaceMapSP
GetNamespaceMap(const clang::NamespaceDecl * decl)783 ClangASTImporter::GetNamespaceMap(const clang::NamespaceDecl *decl) {
784 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
785
786 NamespaceMetaMap &namespace_maps = context_md->m_namespace_maps;
787
788 NamespaceMetaMap::iterator iter = namespace_maps.find(decl);
789
790 if (iter != namespace_maps.end())
791 return iter->second;
792 return NamespaceMapSP();
793 }
794
BuildNamespaceMap(const clang::NamespaceDecl * decl)795 void ClangASTImporter::BuildNamespaceMap(const clang::NamespaceDecl *decl) {
796 assert(decl);
797 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
798
799 const DeclContext *parent_context = decl->getDeclContext();
800 const NamespaceDecl *parent_namespace =
801 dyn_cast<NamespaceDecl>(parent_context);
802 NamespaceMapSP parent_map;
803
804 if (parent_namespace)
805 parent_map = GetNamespaceMap(parent_namespace);
806
807 NamespaceMapSP new_map;
808
809 new_map = std::make_shared<NamespaceMap>();
810
811 if (context_md->m_map_completer) {
812 std::string namespace_string = decl->getDeclName().getAsString();
813
814 context_md->m_map_completer->CompleteNamespaceMap(
815 new_map, ConstString(namespace_string.c_str()), parent_map);
816 }
817
818 context_md->m_namespace_maps[decl] = new_map;
819 }
820
ForgetDestination(clang::ASTContext * dst_ast)821 void ClangASTImporter::ForgetDestination(clang::ASTContext *dst_ast) {
822 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
823
824 LLDB_LOGF(log,
825 " [ClangASTImporter] Forgetting destination (ASTContext*)%p",
826 static_cast<void *>(dst_ast));
827
828 m_metadata_map.erase(dst_ast);
829 }
830
ForgetSource(clang::ASTContext * dst_ast,clang::ASTContext * src_ast)831 void ClangASTImporter::ForgetSource(clang::ASTContext *dst_ast,
832 clang::ASTContext *src_ast) {
833 ASTContextMetadataSP md = MaybeGetContextMetadata(dst_ast);
834
835 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
836
837 LLDB_LOGF(log,
838 " [ClangASTImporter] Forgetting source->dest "
839 "(ASTContext*)%p->(ASTContext*)%p",
840 static_cast<void *>(src_ast), static_cast<void *>(dst_ast));
841
842 if (!md)
843 return;
844
845 md->m_delegates.erase(src_ast);
846
847 for (OriginMap::iterator iter = md->m_origins.begin();
848 iter != md->m_origins.end();) {
849 if (iter->second.ctx == src_ast)
850 md->m_origins.erase(iter++);
851 else
852 ++iter;
853 }
854 }
855
~MapCompleter()856 ClangASTImporter::MapCompleter::~MapCompleter() { return; }
857
858 llvm::Expected<Decl *>
ImportImpl(Decl * From)859 ClangASTImporter::ASTImporterDelegate::ImportImpl(Decl *From) {
860 if (m_std_handler) {
861 llvm::Optional<Decl *> D = m_std_handler->Import(From);
862 if (D) {
863 // Make sure we don't use this decl later to map it back to it's original
864 // decl. The decl the CxxModuleHandler created has nothing to do with
865 // the one from debug info, and linking those two would just cause the
866 // ASTImporter to try 'updating' the module decl with the minimal one from
867 // the debug info.
868 m_decls_to_ignore.insert(*D);
869 return *D;
870 }
871 }
872
873 // Check which ASTContext this declaration originally came from.
874 DeclOrigin origin = m_master.GetDeclOrigin(From);
875 // If it originally came from the target ASTContext then we can just
876 // pretend that the original is the one we imported. This can happen for
877 // example when inspecting a persistent declaration from the scratch
878 // ASTContext (which will provide the declaration when parsing the
879 // expression and then we later try to copy the declaration back to the
880 // scratch ASTContext to store the result).
881 // Without this check we would ask the ASTImporter to import a declaration
882 // into the same ASTContext where it came from (which doesn't make a lot of
883 // sense).
884 if (origin.Valid() && origin.ctx == &getToContext()) {
885 RegisterImportedDecl(From, origin.decl);
886 return origin.decl;
887 }
888
889 // This declaration came originally from another ASTContext. Instead of
890 // copying our potentially incomplete 'From' Decl we instead go to the
891 // original ASTContext and copy the original to the target. This is not
892 // only faster than first completing our current decl and then copying it
893 // to the target, but it also prevents that indirectly copying the same
894 // declaration to the same target requires the ASTImporter to merge all
895 // the different decls that appear to come from different ASTContexts (even
896 // though all these different source ASTContexts just got a copy from
897 // one source AST).
898 if (origin.Valid()) {
899 auto R = m_master.CopyDecl(&getToContext(), origin.decl);
900 if (R) {
901 RegisterImportedDecl(From, R);
902 return R;
903 }
904 }
905
906 return ASTImporter::ImportImpl(From);
907 }
908
ImportDefinitionTo(clang::Decl * to,clang::Decl * from)909 void ClangASTImporter::ASTImporterDelegate::ImportDefinitionTo(
910 clang::Decl *to, clang::Decl *from) {
911 ASTImporter::Imported(from, to);
912
913 /*
914 if (to_objc_interface)
915 to_objc_interface->startDefinition();
916
917 CXXRecordDecl *to_cxx_record = dyn_cast<CXXRecordDecl>(to);
918
919 if (to_cxx_record)
920 to_cxx_record->startDefinition();
921 */
922
923 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS);
924
925 if (llvm::Error err = ImportDefinition(from)) {
926 LLDB_LOG_ERROR(log, std::move(err),
927 "[ClangASTImporter] Error during importing definition: {0}");
928 return;
929 }
930
931 if (clang::TagDecl *to_tag = dyn_cast<clang::TagDecl>(to)) {
932 if (clang::TagDecl *from_tag = dyn_cast<clang::TagDecl>(from)) {
933 to_tag->setCompleteDefinition(from_tag->isCompleteDefinition());
934
935 if (Log *log_ast =
936 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_AST)) {
937 std::string name_string;
938 if (NamedDecl *from_named_decl = dyn_cast<clang::NamedDecl>(from)) {
939 llvm::raw_string_ostream name_stream(name_string);
940 from_named_decl->printName(name_stream);
941 name_stream.flush();
942 }
943 LLDB_LOG(log_ast, "==== [ClangASTImporter][TUDecl: {0}] Imported "
944 "({1}Decl*){2}, named {3} (from "
945 "(Decl*){4})",
946 static_cast<void *>(to->getTranslationUnitDecl()),
947 from->getDeclKindName(), static_cast<void *>(to), name_string,
948 static_cast<void *>(from));
949
950 // Log the AST of the TU.
951 std::string ast_string;
952 llvm::raw_string_ostream ast_stream(ast_string);
953 to->getTranslationUnitDecl()->dump(ast_stream);
954 LLDB_LOG(log_ast, "{0}", ast_string);
955 }
956 }
957 }
958
959 // If we're dealing with an Objective-C class, ensure that the inheritance
960 // has been set up correctly. The ASTImporter may not do this correctly if
961 // the class was originally sourced from symbols.
962
963 if (ObjCInterfaceDecl *to_objc_interface = dyn_cast<ObjCInterfaceDecl>(to)) {
964 do {
965 ObjCInterfaceDecl *to_superclass = to_objc_interface->getSuperClass();
966
967 if (to_superclass)
968 break; // we're not going to override it if it's set
969
970 ObjCInterfaceDecl *from_objc_interface =
971 dyn_cast<ObjCInterfaceDecl>(from);
972
973 if (!from_objc_interface)
974 break;
975
976 ObjCInterfaceDecl *from_superclass = from_objc_interface->getSuperClass();
977
978 if (!from_superclass)
979 break;
980
981 llvm::Expected<Decl *> imported_from_superclass_decl =
982 Import(from_superclass);
983
984 if (!imported_from_superclass_decl) {
985 LLDB_LOG_ERROR(log, imported_from_superclass_decl.takeError(),
986 "Couldn't import decl: {0}");
987 break;
988 }
989
990 ObjCInterfaceDecl *imported_from_superclass =
991 dyn_cast<ObjCInterfaceDecl>(*imported_from_superclass_decl);
992
993 if (!imported_from_superclass)
994 break;
995
996 if (!to_objc_interface->hasDefinition())
997 to_objc_interface->startDefinition();
998
999 to_objc_interface->setSuperClass(m_source_ctx->getTrivialTypeSourceInfo(
1000 m_source_ctx->getObjCInterfaceType(imported_from_superclass)));
1001 } while (false);
1002 }
1003 }
1004
Imported(clang::Decl * from,clang::Decl * to)1005 void ClangASTImporter::ASTImporterDelegate::Imported(clang::Decl *from,
1006 clang::Decl *to) {
1007 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
1008
1009 // Some decls shouldn't be tracked here because they were not created by
1010 // copying 'from' to 'to'. Just exit early for those.
1011 if (m_decls_to_ignore.find(to) != m_decls_to_ignore.end())
1012 return clang::ASTImporter::Imported(from, to);
1013
1014 lldb::user_id_t user_id = LLDB_INVALID_UID;
1015 ClangASTMetadata *metadata = m_master.GetDeclMetadata(from);
1016 if (metadata)
1017 user_id = metadata->GetUserID();
1018
1019 if (log) {
1020 if (NamedDecl *from_named_decl = dyn_cast<clang::NamedDecl>(from)) {
1021 std::string name_string;
1022 llvm::raw_string_ostream name_stream(name_string);
1023 from_named_decl->printName(name_stream);
1024 name_stream.flush();
1025
1026 LLDB_LOGF(log,
1027 " [ClangASTImporter] Imported (%sDecl*)%p, named %s (from "
1028 "(Decl*)%p), metadata 0x%" PRIx64,
1029 from->getDeclKindName(), static_cast<void *>(to),
1030 name_string.c_str(), static_cast<void *>(from), user_id);
1031 } else {
1032 LLDB_LOGF(log,
1033 " [ClangASTImporter] Imported (%sDecl*)%p (from "
1034 "(Decl*)%p), metadata 0x%" PRIx64,
1035 from->getDeclKindName(), static_cast<void *>(to),
1036 static_cast<void *>(from), user_id);
1037 }
1038 }
1039
1040 ASTContextMetadataSP to_context_md =
1041 m_master.GetContextMetadata(&to->getASTContext());
1042 ASTContextMetadataSP from_context_md =
1043 m_master.MaybeGetContextMetadata(m_source_ctx);
1044
1045 if (from_context_md) {
1046 OriginMap &origins = from_context_md->m_origins;
1047
1048 OriginMap::iterator origin_iter = origins.find(from);
1049
1050 if (origin_iter != origins.end()) {
1051 if (to_context_md->m_origins.find(to) == to_context_md->m_origins.end() ||
1052 user_id != LLDB_INVALID_UID) {
1053 if (origin_iter->second.ctx != &to->getASTContext())
1054 to_context_md->m_origins[to] = origin_iter->second;
1055 }
1056
1057 ImporterDelegateSP direct_completer =
1058 m_master.GetDelegate(&to->getASTContext(), origin_iter->second.ctx);
1059
1060 if (direct_completer.get() != this)
1061 direct_completer->ASTImporter::Imported(origin_iter->second.decl, to);
1062
1063 LLDB_LOGF(log,
1064 " [ClangASTImporter] Propagated origin "
1065 "(Decl*)%p/(ASTContext*)%p from (ASTContext*)%p to "
1066 "(ASTContext*)%p",
1067 static_cast<void *>(origin_iter->second.decl),
1068 static_cast<void *>(origin_iter->second.ctx),
1069 static_cast<void *>(&from->getASTContext()),
1070 static_cast<void *>(&to->getASTContext()));
1071 } else {
1072 if (m_new_decl_listener)
1073 m_new_decl_listener->NewDeclImported(from, to);
1074
1075 if (to_context_md->m_origins.find(to) == to_context_md->m_origins.end() ||
1076 user_id != LLDB_INVALID_UID) {
1077 to_context_md->m_origins[to] = DeclOrigin(m_source_ctx, from);
1078 }
1079
1080 LLDB_LOGF(log,
1081 " [ClangASTImporter] Decl has no origin information in "
1082 "(ASTContext*)%p",
1083 static_cast<void *>(&from->getASTContext()));
1084 }
1085
1086 if (clang::NamespaceDecl *to_namespace =
1087 dyn_cast<clang::NamespaceDecl>(to)) {
1088 clang::NamespaceDecl *from_namespace =
1089 dyn_cast<clang::NamespaceDecl>(from);
1090
1091 NamespaceMetaMap &namespace_maps = from_context_md->m_namespace_maps;
1092
1093 NamespaceMetaMap::iterator namespace_map_iter =
1094 namespace_maps.find(from_namespace);
1095
1096 if (namespace_map_iter != namespace_maps.end())
1097 to_context_md->m_namespace_maps[to_namespace] =
1098 namespace_map_iter->second;
1099 }
1100 } else {
1101 to_context_md->m_origins[to] = DeclOrigin(m_source_ctx, from);
1102
1103 LLDB_LOGF(log,
1104 " [ClangASTImporter] Sourced origin "
1105 "(Decl*)%p/(ASTContext*)%p into (ASTContext*)%p",
1106 static_cast<void *>(from), static_cast<void *>(m_source_ctx),
1107 static_cast<void *>(&to->getASTContext()));
1108 }
1109
1110 if (TagDecl *from_tag_decl = dyn_cast<TagDecl>(from)) {
1111 TagDecl *to_tag_decl = dyn_cast<TagDecl>(to);
1112
1113 to_tag_decl->setHasExternalLexicalStorage();
1114 to_tag_decl->getPrimaryContext()->setMustBuildLookupTable();
1115
1116 LLDB_LOGF(
1117 log,
1118 " [ClangASTImporter] To is a TagDecl - attributes %s%s [%s->%s]",
1119 (to_tag_decl->hasExternalLexicalStorage() ? " Lexical" : ""),
1120 (to_tag_decl->hasExternalVisibleStorage() ? " Visible" : ""),
1121 (from_tag_decl->isCompleteDefinition() ? "complete" : "incomplete"),
1122 (to_tag_decl->isCompleteDefinition() ? "complete" : "incomplete"));
1123 }
1124
1125 if (isa<NamespaceDecl>(from)) {
1126 NamespaceDecl *to_namespace_decl = dyn_cast<NamespaceDecl>(to);
1127
1128 m_master.BuildNamespaceMap(to_namespace_decl);
1129
1130 to_namespace_decl->setHasExternalVisibleStorage();
1131 }
1132
1133 if (isa<ObjCContainerDecl>(from)) {
1134 ObjCContainerDecl *to_container_decl = dyn_cast<ObjCContainerDecl>(to);
1135
1136 to_container_decl->setHasExternalLexicalStorage();
1137 to_container_decl->setHasExternalVisibleStorage();
1138
1139 /*to_interface_decl->setExternallyCompleted();*/
1140
1141 if (log) {
1142 if (ObjCInterfaceDecl *to_interface_decl =
1143 llvm::dyn_cast<ObjCInterfaceDecl>(to_container_decl)) {
1144 LLDB_LOGF(
1145 log,
1146 " [ClangASTImporter] To is an ObjCInterfaceDecl - attributes "
1147 "%s%s%s",
1148 (to_interface_decl->hasExternalLexicalStorage() ? " Lexical" : ""),
1149 (to_interface_decl->hasExternalVisibleStorage() ? " Visible" : ""),
1150 (to_interface_decl->hasDefinition() ? " HasDefinition" : ""));
1151 } else {
1152 LLDB_LOGF(
1153 log, " [ClangASTImporter] To is an %sDecl - attributes %s%s",
1154 ((Decl *)to_container_decl)->getDeclKindName(),
1155 (to_container_decl->hasExternalLexicalStorage() ? " Lexical" : ""),
1156 (to_container_decl->hasExternalVisibleStorage() ? " Visible" : ""));
1157 }
1158 }
1159 }
1160 }
1161
1162 clang::Decl *
GetOriginalDecl(clang::Decl * To)1163 ClangASTImporter::ASTImporterDelegate::GetOriginalDecl(clang::Decl *To) {
1164 return m_master.GetDeclOrigin(To).decl;
1165 }
1166