blob: a25dae81d62d898234bddea242e83753336286fb [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- ClangASTContext.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
Eli Friedman932197d2010-06-13 19:06:42 +000010#include "lldb/Symbol/ClangASTContext.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000011
12// C Includes
13// C++ Includes
14#include <string>
15
16// Other libraries and framework includes
Greg Clayton6beaaa62011-01-17 03:46:26 +000017
18// Clang headers like to use NDEBUG inside of them to enable/disable debug
19// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
20// or another. This is bad because it means that if clang was built in release
21// mode, it assumes that you are building in release mode which is not always
22// the case. You can end up with functions that are defined as empty in header
23// files when NDEBUG is not defined, and this can cause link errors with the
24// clang .a files that you have since you might be missing functions in the .a
25// file. So we have to define NDEBUG when including clang headers to avoid any
26// mismatches. This is covered by rdar://problem/8691220
27
28#ifndef NDEBUG
29#define LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000030#define NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000031// Need to include assert.h so it is as clang would expect it to be (disabled)
32#include <assert.h>
33#endif
34
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035#include "clang/AST/ASTContext.h"
36#include "clang/AST/ASTImporter.h"
37#include "clang/AST/CXXInheritance.h"
Greg Clayton8cf05932010-07-22 18:30:50 +000038#include "clang/AST/DeclObjC.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039#include "clang/AST/RecordLayout.h"
40#include "clang/AST/Type.h"
41#include "clang/Basic/Builtins.h"
42#include "clang/Basic/FileManager.h"
Sean Callanan79439e82010-11-18 02:56:27 +000043#include "clang/Basic/FileSystemOptions.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044#include "clang/Basic/SourceManager.h"
45#include "clang/Basic/TargetInfo.h"
46#include "clang/Basic/TargetOptions.h"
47#include "clang/Frontend/FrontendOptions.h"
48#include "clang/Frontend/LangStandard.h"
Greg Clayton6beaaa62011-01-17 03:46:26 +000049
50#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000051#undef NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000052#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
53// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
54#include <assert.h>
55#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +000056
Greg Clayton514487e2011-02-15 21:59:32 +000057#include "lldb/Core/ArchSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000058#include "lldb/Core/dwarf.h"
Greg Clayton73b472d2010-10-27 03:32:59 +000059#include "lldb/Core/Flags.h"
Sean Callananfb8b7092010-10-28 18:19:36 +000060#include "lldb/Core/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000061
Eli Friedman932197d2010-06-13 19:06:42 +000062#include <stdio.h>
63
Greg Claytonc86103d2010-08-05 01:57:25 +000064using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065using namespace lldb_private;
66using namespace llvm;
67using namespace clang;
68
Greg Clayton6beaaa62011-01-17 03:46:26 +000069
70static bool
71GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type)
72{
73 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
74 switch (type_class)
75 {
76 case clang::Type::Record:
77 case clang::Type::Enum:
78 {
Sean Callanan78e37602011-01-27 04:42:51 +000079 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +000080 if (tag_type)
81 {
82 clang::TagDecl *tag_decl = tag_type->getDecl();
83 if (tag_decl)
84 {
85 if (tag_decl->getDefinition())
86 return true;
87
88 if (tag_decl->hasExternalLexicalStorage())
89 {
90 ExternalASTSource *external_ast_source = ast->getExternalSource();
91 if (external_ast_source)
92 {
93 external_ast_source->CompleteType(tag_decl);
94 return !tag_type->isIncompleteType();
95 }
96 }
97 return false;
98 }
99 }
100
101 }
102 break;
103
104 case clang::Type::ObjCObject:
105 case clang::Type::ObjCInterface:
106 {
Sean Callanan78e37602011-01-27 04:42:51 +0000107 const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000108 if (objc_class_type)
109 {
110 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
111 // We currently can't complete objective C types through the newly added ASTContext
112 // because it only supports TagDecl objects right now...
113 bool is_forward_decl = class_interface_decl->isForwardDecl();
114 if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage())
115 {
116 ExternalASTSource *external_ast_source = ast->getExternalSource();
117 if (external_ast_source)
118 {
119 external_ast_source->CompleteType (class_interface_decl);
120 is_forward_decl = class_interface_decl->isForwardDecl();
121 }
Greg Claytonc432c192011-01-20 04:18:48 +0000122 return is_forward_decl == false;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000123 }
Greg Claytonc432c192011-01-20 04:18:48 +0000124 return true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000125 }
126 }
127 break;
128
129 case clang::Type::Typedef:
130 return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
131
132 default:
133 break;
134 }
135
136 return true;
137}
138
139
Greg Clayton8cf05932010-07-22 18:30:50 +0000140static AccessSpecifier
Greg Claytonc86103d2010-08-05 01:57:25 +0000141ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000142{
143 switch (access)
144 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000145 default: break;
146 case eAccessNone: return AS_none;
147 case eAccessPublic: return AS_public;
148 case eAccessPrivate: return AS_private;
149 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000150 }
151 return AS_none;
152}
153
154static ObjCIvarDecl::AccessControl
Greg Claytonc86103d2010-08-05 01:57:25 +0000155ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000156{
157 switch (access)
158 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000159 default: break;
160 case eAccessNone: return ObjCIvarDecl::None;
161 case eAccessPublic: return ObjCIvarDecl::Public;
162 case eAccessPrivate: return ObjCIvarDecl::Private;
163 case eAccessProtected: return ObjCIvarDecl::Protected;
164 case eAccessPackage: return ObjCIvarDecl::Package;
Greg Clayton8cf05932010-07-22 18:30:50 +0000165 }
166 return ObjCIvarDecl::None;
167}
168
169
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000170static void
171ParseLangArgs
172(
173 LangOptions &Opts,
Greg Clayton94e5d782010-06-13 17:34:29 +0000174 InputKind IK
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000175)
176{
177 // FIXME: Cleanup per-file based stuff.
178
179 // Set some properties which depend soley on the input kind; it would be nice
180 // to move these to the language standard, and have the driver resolve the
181 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000182 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000183 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000184 } else if (IK == IK_ObjC ||
185 IK == IK_ObjCXX ||
186 IK == IK_PreprocessedObjC ||
187 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000188 Opts.ObjC1 = Opts.ObjC2 = 1;
189 }
190
191 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
192
193 if (LangStd == LangStandard::lang_unspecified) {
194 // Based on the base language, pick one.
195 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000196 case IK_None:
197 case IK_AST:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000198 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000199 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000200 LangStd = LangStandard::lang_opencl;
201 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000202 case IK_Asm:
203 case IK_C:
204 case IK_PreprocessedC:
205 case IK_ObjC:
206 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000207 LangStd = LangStandard::lang_gnu99;
208 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000209 case IK_CXX:
210 case IK_PreprocessedCXX:
211 case IK_ObjCXX:
212 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000213 LangStd = LangStandard::lang_gnucxx98;
214 break;
215 }
216 }
217
218 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
219 Opts.BCPLComment = Std.hasBCPLComments();
220 Opts.C99 = Std.isC99();
221 Opts.CPlusPlus = Std.isCPlusPlus();
222 Opts.CPlusPlus0x = Std.isCPlusPlus0x();
223 Opts.Digraphs = Std.hasDigraphs();
224 Opts.GNUMode = Std.isGNUMode();
225 Opts.GNUInline = !Std.isC99();
226 Opts.HexFloats = Std.hasHexFloats();
227 Opts.ImplicitInt = Std.hasImplicitInt();
228
229 // OpenCL has some additional defaults.
230 if (LangStd == LangStandard::lang_opencl) {
231 Opts.OpenCL = 1;
232 Opts.AltiVec = 1;
233 Opts.CXXOperatorNames = 1;
234 Opts.LaxVectorConversions = 1;
235 }
236
237 // OpenCL and C++ both have bool, true, false keywords.
238 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
239
240// if (Opts.CPlusPlus)
241// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
242//
243// if (Args.hasArg(OPT_fobjc_gc_only))
244// Opts.setGCMode(LangOptions::GCOnly);
245// else if (Args.hasArg(OPT_fobjc_gc))
246// Opts.setGCMode(LangOptions::HybridGC);
247//
248// if (Args.hasArg(OPT_print_ivar_layout))
249// Opts.ObjCGCBitmapPrint = 1;
250//
251// if (Args.hasArg(OPT_faltivec))
252// Opts.AltiVec = 1;
253//
254// if (Args.hasArg(OPT_pthread))
255// Opts.POSIXThreads = 1;
256//
257// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
258// "default");
259// if (Vis == "default")
Sean Callanan31e851c2010-10-29 18:38:40 +0000260 Opts.setVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000261// else if (Vis == "hidden")
262// Opts.setVisibilityMode(LangOptions::Hidden);
263// else if (Vis == "protected")
264// Opts.setVisibilityMode(LangOptions::Protected);
265// else
266// Diags.Report(diag::err_drv_invalid_value)
267// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
268
269// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
270
271 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
272 // is specified, or -std is set to a conforming mode.
273 Opts.Trigraphs = !Opts.GNUMode;
274// if (Args.hasArg(OPT_trigraphs))
275// Opts.Trigraphs = 1;
276//
277// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
278// OPT_fno_dollars_in_identifiers,
279// !Opts.AsmPreprocessor);
280// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
281// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
282// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
283// if (Args.hasArg(OPT_fno_lax_vector_conversions))
284// Opts.LaxVectorConversions = 0;
285// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
286// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
287// Opts.Blocks = Args.hasArg(OPT_fblocks);
288// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
289// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
290// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
291// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
292// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
293// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
294// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
295// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
296// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
297// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
298// Diags);
299// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
300// Opts.ObjCConstantStringClass = getLastArgValue(Args,
301// OPT_fconstant_string_class);
302// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
303// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
304// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
305// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
306// Opts.Static = Args.hasArg(OPT_static_define);
307 Opts.OptimizeSize = 0;
308
309 // FIXME: Eliminate this dependency.
310// unsigned Opt =
311// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
312// Opts.Optimize = Opt != 0;
313 unsigned Opt = 0;
314
315 // This is the __NO_INLINE__ define, which just depends on things like the
316 // optimization level and -fno-inline, not actually whether the backend has
317 // inlining enabled.
318 //
319 // FIXME: This is affected by other options (-fno-inline).
320 Opts.NoInline = !Opt;
321
322// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
323// switch (SSP) {
324// default:
325// Diags.Report(diag::err_drv_invalid_value)
326// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
327// break;
328// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
329// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
330// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
331// }
332}
333
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000334
Greg Clayton6beaaa62011-01-17 03:46:26 +0000335ClangASTContext::ClangASTContext (const char *target_triple) :
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000336 m_target_triple(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000337 m_ast_ap(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000338 m_language_options_ap(),
339 m_source_manager_ap(),
340 m_diagnostic_ap(),
341 m_target_options_ap(),
342 m_target_info_ap(),
343 m_identifier_table_ap(),
344 m_selector_table_ap(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000345 m_builtins_ap(),
346 m_callback_tag_decl (NULL),
347 m_callback_objc_decl (NULL),
348 m_callback_baton (NULL)
349
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000350{
351 if (target_triple && target_triple[0])
352 m_target_triple.assign (target_triple);
353}
354
355//----------------------------------------------------------------------
356// Destructor
357//----------------------------------------------------------------------
358ClangASTContext::~ClangASTContext()
359{
360 m_builtins_ap.reset();
361 m_selector_table_ap.reset();
362 m_identifier_table_ap.reset();
363 m_target_info_ap.reset();
364 m_target_options_ap.reset();
365 m_diagnostic_ap.reset();
366 m_source_manager_ap.reset();
367 m_language_options_ap.reset();
Greg Clayton6beaaa62011-01-17 03:46:26 +0000368 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000369}
370
371
372void
373ClangASTContext::Clear()
374{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000375 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000376 m_language_options_ap.reset();
377 m_source_manager_ap.reset();
378 m_diagnostic_ap.reset();
379 m_target_options_ap.reset();
380 m_target_info_ap.reset();
381 m_identifier_table_ap.reset();
382 m_selector_table_ap.reset();
383 m_builtins_ap.reset();
384}
385
386const char *
387ClangASTContext::GetTargetTriple ()
388{
389 return m_target_triple.c_str();
390}
391
392void
393ClangASTContext::SetTargetTriple (const char *target_triple)
394{
395 Clear();
396 m_target_triple.assign(target_triple);
397}
398
Greg Clayton514487e2011-02-15 21:59:32 +0000399void
400ClangASTContext::SetArchitecture (const ArchSpec &arch)
401{
402 Clear();
403 m_target_triple.assign(arch.GetTriple().str());
404}
405
Greg Clayton6beaaa62011-01-17 03:46:26 +0000406bool
407ClangASTContext::HasExternalSource ()
408{
409 ASTContext *ast = getASTContext();
410 if (ast)
411 return ast->getExternalSource () != NULL;
412 return false;
413}
414
415void
416ClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
417{
418 ASTContext *ast = getASTContext();
419 if (ast)
420 {
421 ast->setExternalSource (ast_source_ap);
422 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
423 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
424 }
425}
426
427void
428ClangASTContext::RemoveExternalSource ()
429{
430 ASTContext *ast = getASTContext();
431
432 if (ast)
433 {
434 llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
435 ast->setExternalSource (empty_ast_source_ap);
436 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
437 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
438 }
439}
440
441
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000442
443ASTContext *
444ClangASTContext::getASTContext()
445{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000446 if (m_ast_ap.get() == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000447 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000448 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
449 *getSourceManager(),
450 *getTargetInfo(),
451 *getIdentifierTable(),
452 *getSelectorTable(),
453 *getBuiltinContext(),
454 0));
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000455
Greg Clayton6beaaa62011-01-17 03:46:26 +0000456 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
457 {
458 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
459 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
460 }
461
462 m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000463 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000464 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000465}
466
467Builtin::Context *
468ClangASTContext::getBuiltinContext()
469{
470 if (m_builtins_ap.get() == NULL)
471 m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
472 return m_builtins_ap.get();
473}
474
475IdentifierTable *
476ClangASTContext::getIdentifierTable()
477{
478 if (m_identifier_table_ap.get() == NULL)
479 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
480 return m_identifier_table_ap.get();
481}
482
483LangOptions *
484ClangASTContext::getLanguageOptions()
485{
486 if (m_language_options_ap.get() == NULL)
487 {
488 m_language_options_ap.reset(new LangOptions());
Greg Clayton94e5d782010-06-13 17:34:29 +0000489 ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
490// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000491 }
492 return m_language_options_ap.get();
493}
494
495SelectorTable *
496ClangASTContext::getSelectorTable()
497{
498 if (m_selector_table_ap.get() == NULL)
499 m_selector_table_ap.reset (new SelectorTable());
500 return m_selector_table_ap.get();
501}
502
Sean Callanan79439e82010-11-18 02:56:27 +0000503clang::FileManager *
504ClangASTContext::getFileManager()
505{
506 if (m_file_manager_ap.get() == NULL)
Greg Clayton38a61402010-12-02 23:20:03 +0000507 {
508 clang::FileSystemOptions file_system_options;
509 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
510 }
Sean Callanan79439e82010-11-18 02:56:27 +0000511 return m_file_manager_ap.get();
512}
513
Greg Claytone1a916a2010-07-21 22:12:05 +0000514clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000515ClangASTContext::getSourceManager()
516{
517 if (m_source_manager_ap.get() == NULL)
Greg Clayton38a61402010-12-02 23:20:03 +0000518 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000519 return m_source_manager_ap.get();
520}
521
522Diagnostic *
523ClangASTContext::getDiagnostic()
524{
525 if (m_diagnostic_ap.get() == NULL)
Greg Claytona651b532010-11-19 21:46:54 +0000526 {
527 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
528 m_diagnostic_ap.reset(new Diagnostic(diag_id_sp));
529 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000530 return m_diagnostic_ap.get();
531}
532
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000533class NullDiagnosticClient : public DiagnosticClient
534{
535public:
536 NullDiagnosticClient ()
537 {
538 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
539 }
540
541 void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info)
542 {
543 if (m_log)
544 {
545 llvm::SmallVectorImpl<char> diag_str(10);
546 info.FormatDiagnostic(diag_str);
547 diag_str.push_back('\0');
548 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
549 }
550 }
551private:
552 LogSP m_log;
553};
554
555DiagnosticClient *
556ClangASTContext::getDiagnosticClient()
557{
558 if (m_diagnostic_client_ap.get() == NULL)
559 m_diagnostic_client_ap.reset(new NullDiagnosticClient);
560
561 return m_diagnostic_client_ap.get();
562}
563
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000564TargetOptions *
565ClangASTContext::getTargetOptions()
566{
567 if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
568 {
569 m_target_options_ap.reset (new TargetOptions());
570 if (m_target_options_ap.get())
571 m_target_options_ap->Triple = m_target_triple;
572 }
573 return m_target_options_ap.get();
574}
575
576
577TargetInfo *
578ClangASTContext::getTargetInfo()
579{
580 // target_triple should be something like "x86_64-apple-darwin10"
581 if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
582 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
583 return m_target_info_ap.get();
584}
585
586#pragma mark Basic Types
587
588static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000589QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000590{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000591 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000592 if (qual_type_bit_size == bit_size)
593 return true;
594 return false;
595}
596
Greg Clayton1be10fc2010-09-29 01:12:09 +0000597clang_type_t
Greg Claytonc86103d2010-08-05 01:57:25 +0000598ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000599{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000600 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000601
Greg Clayton6beaaa62011-01-17 03:46:26 +0000602 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000603
Greg Clayton6beaaa62011-01-17 03:46:26 +0000604 return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000605}
606
Greg Clayton1be10fc2010-09-29 01:12:09 +0000607clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000608ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000609{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000610 if (!ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000611 return NULL;
612
613 switch (encoding)
614 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000615 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000616 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
617 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000618 break;
619
Greg Claytonc86103d2010-08-05 01:57:25 +0000620 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000621 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
622 return ast->UnsignedCharTy.getAsOpaquePtr();
623 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
624 return ast->UnsignedShortTy.getAsOpaquePtr();
625 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
626 return ast->UnsignedIntTy.getAsOpaquePtr();
627 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
628 return ast->UnsignedLongTy.getAsOpaquePtr();
629 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
630 return ast->UnsignedLongLongTy.getAsOpaquePtr();
631 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
632 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000633 break;
634
Greg Claytonc86103d2010-08-05 01:57:25 +0000635 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000636 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
637 return ast->CharTy.getAsOpaquePtr();
638 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
639 return ast->ShortTy.getAsOpaquePtr();
640 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
641 return ast->IntTy.getAsOpaquePtr();
642 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
643 return ast->LongTy.getAsOpaquePtr();
644 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
645 return ast->LongLongTy.getAsOpaquePtr();
646 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
647 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000648 break;
649
Greg Claytonc86103d2010-08-05 01:57:25 +0000650 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000651 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
652 return ast->FloatTy.getAsOpaquePtr();
653 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
654 return ast->DoubleTy.getAsOpaquePtr();
655 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
656 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000657 break;
658
Greg Claytonc86103d2010-08-05 01:57:25 +0000659 case eEncodingVector:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000660 default:
661 break;
662 }
663
664 return NULL;
665}
666
Greg Clayton1be10fc2010-09-29 01:12:09 +0000667clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000668ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
669{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000670 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000671
672 #define streq(a,b) strcmp(a,b) == 0
Greg Clayton6beaaa62011-01-17 03:46:26 +0000673 assert (ast != NULL);
674 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000675 {
676 switch (dw_ate)
677 {
678 default:
679 break;
680
681 case DW_ATE_address:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000682 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
683 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000684 break;
685
686 case DW_ATE_boolean:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000687 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
688 return ast->BoolTy.getAsOpaquePtr();
689 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
690 return ast->UnsignedCharTy.getAsOpaquePtr();
691 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
692 return ast->UnsignedShortTy.getAsOpaquePtr();
693 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
694 return ast->UnsignedIntTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000695 break;
696
Greg Clayton49462ea2011-01-15 02:52:14 +0000697 case DW_ATE_lo_user:
698 // This has been seen to mean DW_AT_complex_integer
Greg Clayton5732f242011-01-27 09:15:11 +0000699 if (::strstr(type_name, "complex"))
Greg Clayton49462ea2011-01-15 02:52:14 +0000700 {
701 clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000702 return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000703 }
704 break;
705
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000706 case DW_ATE_complex_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000707 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
708 return ast->FloatComplexTy.getAsOpaquePtr();
709 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
710 return ast->DoubleComplexTy.getAsOpaquePtr();
711 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
712 return ast->LongDoubleComplexTy.getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000713 else
714 {
715 clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000716 return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000717 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000718 break;
719
720 case DW_ATE_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000721 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
722 return ast->FloatTy.getAsOpaquePtr();
723 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
724 return ast->DoubleTy.getAsOpaquePtr();
725 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
726 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000727 break;
728
729 case DW_ATE_signed:
730 if (type_name)
731 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000732 if (strstr(type_name, "long long"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000733 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000734 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
735 return ast->LongLongTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000736 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000737 else if (strstr(type_name, "long"))
738 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000739 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
740 return ast->LongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000741 }
742 else if (strstr(type_name, "short"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000743 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000744 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
745 return ast->ShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000746 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000747 else if (strstr(type_name, "char"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000748 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000749 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
750 return ast->CharTy.getAsOpaquePtr();
751 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
752 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000753 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000754 else if (strstr(type_name, "int"))
755 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000756 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
757 return ast->IntTy.getAsOpaquePtr();
758 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
759 return ast->Int128Ty.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000760 }
761 else if (streq(type_name, "wchar_t"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000762 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000763 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
764 return ast->WCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000765 }
Greg Clayton7bd65b92011-02-09 23:39:34 +0000766 else if (streq(type_name, "void"))
767 {
768 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
769 return ast->VoidTy.getAsOpaquePtr();
770 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000771 }
772 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000773 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
774 return ast->CharTy.getAsOpaquePtr();
775 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
776 return ast->ShortTy.getAsOpaquePtr();
777 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
778 return ast->IntTy.getAsOpaquePtr();
779 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
780 return ast->LongTy.getAsOpaquePtr();
781 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
782 return ast->LongLongTy.getAsOpaquePtr();
783 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
784 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000785 break;
786
787 case DW_ATE_signed_char:
788 if (type_name)
789 {
790 if (streq(type_name, "signed char"))
791 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000792 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
793 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000794 }
795 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000796 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
797 return ast->CharTy.getAsOpaquePtr();
798 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
799 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000800 break;
801
802 case DW_ATE_unsigned:
803 if (type_name)
804 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000805 if (strstr(type_name, "long long"))
806 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000807 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
808 return ast->UnsignedLongLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000809 }
810 else if (strstr(type_name, "long"))
811 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000812 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
813 return ast->UnsignedLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000814 }
815 else if (strstr(type_name, "short"))
816 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000817 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
818 return ast->UnsignedShortTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000819 }
820 else if (strstr(type_name, "char"))
821 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000822 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
823 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000824 }
825 else if (strstr(type_name, "int"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000826 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000827 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
828 return ast->UnsignedIntTy.getAsOpaquePtr();
829 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
830 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000831 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000832 }
833 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000834 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
835 return ast->UnsignedCharTy.getAsOpaquePtr();
836 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
837 return ast->UnsignedShortTy.getAsOpaquePtr();
838 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
839 return ast->UnsignedIntTy.getAsOpaquePtr();
840 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
841 return ast->UnsignedLongTy.getAsOpaquePtr();
842 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
843 return ast->UnsignedLongLongTy.getAsOpaquePtr();
844 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
845 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000846 break;
847
848 case DW_ATE_unsigned_char:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000849 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
850 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton7bd65b92011-02-09 23:39:34 +0000851 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
852 return ast->UnsignedShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000853 break;
854
855 case DW_ATE_imaginary_float:
856 break;
857 }
858 }
859 // This assert should fire for anything that we don't catch above so we know
860 // to fix any issues we run into.
861 assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!");
862 return NULL;
863}
864
Greg Clayton1be10fc2010-09-29 01:12:09 +0000865clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000866ClangASTContext::GetBuiltInType_void(ASTContext *ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000867{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000868 return ast->VoidTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000869}
870
Greg Clayton1be10fc2010-09-29 01:12:09 +0000871clang_type_t
Sean Callananf7c3e272010-11-19 02:52:21 +0000872ClangASTContext::GetBuiltInType_bool()
873{
874 return getASTContext()->BoolTy.getAsOpaquePtr();
875}
876
877clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000878ClangASTContext::GetBuiltInType_objc_id()
879{
Sean Callananf6c73082010-12-06 23:53:20 +0000880 return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000881}
882
Greg Clayton1be10fc2010-09-29 01:12:09 +0000883clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000884ClangASTContext::GetBuiltInType_objc_Class()
885{
Sean Callanana2424172010-10-25 00:29:48 +0000886 return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000887}
888
Greg Clayton1be10fc2010-09-29 01:12:09 +0000889clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000890ClangASTContext::GetBuiltInType_objc_selector()
891{
Sean Callananf6c73082010-12-06 23:53:20 +0000892 return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000893}
894
Greg Clayton1be10fc2010-09-29 01:12:09 +0000895clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000896ClangASTContext::GetCStringType (bool is_const)
897{
898 QualType char_type(getASTContext()->CharTy);
899
900 if (is_const)
901 char_type.addConst();
902
903 return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
904}
905
Greg Clayton1be10fc2010-09-29 01:12:09 +0000906clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000907ClangASTContext::GetVoidPtrType (bool is_const)
908{
909 return GetVoidPtrType(getASTContext(), is_const);
910}
911
Greg Clayton1be10fc2010-09-29 01:12:09 +0000912clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000913ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000914{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000915 QualType void_ptr_type(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000916
917 if (is_const)
918 void_ptr_type.addConst();
919
920 return void_ptr_type.getAsOpaquePtr();
921}
922
Greg Clayton1be10fc2010-09-29 01:12:09 +0000923clang_type_t
Greg Clayton38a61402010-12-02 23:20:03 +0000924ClangASTContext::CopyType (ASTContext *dst_ast,
925 ASTContext *src_ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +0000926 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000927{
Sean Callanan79439e82010-11-18 02:56:27 +0000928 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +0000929 FileManager file_manager (file_system_options);
930 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +0000931 *src_ast, file_manager,
932 false);
Sean Callanan0617fcb2010-11-09 22:37:10 +0000933
Greg Clayton38a61402010-12-02 23:20:03 +0000934 QualType src (QualType::getFromOpaquePtr(clang_type));
935 QualType dst (importer.Import(src));
Sean Callanan0617fcb2010-11-09 22:37:10 +0000936
937 return dst.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000938}
939
Greg Clayton526e5af2010-11-13 03:52:47 +0000940
941clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +0000942ClangASTContext::CopyDecl (ASTContext *dst_ast,
943 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +0000944 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000945{
Sean Callanan79439e82010-11-18 02:56:27 +0000946 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +0000947 FileManager file_manager (file_system_options);
948 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +0000949 *src_ast, file_manager,
950 false);
Greg Clayton526e5af2010-11-13 03:52:47 +0000951
952 return importer.Import(source_decl);
953}
954
Sean Callanan23a30272010-07-16 00:00:27 +0000955bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000956ClangASTContext::AreTypesSame(ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +0000957 clang_type_t type1,
958 clang_type_t type2)
Sean Callanan4dcca2622010-07-15 22:30:52 +0000959{
Greg Claytonf4ecaa52011-02-16 23:00:21 +0000960 return ast->hasSameType (QualType::getFromOpaquePtr(type1),
961 QualType::getFromOpaquePtr(type2));
Sean Callanan4dcca2622010-07-15 22:30:52 +0000962}
963
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000964#pragma mark CVR modifiers
965
Greg Clayton1be10fc2010-09-29 01:12:09 +0000966clang_type_t
967ClangASTContext::AddConstModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000968{
969 if (clang_type)
970 {
971 QualType result(QualType::getFromOpaquePtr(clang_type));
972 result.addConst();
973 return result.getAsOpaquePtr();
974 }
975 return NULL;
976}
977
Greg Clayton1be10fc2010-09-29 01:12:09 +0000978clang_type_t
979ClangASTContext::AddRestrictModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000980{
981 if (clang_type)
982 {
983 QualType result(QualType::getFromOpaquePtr(clang_type));
984 result.getQualifiers().setRestrict (true);
985 return result.getAsOpaquePtr();
986 }
987 return NULL;
988}
989
Greg Clayton1be10fc2010-09-29 01:12:09 +0000990clang_type_t
991ClangASTContext::AddVolatileModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000992{
993 if (clang_type)
994 {
995 QualType result(QualType::getFromOpaquePtr(clang_type));
996 result.getQualifiers().setVolatile (true);
997 return result.getAsOpaquePtr();
998 }
999 return NULL;
1000}
1001
Greg Clayton6beaaa62011-01-17 03:46:26 +00001002
1003clang_type_t
1004ClangASTContext::GetTypeForDecl (TagDecl *decl)
1005{
1006 // No need to call the getASTContext() accessor (which can create the AST
1007 // if it isn't created yet, because we can't have created a decl in this
1008 // AST if our AST didn't already exist...
1009 if (m_ast_ap.get())
1010 return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1011 return NULL;
1012}
1013
1014clang_type_t
1015ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1016{
1017 // No need to call the getASTContext() accessor (which can create the AST
1018 // if it isn't created yet, because we can't have created a decl in this
1019 // AST if our AST didn't already exist...
1020 if (m_ast_ap.get())
1021 return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1022 return NULL;
1023}
1024
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001025#pragma mark Structure, Unions, Classes
1026
Greg Clayton1be10fc2010-09-29 01:12:09 +00001027clang_type_t
Greg Claytonc86103d2010-08-05 01:57:25 +00001028ClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001029{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001030 ASTContext *ast = getASTContext();
1031 assert (ast != NULL);
Sean Callanana2424172010-10-25 00:29:48 +00001032
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001033 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001034 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001035
Greg Clayton9e409562010-07-28 02:04:09 +00001036
Greg Claytonc86103d2010-08-05 01:57:25 +00001037 if (language == eLanguageTypeObjC)
Greg Clayton9e409562010-07-28 02:04:09 +00001038 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001039 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001040 bool isInternal = false;
1041 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
1042 }
1043
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001044 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1045 // we will need to update this code. I was told to currently always use
1046 // the CXXRecordDecl class since we often don't know from debug information
1047 // if something is struct or a class, so we default to always use the more
1048 // complete definition just in case.
Greg Clayton6beaaa62011-01-17 03:46:26 +00001049 CXXRecordDecl *decl = CXXRecordDecl::Create(*ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001050 (TagDecl::TagKind)kind,
1051 decl_ctx,
1052 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001053 name && name[0] ? &ast->Idents.get(name) : NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001054
Greg Clayton6beaaa62011-01-17 03:46:26 +00001055 return ast->getTagDeclType(decl).getAsOpaquePtr();
1056}
1057
1058bool
1059ClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1060{
1061 if (clang_type == NULL)
1062 return false;
1063
1064 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1065
1066 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1067 switch (type_class)
1068 {
1069 case clang::Type::Record:
1070 {
1071 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1072 if (cxx_record_decl)
1073 {
1074 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001075 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001076 return true;
1077 }
1078 }
1079 break;
1080
1081 case clang::Type::Enum:
1082 {
1083 EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1084 if (enum_decl)
1085 {
1086 enum_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001087 enum_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001088 return true;
1089 }
1090 }
1091 break;
1092
1093 case clang::Type::ObjCObject:
1094 case clang::Type::ObjCInterface:
1095 {
Sean Callanan78e37602011-01-27 04:42:51 +00001096 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00001097 assert (objc_class_type);
1098 if (objc_class_type)
1099 {
1100 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1101
1102 if (class_interface_decl)
1103 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001104 class_interface_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001105 class_interface_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001106 return true;
1107 }
1108 }
1109 }
1110 break;
1111
1112 case clang::Type::Typedef:
1113 return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
1114
1115 default:
1116 break;
1117 }
1118 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001119}
1120
Greg Claytona3c444a2010-10-01 23:13:49 +00001121static bool
1122IsOperator (const char *name, OverloadedOperatorKind &op_kind)
1123{
1124 if (name == NULL || name[0] == '\0')
1125 return false;
1126
Sean Callanana43f20d2010-12-10 19:51:54 +00001127#define OPERATOR_PREFIX "operator"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001128#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
Sean Callananbfeff8c2010-12-10 02:15:55 +00001129
1130 const char *post_op_name = NULL;
1131
Sean Callanana43f20d2010-12-10 19:51:54 +00001132 bool no_space = true;
Sean Callananbfeff8c2010-12-10 02:15:55 +00001133
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001134 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
Greg Claytona3c444a2010-10-01 23:13:49 +00001135 return false;
1136
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001137 post_op_name = name + OPERATOR_PREFIX_LENGTH;
1138
Sean Callanana43f20d2010-12-10 19:51:54 +00001139 if (post_op_name[0] == ' ')
1140 {
1141 post_op_name++;
1142 no_space = false;
1143 }
1144
1145#undef OPERATOR_PREFIX
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001146#undef OPERATOR_PREFIX_LENGTH
Sean Callanana43f20d2010-12-10 19:51:54 +00001147
Greg Claytona3c444a2010-10-01 23:13:49 +00001148 // This is an operator, set the overloaded operator kind to invalid
1149 // in case this is a conversion operator...
1150 op_kind = NUM_OVERLOADED_OPERATORS;
1151
1152 switch (post_op_name[0])
1153 {
Sean Callananbfeff8c2010-12-10 02:15:55 +00001154 default:
1155 if (no_space)
1156 return false;
1157 break;
Greg Claytona3c444a2010-10-01 23:13:49 +00001158 case 'n':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001159 if (no_space)
1160 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001161 if (strcmp (post_op_name, "new") == 0)
1162 op_kind = OO_New;
1163 else if (strcmp (post_op_name, "new[]") == 0)
1164 op_kind = OO_Array_New;
1165 break;
1166
1167 case 'd':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001168 if (no_space)
1169 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001170 if (strcmp (post_op_name, "delete") == 0)
1171 op_kind = OO_Delete;
1172 else if (strcmp (post_op_name, "delete[]") == 0)
1173 op_kind = OO_Array_Delete;
1174 break;
1175
1176 case '+':
1177 if (post_op_name[1] == '\0')
1178 op_kind = OO_Plus;
1179 else if (post_op_name[2] == '\0')
1180 {
1181 if (post_op_name[1] == '=')
1182 op_kind = OO_PlusEqual;
1183 else if (post_op_name[1] == '+')
1184 op_kind = OO_PlusPlus;
1185 }
1186 break;
1187
1188 case '-':
1189 if (post_op_name[1] == '\0')
1190 op_kind = OO_Minus;
1191 else if (post_op_name[2] == '\0')
1192 {
1193 switch (post_op_name[1])
1194 {
1195 case '=': op_kind = OO_MinusEqual; break;
1196 case '-': op_kind = OO_MinusMinus; break;
1197 case '>': op_kind = OO_Arrow; break;
1198 }
1199 }
1200 else if (post_op_name[3] == '\0')
1201 {
1202 if (post_op_name[2] == '*')
1203 op_kind = OO_ArrowStar; break;
1204 }
1205 break;
1206
1207 case '*':
1208 if (post_op_name[1] == '\0')
1209 op_kind = OO_Star;
1210 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1211 op_kind = OO_StarEqual;
1212 break;
1213
1214 case '/':
1215 if (post_op_name[1] == '\0')
1216 op_kind = OO_Slash;
1217 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1218 op_kind = OO_SlashEqual;
1219 break;
1220
1221 case '%':
1222 if (post_op_name[1] == '\0')
1223 op_kind = OO_Percent;
1224 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1225 op_kind = OO_PercentEqual;
1226 break;
1227
1228
1229 case '^':
1230 if (post_op_name[1] == '\0')
1231 op_kind = OO_Caret;
1232 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1233 op_kind = OO_CaretEqual;
1234 break;
1235
1236 case '&':
1237 if (post_op_name[1] == '\0')
1238 op_kind = OO_Amp;
1239 else if (post_op_name[2] == '\0')
1240 {
1241 switch (post_op_name[1])
1242 {
1243 case '=': op_kind = OO_AmpEqual; break;
1244 case '&': op_kind = OO_AmpAmp; break;
1245 }
1246 }
1247 break;
1248
1249 case '|':
1250 if (post_op_name[1] == '\0')
1251 op_kind = OO_Pipe;
1252 else if (post_op_name[2] == '\0')
1253 {
1254 switch (post_op_name[1])
1255 {
1256 case '=': op_kind = OO_PipeEqual; break;
1257 case '|': op_kind = OO_PipePipe; break;
1258 }
1259 }
1260 break;
1261
1262 case '~':
1263 if (post_op_name[1] == '\0')
1264 op_kind = OO_Tilde;
1265 break;
1266
1267 case '!':
1268 if (post_op_name[1] == '\0')
1269 op_kind = OO_Exclaim;
1270 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1271 op_kind = OO_ExclaimEqual;
1272 break;
1273
1274 case '=':
1275 if (post_op_name[1] == '\0')
1276 op_kind = OO_Equal;
1277 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1278 op_kind = OO_EqualEqual;
1279 break;
1280
1281 case '<':
1282 if (post_op_name[1] == '\0')
1283 op_kind = OO_Less;
1284 else if (post_op_name[2] == '\0')
1285 {
1286 switch (post_op_name[1])
1287 {
1288 case '<': op_kind = OO_LessLess; break;
1289 case '=': op_kind = OO_LessEqual; break;
1290 }
1291 }
1292 else if (post_op_name[3] == '\0')
1293 {
1294 if (post_op_name[2] == '=')
1295 op_kind = OO_LessLessEqual;
1296 }
1297 break;
1298
1299 case '>':
1300 if (post_op_name[1] == '\0')
1301 op_kind = OO_Greater;
1302 else if (post_op_name[2] == '\0')
1303 {
1304 switch (post_op_name[1])
1305 {
1306 case '>': op_kind = OO_GreaterGreater; break;
1307 case '=': op_kind = OO_GreaterEqual; break;
1308 }
1309 }
1310 else if (post_op_name[1] == '>' &&
1311 post_op_name[2] == '=' &&
1312 post_op_name[3] == '\0')
1313 {
1314 op_kind = OO_GreaterGreaterEqual;
1315 }
1316 break;
1317
1318 case ',':
1319 if (post_op_name[1] == '\0')
1320 op_kind = OO_Comma;
1321 break;
1322
1323 case '(':
1324 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1325 op_kind = OO_Call;
1326 break;
1327
1328 case '[':
1329 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1330 op_kind = OO_Subscript;
1331 break;
1332 }
1333
1334 return true;
1335}
Greg Clayton6beaaa62011-01-17 03:46:26 +00001336
Greg Claytona51ed9b2010-09-23 01:09:21 +00001337CXXMethodDecl *
Sean Callanan61da09b2010-09-17 02:58:26 +00001338ClangASTContext::AddMethodToCXXRecordType
1339(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001340 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001341 clang_type_t record_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001342 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001343 clang_type_t method_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001344 lldb::AccessType access,
Greg Clayton0fffff52010-09-24 05:15:53 +00001345 bool is_virtual,
1346 bool is_static,
Greg Claytonf51de672010-10-01 02:31:07 +00001347 bool is_inline,
1348 bool is_explicit
Greg Claytona51ed9b2010-09-23 01:09:21 +00001349)
Sean Callanan61da09b2010-09-17 02:58:26 +00001350{
Sean Callananfc55f5d2010-09-21 00:44:12 +00001351 if (!record_opaque_type || !method_opaque_type || !name)
Johnny Chend440bcc2010-09-28 16:10:54 +00001352 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001353
Greg Clayton6beaaa62011-01-17 03:46:26 +00001354 assert(ast);
Sean Callanan61da09b2010-09-17 02:58:26 +00001355
Greg Clayton6beaaa62011-01-17 03:46:26 +00001356 IdentifierTable *identifier_table = &ast->Idents;
Sean Callanan61da09b2010-09-17 02:58:26 +00001357
1358 assert(identifier_table);
1359
Sean Callananfc55f5d2010-09-21 00:44:12 +00001360 QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00001361
Greg Clayton6beaaa62011-01-17 03:46:26 +00001362 CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
Sean Callanan61da09b2010-09-17 02:58:26 +00001363
Greg Clayton0fffff52010-09-24 05:15:53 +00001364 if (cxx_record_decl == NULL)
Greg Claytona51ed9b2010-09-23 01:09:21 +00001365 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001366
Greg Clayton0fffff52010-09-24 05:15:53 +00001367 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001368
Greg Claytonf51de672010-10-01 02:31:07 +00001369 CXXMethodDecl *cxx_method_decl = NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001370
Greg Claytonf51de672010-10-01 02:31:07 +00001371 DeclarationName decl_name (&identifier_table->get(name));
Greg Clayton878eaf12010-10-01 03:45:20 +00001372
Greg Clayton878eaf12010-10-01 03:45:20 +00001373 const bool is_implicitly_declared = false;
Greg Claytonf51de672010-10-01 02:31:07 +00001374
Sean Callanan78e37602011-01-27 04:42:51 +00001375 const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
Greg Clayton878eaf12010-10-01 03:45:20 +00001376
Greg Clayton90a2acd2010-10-02 01:40:05 +00001377 if (function_Type == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001378 return NULL;
1379
Sean Callanan78e37602011-01-27 04:42:51 +00001380 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
Greg Clayton878eaf12010-10-01 03:45:20 +00001381
1382 if (!method_function_prototype)
1383 return NULL;
1384
1385 unsigned int num_params = method_function_prototype->getNumArgs();
1386
1387 if (name[0] == '~')
Greg Claytonf51de672010-10-01 02:31:07 +00001388 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001389 cxx_method_decl = CXXDestructorDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001390 cxx_record_decl,
Greg Clayton6beaaa62011-01-17 03:46:26 +00001391 DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001392 method_qual_type,
Sean Callanan31e851c2010-10-29 18:38:40 +00001393 NULL,
Greg Clayton878eaf12010-10-01 03:45:20 +00001394 is_inline,
1395 is_implicitly_declared);
1396 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001397 else if (decl_name == cxx_record_decl->getDeclName())
Greg Clayton878eaf12010-10-01 03:45:20 +00001398 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001399 cxx_method_decl = CXXConstructorDecl::Create (*ast,
Greg Claytonf51de672010-10-01 02:31:07 +00001400 cxx_record_decl,
Greg Clayton6beaaa62011-01-17 03:46:26 +00001401 DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
Greg Claytonf51de672010-10-01 02:31:07 +00001402 method_qual_type,
1403 NULL, // TypeSourceInfo *
1404 is_explicit,
1405 is_inline,
1406 is_implicitly_declared);
1407 }
1408 else
Greg Clayton878eaf12010-10-01 03:45:20 +00001409 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001410
1411 OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1412 if (IsOperator (name, op_kind))
Greg Clayton878eaf12010-10-01 03:45:20 +00001413 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001414 if (op_kind != NUM_OVERLOADED_OPERATORS)
1415 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001416 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001417 cxx_record_decl,
Greg Clayton6beaaa62011-01-17 03:46:26 +00001418 DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001419 method_qual_type,
1420 NULL, // TypeSourceInfo *
Greg Claytona3c444a2010-10-01 23:13:49 +00001421 is_static,
1422 SC_None,
1423 is_inline);
1424 }
1425 else if (num_params == 0)
1426 {
1427 // Conversion operators don't take params...
Greg Clayton6beaaa62011-01-17 03:46:26 +00001428 cxx_method_decl = CXXConversionDecl::Create (*ast,
Greg Claytona3c444a2010-10-01 23:13:49 +00001429 cxx_record_decl,
Greg Clayton6beaaa62011-01-17 03:46:26 +00001430 DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
Greg Claytona3c444a2010-10-01 23:13:49 +00001431 method_qual_type,
1432 NULL, // TypeSourceInfo *
1433 is_inline,
1434 is_explicit);
1435 }
Greg Clayton878eaf12010-10-01 03:45:20 +00001436 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001437
1438 if (cxx_method_decl == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001439 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001440 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001441 cxx_record_decl,
Greg Claytona3c444a2010-10-01 23:13:49 +00001442 DeclarationNameInfo (decl_name, SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001443 method_qual_type,
1444 NULL, // TypeSourceInfo *
1445 is_static,
1446 SC_None,
1447 is_inline);
1448 }
Greg Claytonf51de672010-10-01 02:31:07 +00001449 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001450
Greg Clayton1be10fc2010-09-29 01:12:09 +00001451 AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
Greg Clayton0fffff52010-09-24 05:15:53 +00001452
1453 cxx_method_decl->setAccess (access_specifier);
1454 cxx_method_decl->setVirtualAsWritten (is_virtual);
Sean Callanane2ef6e32010-09-23 03:01:22 +00001455
Sean Callananfc55f5d2010-09-21 00:44:12 +00001456 // Populate the method decl with parameter decls
Sean Callananfc55f5d2010-09-21 00:44:12 +00001457
1458 ParmVarDecl *params[num_params];
1459
1460 for (int param_index = 0;
1461 param_index < num_params;
1462 ++param_index)
1463 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001464 params[param_index] = ParmVarDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00001465 cxx_method_decl,
1466 SourceLocation(),
1467 NULL, // anonymous
1468 method_function_prototype->getArgType(param_index),
1469 NULL,
1470 SC_None,
1471 SC_None,
1472 NULL);
Sean Callananfc55f5d2010-09-21 00:44:12 +00001473 }
1474
Greg Clayton0fffff52010-09-24 05:15:53 +00001475 cxx_method_decl->setParams (params, num_params);
Sean Callananfc55f5d2010-09-21 00:44:12 +00001476
Greg Clayton0fffff52010-09-24 05:15:53 +00001477 cxx_record_decl->addDecl (cxx_method_decl);
Greg Claytonc432c192011-01-20 04:18:48 +00001478
1479// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
1480// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
1481// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
1482// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
1483// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
1484// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
1485// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
1486// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
1487// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
Greg Claytona51ed9b2010-09-23 01:09:21 +00001488 return cxx_method_decl;
Sean Callanan61da09b2010-09-17 02:58:26 +00001489}
1490
1491bool
Greg Clayton8cf05932010-07-22 18:30:50 +00001492ClangASTContext::AddFieldToRecordType
1493(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001494 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001495 clang_type_t record_clang_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001496 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001497 clang_type_t field_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001498 AccessType access,
1499 uint32_t bitfield_bit_size
1500)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001501{
1502 if (record_clang_type == NULL || field_type == NULL)
1503 return false;
1504
Greg Clayton6beaaa62011-01-17 03:46:26 +00001505 IdentifierTable *identifier_table = &ast->Idents;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001506
Greg Clayton6beaaa62011-01-17 03:46:26 +00001507 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001508 assert (identifier_table != NULL);
1509
1510 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
1511
Sean Callanan78e37602011-01-27 04:42:51 +00001512 const clang::Type *clang_type = record_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001513 if (clang_type)
1514 {
1515 const RecordType *record_type = dyn_cast<RecordType>(clang_type);
1516
1517 if (record_type)
1518 {
1519 RecordDecl *record_decl = record_type->getDecl();
1520
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001521 clang::Expr *bit_width = NULL;
1522 if (bitfield_bit_size != 0)
1523 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001524 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1525 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001526 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001527 FieldDecl *field = FieldDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001528 record_decl,
1529 SourceLocation(),
1530 name ? &identifier_table->get(name) : NULL, // Identifier
1531 QualType::getFromOpaquePtr(field_type), // Field type
1532 NULL, // DeclaratorInfo *
1533 bit_width, // BitWidth
1534 false); // Mutable
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001535
Greg Clayton8cf05932010-07-22 18:30:50 +00001536 field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001537
1538 if (field)
1539 {
1540 record_decl->addDecl(field);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001541 }
1542 }
Greg Clayton9e409562010-07-28 02:04:09 +00001543 else
1544 {
Sean Callanan78e37602011-01-27 04:42:51 +00001545 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
Greg Clayton9e409562010-07-28 02:04:09 +00001546 if (objc_class_type)
1547 {
Greg Clayton0fffff52010-09-24 05:15:53 +00001548 bool is_synthesized = false;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001549 ClangASTContext::AddObjCClassIVar (ast,
Sean Callanan6e6a7c72010-09-16 20:01:08 +00001550 record_clang_type,
Greg Clayton9e409562010-07-28 02:04:09 +00001551 name,
1552 field_type,
1553 access,
1554 bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00001555 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00001556 }
1557 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001558 }
1559 return false;
1560}
1561
1562bool
1563ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1564{
1565 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1566}
1567
1568bool
1569ClangASTContext::FieldIsBitfield
1570(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001571 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001572 FieldDecl* field,
1573 uint32_t& bitfield_bit_size
1574)
1575{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001576 if (ast == NULL || field == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001577 return false;
1578
1579 if (field->isBitField())
1580 {
1581 Expr* bit_width_expr = field->getBitWidth();
1582 if (bit_width_expr)
1583 {
1584 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001585 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001586 {
1587 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1588 return true;
1589 }
1590 }
1591 }
1592 return false;
1593}
1594
1595bool
1596ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1597{
1598 if (record_decl == NULL)
1599 return false;
1600
1601 if (!record_decl->field_empty())
1602 return true;
1603
1604 // No fields, lets check this is a CXX record and check the base classes
1605 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1606 if (cxx_record_decl)
1607 {
1608 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1609 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1610 base_class != base_class_end;
1611 ++base_class)
1612 {
1613 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1614 if (RecordHasFields(base_class_decl))
1615 return true;
1616 }
1617 }
1618 return false;
1619}
1620
1621void
Greg Clayton6beaaa62011-01-17 03:46:26 +00001622ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001623{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001624 if (clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001625 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001626 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1627
Sean Callanan78e37602011-01-27 04:42:51 +00001628 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00001629 if (record_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001630 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001631 RecordDecl *record_decl = record_type->getDecl();
1632 if (record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001633 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001634 uint32_t field_idx;
1635 RecordDecl::field_iterator field, field_end;
1636 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
1637 field != field_end;
1638 ++field, ++field_idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001639 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001640 // If no accessibility was assigned, assign the correct one
1641 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
1642 field->setAccess ((AccessSpecifier)default_accessibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001643 }
1644 }
1645 }
1646 }
1647}
1648
1649#pragma mark C++ Base Classes
1650
1651CXXBaseSpecifier *
Greg Clayton1be10fc2010-09-29 01:12:09 +00001652ClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001653{
1654 if (base_class_type)
Greg Claytone6371122010-07-30 20:30:44 +00001655 return new CXXBaseSpecifier (SourceRange(),
1656 is_virtual,
1657 base_of_class,
1658 ConvertAccessTypeToAccessSpecifier (access),
Sean Callanan2c777c42011-01-18 23:32:05 +00001659 getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
1660 SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001661 return NULL;
1662}
1663
Greg Clayton0b42ac32010-07-02 01:29:13 +00001664void
1665ClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1666{
1667 for (unsigned i=0; i<num_base_classes; ++i)
1668 {
1669 delete base_classes[i];
1670 base_classes[i] = NULL;
1671 }
1672}
1673
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001674bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00001675ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001676{
1677 if (class_clang_type)
1678 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001679 CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
1680 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001681 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001682 cxx_record_decl->setBases(base_classes, num_base_classes);
1683 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001684 }
1685 }
1686 return false;
1687}
Greg Clayton8cf05932010-07-22 18:30:50 +00001688#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001689
Greg Clayton1be10fc2010-09-29 01:12:09 +00001690clang_type_t
Greg Clayton8cf05932010-07-22 18:30:50 +00001691ClangASTContext::CreateObjCClass
1692(
1693 const char *name,
1694 DeclContext *decl_ctx,
1695 bool isForwardDecl,
1696 bool isInternal
1697)
1698{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001699 ASTContext *ast = getASTContext();
1700 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00001701 assert (name && name[0]);
1702 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001703 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00001704
1705 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1706 // we will need to update this code. I was told to currently always use
1707 // the CXXRecordDecl class since we often don't know from debug information
1708 // if something is struct or a class, so we default to always use the more
1709 // complete definition just in case.
Greg Clayton6beaaa62011-01-17 03:46:26 +00001710 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001711 decl_ctx,
1712 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001713 &ast->Idents.get(name),
Greg Clayton8cf05932010-07-22 18:30:50 +00001714 SourceLocation(),
1715 isForwardDecl,
1716 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00001717
Greg Clayton6beaaa62011-01-17 03:46:26 +00001718 return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00001719}
1720
1721bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00001722ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
Greg Clayton8cf05932010-07-22 18:30:50 +00001723{
1724 if (class_opaque_type && super_opaque_type)
1725 {
1726 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
1727 QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
Sean Callanan78e37602011-01-27 04:42:51 +00001728 const clang::Type *class_type = class_qual_type.getTypePtr();
1729 const clang::Type *super_type = super_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00001730 if (class_type && super_type)
1731 {
Sean Callanan78e37602011-01-27 04:42:51 +00001732 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
1733 const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00001734 if (objc_class_type && objc_super_type)
1735 {
1736 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1737 ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
1738 if (class_interface_decl && super_interface_decl)
1739 {
1740 class_interface_decl->setSuperClass(super_interface_decl);
1741 return true;
1742 }
1743 }
1744 }
1745 }
1746 return false;
1747}
1748
1749
1750bool
1751ClangASTContext::AddObjCClassIVar
1752(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001753 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001754 clang_type_t class_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001755 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001756 clang_type_t ivar_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001757 AccessType access,
1758 uint32_t bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00001759 bool is_synthesized
Greg Clayton8cf05932010-07-22 18:30:50 +00001760)
1761{
1762 if (class_opaque_type == NULL || ivar_opaque_type == NULL)
1763 return false;
1764
Greg Clayton6beaaa62011-01-17 03:46:26 +00001765 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton8cf05932010-07-22 18:30:50 +00001766
Greg Clayton6beaaa62011-01-17 03:46:26 +00001767 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00001768 assert (identifier_table != NULL);
1769
1770 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
1771
Sean Callanan78e37602011-01-27 04:42:51 +00001772 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00001773 if (class_type)
1774 {
Sean Callanan78e37602011-01-27 04:42:51 +00001775 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00001776
1777 if (objc_class_type)
1778 {
1779 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1780
1781 if (class_interface_decl)
1782 {
1783 clang::Expr *bit_width = NULL;
1784 if (bitfield_bit_size != 0)
1785 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001786 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1787 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Greg Clayton8cf05932010-07-22 18:30:50 +00001788 }
1789
Greg Clayton6beaaa62011-01-17 03:46:26 +00001790 ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast,
Greg Clayton9e409562010-07-28 02:04:09 +00001791 class_interface_decl,
1792 SourceLocation(),
1793 &identifier_table->get(name), // Identifier
1794 QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
1795 NULL, // TypeSourceInfo *
1796 ConvertAccessTypeToObjCIvarAccessControl (access),
1797 bit_width,
Greg Clayton0fffff52010-09-24 05:15:53 +00001798 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00001799
1800 if (field)
1801 {
1802 class_interface_decl->addDecl(field);
1803 return true;
1804 }
Greg Clayton8cf05932010-07-22 18:30:50 +00001805 }
1806 }
1807 }
1808 return false;
1809}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001810
Greg Clayton9e409562010-07-28 02:04:09 +00001811
1812bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00001813ClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
Greg Clayton9e409562010-07-28 02:04:09 +00001814{
1815 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
1816
Sean Callanan78e37602011-01-27 04:42:51 +00001817 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton9e409562010-07-28 02:04:09 +00001818 if (class_type)
1819 {
Sean Callanan78e37602011-01-27 04:42:51 +00001820 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton9e409562010-07-28 02:04:09 +00001821
1822 if (objc_class_type)
1823 return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
1824 }
1825 return false;
1826}
1827
1828bool
1829ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
1830{
1831 while (class_interface_decl)
1832 {
1833 if (class_interface_decl->ivar_size() > 0)
1834 return true;
1835
1836 if (check_superclass)
1837 class_interface_decl = class_interface_decl->getSuperClass();
1838 else
1839 break;
1840 }
1841 return false;
1842}
Greg Clayton0fffff52010-09-24 05:15:53 +00001843
Greg Clayton1be10fc2010-09-29 01:12:09 +00001844ObjCMethodDecl *
Greg Clayton0fffff52010-09-24 05:15:53 +00001845ClangASTContext::AddMethodToObjCObjectType
1846(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001847 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001848 clang_type_t class_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00001849 const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
Greg Clayton1be10fc2010-09-29 01:12:09 +00001850 clang_type_t method_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00001851 lldb::AccessType access
1852)
1853{
1854 if (class_opaque_type == NULL || method_opaque_type == NULL)
1855 return NULL;
1856
Greg Clayton6beaaa62011-01-17 03:46:26 +00001857 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton0fffff52010-09-24 05:15:53 +00001858
Greg Clayton6beaaa62011-01-17 03:46:26 +00001859 assert (ast != NULL);
Greg Clayton0fffff52010-09-24 05:15:53 +00001860 assert (identifier_table != NULL);
1861
1862 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
1863
Sean Callanan78e37602011-01-27 04:42:51 +00001864 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton0fffff52010-09-24 05:15:53 +00001865 if (class_type == NULL)
1866 return NULL;
1867
Sean Callanan78e37602011-01-27 04:42:51 +00001868 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton0fffff52010-09-24 05:15:53 +00001869
1870 if (objc_class_type == NULL)
1871 return NULL;
1872
1873 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1874
1875 if (class_interface_decl == NULL)
1876 return NULL;
Greg Clayton9e409562010-07-28 02:04:09 +00001877
Greg Clayton0fffff52010-09-24 05:15:53 +00001878 const char *selector_start = ::strchr (name, ' ');
1879 if (selector_start == NULL)
1880 return NULL;
1881
1882 selector_start++;
1883 if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
1884 return NULL;
1885 llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
1886
Greg Clayton450e3f32010-10-12 02:24:53 +00001887 size_t len = 0;
Greg Clayton0fffff52010-09-24 05:15:53 +00001888 const char *start;
Greg Clayton450e3f32010-10-12 02:24:53 +00001889 //printf ("name = '%s'\n", name);
1890
1891 unsigned num_selectors_with_args = 0;
1892 for (start = selector_start;
Greg Clayton0fffff52010-09-24 05:15:53 +00001893 start && *start != '\0' && *start != ']';
Greg Clayton450e3f32010-10-12 02:24:53 +00001894 start += len)
Greg Clayton0fffff52010-09-24 05:15:53 +00001895 {
Greg Clayton450e3f32010-10-12 02:24:53 +00001896 len = ::strcspn(start, ":]");
Greg Clayton90f90cd2010-10-27 04:01:14 +00001897 bool has_arg = (start[len] == ':');
1898 if (has_arg)
Greg Clayton450e3f32010-10-12 02:24:53 +00001899 ++num_selectors_with_args;
Greg Clayton0fffff52010-09-24 05:15:53 +00001900 selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
Greg Clayton90f90cd2010-10-27 04:01:14 +00001901 if (has_arg)
1902 len += 1;
Greg Clayton0fffff52010-09-24 05:15:53 +00001903 }
1904
1905
1906 if (selector_idents.size() == 0)
1907 return 0;
1908
Greg Clayton6beaaa62011-01-17 03:46:26 +00001909 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
Greg Clayton0fffff52010-09-24 05:15:53 +00001910 selector_idents.data());
1911
1912 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
1913
1914 // Populate the method decl with parameter decls
Sean Callanan78e37602011-01-27 04:42:51 +00001915 const clang::Type *method_type(method_qual_type.getTypePtr());
Greg Clayton0fffff52010-09-24 05:15:53 +00001916
1917 if (method_type == NULL)
1918 return NULL;
1919
Sean Callanan78e37602011-01-27 04:42:51 +00001920 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00001921
1922 if (!method_function_prototype)
1923 return NULL;
1924
1925
1926 bool is_variadic = false;
1927 bool is_synthesized = false;
1928 bool is_defined = false;
1929 ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
1930
1931 const unsigned num_args = method_function_prototype->getNumArgs();
1932
Greg Clayton6beaaa62011-01-17 03:46:26 +00001933 ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00001934 SourceLocation(), // beginLoc,
1935 SourceLocation(), // endLoc,
1936 method_selector,
1937 method_function_prototype->getResultType(),
1938 NULL, // TypeSourceInfo *ResultTInfo,
1939 GetDeclContextForType (class_opaque_type),
1940 name[0] == '-',
1941 is_variadic,
1942 is_synthesized,
1943 is_defined,
1944 imp_control,
1945 num_args);
1946
1947
1948 if (objc_method_decl == NULL)
1949 return NULL;
1950
1951 if (num_args > 0)
1952 {
1953 llvm::SmallVector<ParmVarDecl *, 12> params;
1954
1955 for (int param_index = 0; param_index < num_args; ++param_index)
1956 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001957 params.push_back (ParmVarDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00001958 objc_method_decl,
1959 SourceLocation(),
1960 NULL, // anonymous
1961 method_function_prototype->getArgType(param_index),
1962 NULL,
1963 SC_Auto,
1964 SC_Auto,
1965 NULL));
1966 }
1967
Greg Clayton6beaaa62011-01-17 03:46:26 +00001968 objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args);
Greg Clayton0fffff52010-09-24 05:15:53 +00001969 }
1970
1971 class_interface_decl->addDecl (objc_method_decl);
1972
1973
1974 return objc_method_decl;
1975}
1976
1977
Greg Clayton8f92f0a2010-10-14 22:52:14 +00001978uint32_t
Greg Clayton73b472d2010-10-27 03:32:59 +00001979ClangASTContext::GetTypeInfo
1980(
1981 clang_type_t clang_type,
Greg Clayton6beaaa62011-01-17 03:46:26 +00001982 clang::ASTContext *ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00001983 clang_type_t *pointee_or_element_clang_type
1984)
Greg Clayton8f92f0a2010-10-14 22:52:14 +00001985{
1986 if (clang_type == NULL)
Greg Clayton73b472d2010-10-27 03:32:59 +00001987 return 0;
1988
1989 if (pointee_or_element_clang_type)
1990 *pointee_or_element_clang_type = NULL;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00001991
1992 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1993
1994 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1995 switch (type_class)
1996 {
Sean Callanana2424172010-10-25 00:29:48 +00001997 case clang::Type::Builtin:
1998 switch (cast<clang::BuiltinType>(qual_type)->getKind())
1999 {
Sean Callanana2424172010-10-25 00:29:48 +00002000 case clang::BuiltinType::ObjCId:
2001 case clang::BuiltinType::ObjCClass:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002002 if (ast && pointee_or_element_clang_type)
2003 *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Sean Callanana2424172010-10-25 00:29:48 +00002004 return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002005
2006 default:
2007 break;
Sean Callanana2424172010-10-25 00:29:48 +00002008 }
2009 return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002010
2011 case clang::Type::BlockPointer:
2012 if (pointee_or_element_clang_type)
2013 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2014 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2015
Greg Clayton49462ea2011-01-15 02:52:14 +00002016 case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002017
2018 case clang::Type::ConstantArray:
2019 case clang::Type::DependentSizedArray:
2020 case clang::Type::IncompleteArray:
2021 case clang::Type::VariableArray:
2022 if (pointee_or_element_clang_type)
2023 *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2024 return eTypeHasChildren | eTypeIsArray;
2025
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002026 case clang::Type::DependentName: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002027 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
2028 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
2029 case clang::Type::Decltype: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002030
2031 case clang::Type::Enum:
2032 if (pointee_or_element_clang_type)
2033 *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2034 return eTypeIsEnumeration | eTypeHasValue;
2035
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002036 case clang::Type::Elaborated: return 0;
2037 case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector;
2038 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
2039 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002040 case clang::Type::InjectedClassName: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002041
2042 case clang::Type::LValueReference:
2043 case clang::Type::RValueReference:
2044 if (pointee_or_element_clang_type)
2045 *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2046 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2047
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002048 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002049
2050 case clang::Type::ObjCObjectPointer:
2051 if (pointee_or_element_clang_type)
2052 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2053 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2054
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002055 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2056 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
Greg Clayton73b472d2010-10-27 03:32:59 +00002057
2058 case clang::Type::Pointer:
2059 if (pointee_or_element_clang_type)
2060 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2061 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2062
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002063 case clang::Type::Record:
2064 if (qual_type->getAsCXXRecordDecl())
2065 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2066 else
2067 return eTypeHasChildren | eTypeIsStructUnion;
2068 break;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002069 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
2070 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
2071 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
Greg Clayton73b472d2010-10-27 03:32:59 +00002072
2073 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002074 return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00002075 ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002076 pointee_or_element_clang_type);
2077
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002078 case clang::Type::TypeOfExpr: return 0;
2079 case clang::Type::TypeOf: return 0;
2080 case clang::Type::UnresolvedUsing: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002081 case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector;
2082 default: return 0;
2083 }
2084 return 0;
2085}
2086
Greg Clayton9e409562010-07-28 02:04:09 +00002087
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002088#pragma mark Aggregate Types
2089
2090bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002091ClangASTContext::IsAggregateType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002092{
2093 if (clang_type == NULL)
2094 return false;
2095
2096 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2097
Greg Clayton737b9322010-09-13 03:32:57 +00002098 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2099 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002100 {
Greg Claytone1a916a2010-07-21 22:12:05 +00002101 case clang::Type::IncompleteArray:
2102 case clang::Type::VariableArray:
2103 case clang::Type::ConstantArray:
2104 case clang::Type::ExtVector:
2105 case clang::Type::Vector:
2106 case clang::Type::Record:
Greg Clayton9e409562010-07-28 02:04:09 +00002107 case clang::Type::ObjCObject:
2108 case clang::Type::ObjCInterface:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002109 return true;
2110
Greg Claytone1a916a2010-07-21 22:12:05 +00002111 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002112 return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002113
2114 default:
2115 break;
2116 }
2117 // The clang type does have a value
2118 return false;
2119}
2120
2121uint32_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00002122ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002123{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002124 if (clang_type == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002125 return 0;
2126
2127 uint32_t num_children = 0;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002128 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00002129 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2130 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002131 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002132 case clang::Type::Builtin:
2133 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2134 {
Greg Clayton73b472d2010-10-27 03:32:59 +00002135 case clang::BuiltinType::ObjCId: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002136 case clang::BuiltinType::ObjCClass: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002137 num_children = 1;
Greg Clayton73b472d2010-10-27 03:32:59 +00002138 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002139
2140 default:
2141 break;
2142 }
2143 break;
Greg Clayton54979cd2010-12-15 05:08:08 +00002144
Greg Clayton49462ea2011-01-15 02:52:14 +00002145 case clang::Type::Complex: return 0;
Greg Clayton54979cd2010-12-15 05:08:08 +00002146
Greg Claytone1a916a2010-07-21 22:12:05 +00002147 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00002148 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002149 {
2150 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
2151 const RecordDecl *record_decl = record_type->getDecl();
2152 assert(record_decl);
2153 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2154 if (cxx_record_decl)
2155 {
2156 if (omit_empty_base_classes)
2157 {
2158 // Check each base classes to see if it or any of its
2159 // base classes contain any fields. This can help
2160 // limit the noise in variable views by not having to
2161 // show base classes that contain no members.
2162 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2163 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2164 base_class != base_class_end;
2165 ++base_class)
2166 {
2167 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2168
2169 // Skip empty base classes
2170 if (RecordHasFields(base_class_decl) == false)
2171 continue;
2172
2173 num_children++;
2174 }
2175 }
2176 else
2177 {
2178 // Include all base classes
2179 num_children += cxx_record_decl->getNumBases();
2180 }
2181
2182 }
2183 RecordDecl::field_iterator field, field_end;
2184 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
2185 ++num_children;
2186 }
2187 break;
2188
Greg Clayton9e409562010-07-28 02:04:09 +00002189 case clang::Type::ObjCObject:
2190 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00002191 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00002192 {
Sean Callanan78e37602011-01-27 04:42:51 +00002193 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002194 assert (objc_class_type);
2195 if (objc_class_type)
2196 {
2197 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2198
2199 if (class_interface_decl)
2200 {
2201
2202 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
2203 if (superclass_interface_decl)
2204 {
2205 if (omit_empty_base_classes)
2206 {
2207 if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
2208 ++num_children;
2209 }
2210 else
2211 ++num_children;
2212 }
2213
2214 num_children += class_interface_decl->ivar_size();
2215 }
2216 }
2217 }
2218 break;
2219
2220 case clang::Type::ObjCObjectPointer:
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002221 {
Sean Callanan78e37602011-01-27 04:42:51 +00002222 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002223 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00002224 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2225 pointee_type.getAsOpaquePtr(),
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002226 omit_empty_base_classes);
2227 // If this type points to a simple type, then it has 1 child
2228 if (num_pointee_children == 0)
2229 num_children = 1;
2230 else
2231 num_children = num_pointee_children;
2232 }
2233 break;
Greg Clayton9e409562010-07-28 02:04:09 +00002234
Greg Claytone1a916a2010-07-21 22:12:05 +00002235 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002236 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
2237 break;
2238
Greg Claytone1a916a2010-07-21 22:12:05 +00002239 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002240 {
Sean Callanan78e37602011-01-27 04:42:51 +00002241 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Greg Clayton54979cd2010-12-15 05:08:08 +00002242 QualType pointee_type (pointer_type->getPointeeType());
Greg Clayton6beaaa62011-01-17 03:46:26 +00002243 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2244 pointee_type.getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00002245 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002246 if (num_pointee_children == 0)
Greg Clayton54979cd2010-12-15 05:08:08 +00002247 {
2248 // We have a pointer to a pointee type that claims it has no children.
2249 // We will want to look at
2250 num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
2251 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002252 else
2253 num_children = num_pointee_children;
2254 }
2255 break;
2256
Greg Clayton73b472d2010-10-27 03:32:59 +00002257 case clang::Type::LValueReference:
2258 case clang::Type::RValueReference:
2259 {
Sean Callanan78e37602011-01-27 04:42:51 +00002260 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00002261 QualType pointee_type = reference_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00002262 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2263 pointee_type.getAsOpaquePtr(),
Greg Clayton73b472d2010-10-27 03:32:59 +00002264 omit_empty_base_classes);
2265 // If this type points to a simple type, then it has 1 child
2266 if (num_pointee_children == 0)
2267 num_children = 1;
2268 else
2269 num_children = num_pointee_children;
2270 }
2271 break;
2272
2273
Greg Claytone1a916a2010-07-21 22:12:05 +00002274 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002275 num_children = ClangASTContext::GetNumChildren (ast,
2276 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2277 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002278 break;
2279
2280 default:
2281 break;
2282 }
2283 return num_children;
2284}
2285
Greg Clayton54979cd2010-12-15 05:08:08 +00002286// If a pointer to a pointee type (the clang_type arg) says that it has no
2287// children, then we either need to trust it, or override it and return a
2288// different result. For example, an "int *" has one child that is an integer,
2289// but a function pointer doesn't have any children. Likewise if a Record type
2290// claims it has no children, then there really is nothing to show.
2291uint32_t
2292ClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
2293{
2294 if (clang_type == NULL)
2295 return 0;
2296
2297 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2298 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2299 switch (type_class)
2300 {
Greg Clayton97a43712011-01-08 22:26:47 +00002301 case clang::Type::Builtin:
2302 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2303 {
2304 case clang::BuiltinType::Void:
2305 case clang::BuiltinType::NullPtr:
2306 return 0;
2307 case clang::BuiltinType::Bool:
2308 case clang::BuiltinType::Char_U:
2309 case clang::BuiltinType::UChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00002310 case clang::BuiltinType::WChar_U:
Greg Clayton97a43712011-01-08 22:26:47 +00002311 case clang::BuiltinType::Char16:
2312 case clang::BuiltinType::Char32:
2313 case clang::BuiltinType::UShort:
2314 case clang::BuiltinType::UInt:
2315 case clang::BuiltinType::ULong:
2316 case clang::BuiltinType::ULongLong:
2317 case clang::BuiltinType::UInt128:
2318 case clang::BuiltinType::Char_S:
2319 case clang::BuiltinType::SChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00002320 case clang::BuiltinType::WChar_S:
Greg Clayton97a43712011-01-08 22:26:47 +00002321 case clang::BuiltinType::Short:
2322 case clang::BuiltinType::Int:
2323 case clang::BuiltinType::Long:
2324 case clang::BuiltinType::LongLong:
2325 case clang::BuiltinType::Int128:
2326 case clang::BuiltinType::Float:
2327 case clang::BuiltinType::Double:
2328 case clang::BuiltinType::LongDouble:
2329 case clang::BuiltinType::Dependent:
2330 case clang::BuiltinType::Overload:
2331 case clang::BuiltinType::UndeducedAuto:
2332 case clang::BuiltinType::ObjCId:
2333 case clang::BuiltinType::ObjCClass:
2334 case clang::BuiltinType::ObjCSel:
2335 return 1;
2336 }
2337 break;
2338
Greg Clayton49462ea2011-01-15 02:52:14 +00002339 case clang::Type::Complex: return 1;
Greg Clayton54979cd2010-12-15 05:08:08 +00002340 case clang::Type::Pointer: return 1;
2341 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
2342 case clang::Type::LValueReference: return 1;
2343 case clang::Type::RValueReference: return 1;
2344 case clang::Type::MemberPointer: return 0;
2345 case clang::Type::ConstantArray: return 0;
2346 case clang::Type::IncompleteArray: return 0;
2347 case clang::Type::VariableArray: return 0;
2348 case clang::Type::DependentSizedArray: return 0;
2349 case clang::Type::DependentSizedExtVector: return 0;
2350 case clang::Type::Vector: return 0;
2351 case clang::Type::ExtVector: return 0;
2352 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
2353 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
2354 case clang::Type::UnresolvedUsing: return 0;
2355 case clang::Type::Paren: return 0;
2356 case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2357 case clang::Type::TypeOfExpr: return 0;
2358 case clang::Type::TypeOf: return 0;
2359 case clang::Type::Decltype: return 0;
2360 case clang::Type::Record: return 0;
2361 case clang::Type::Enum: return 1;
2362 case clang::Type::Elaborated: return 1;
2363 case clang::Type::TemplateTypeParm: return 1;
2364 case clang::Type::SubstTemplateTypeParm: return 1;
2365 case clang::Type::TemplateSpecialization: return 1;
2366 case clang::Type::InjectedClassName: return 0;
2367 case clang::Type::DependentName: return 1;
2368 case clang::Type::DependentTemplateSpecialization: return 1;
2369 case clang::Type::ObjCObject: return 0;
2370 case clang::Type::ObjCInterface: return 0;
2371 case clang::Type::ObjCObjectPointer: return 1;
2372 default:
2373 break;
2374 }
2375 return 0;
2376}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002377
Greg Clayton1be10fc2010-09-29 01:12:09 +00002378clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002379ClangASTContext::GetChildClangTypeAtIndex
2380(
2381 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002382 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002383 uint32_t idx,
2384 bool transparent_pointers,
2385 bool omit_empty_base_classes,
2386 std::string& child_name,
2387 uint32_t &child_byte_size,
2388 int32_t &child_byte_offset,
2389 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002390 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002391 bool &child_is_base_class,
2392 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002393)
2394{
2395 if (parent_clang_type)
2396
2397 return GetChildClangTypeAtIndex (getASTContext(),
2398 parent_name,
2399 parent_clang_type,
2400 idx,
2401 transparent_pointers,
2402 omit_empty_base_classes,
2403 child_name,
2404 child_byte_size,
2405 child_byte_offset,
2406 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002407 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002408 child_is_base_class,
2409 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002410 return NULL;
2411}
2412
Greg Clayton1be10fc2010-09-29 01:12:09 +00002413clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002414ClangASTContext::GetChildClangTypeAtIndex
2415(
Greg Clayton6beaaa62011-01-17 03:46:26 +00002416 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002417 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002418 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002419 uint32_t idx,
2420 bool transparent_pointers,
2421 bool omit_empty_base_classes,
2422 std::string& child_name,
2423 uint32_t &child_byte_size,
2424 int32_t &child_byte_offset,
2425 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002426 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002427 bool &child_is_base_class,
2428 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002429)
2430{
2431 if (parent_clang_type == NULL)
2432 return NULL;
2433
Greg Clayton6beaaa62011-01-17 03:46:26 +00002434 if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002435 {
2436 uint32_t bit_offset;
2437 child_bitfield_bit_size = 0;
2438 child_bitfield_bit_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002439 child_is_base_class = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002440 QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00002441 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
2442 switch (parent_type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002443 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002444 case clang::Type::Builtin:
2445 switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
2446 {
2447 case clang::BuiltinType::ObjCId:
2448 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00002449 child_name = "isa";
Greg Clayton6beaaa62011-01-17 03:46:26 +00002450 child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
2451 return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002452
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002453 default:
2454 break;
2455 }
2456 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002457
Greg Claytone1a916a2010-07-21 22:12:05 +00002458 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00002459 if (GetCompleteQualType (ast, parent_qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002460 {
2461 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
2462 const RecordDecl *record_decl = record_type->getDecl();
2463 assert(record_decl);
Greg Clayton6beaaa62011-01-17 03:46:26 +00002464 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002465 uint32_t child_idx = 0;
2466
2467 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2468 if (cxx_record_decl)
2469 {
2470 // We might have base classes to print out first
2471 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2472 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2473 base_class != base_class_end;
2474 ++base_class)
2475 {
2476 const CXXRecordDecl *base_class_decl = NULL;
2477
2478 // Skip empty base classes
2479 if (omit_empty_base_classes)
2480 {
2481 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2482 if (RecordHasFields(base_class_decl) == false)
2483 continue;
2484 }
2485
2486 if (idx == child_idx)
2487 {
2488 if (base_class_decl == NULL)
2489 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2490
2491
2492 if (base_class->isVirtual())
Greg Clayton6ed95942011-01-22 07:12:45 +00002493 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002494 else
Greg Clayton6ed95942011-01-22 07:12:45 +00002495 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002496
2497 // Base classes should be a multiple of 8 bits in size
2498 assert (bit_offset % 8 == 0);
2499 child_byte_offset = bit_offset/8;
2500 std::string base_class_type_name(base_class->getType().getAsString());
2501
2502 child_name.assign(base_class_type_name.c_str());
2503
Greg Clayton6beaaa62011-01-17 03:46:26 +00002504 uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002505
2506 // Base classes biut sizes should be a multiple of 8 bits in size
2507 assert (clang_type_info_bit_size % 8 == 0);
2508 child_byte_size = clang_type_info_bit_size / 8;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002509 child_is_base_class = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002510 return base_class->getType().getAsOpaquePtr();
2511 }
2512 // We don't increment the child index in the for loop since we might
2513 // be skipping empty base classes
2514 ++child_idx;
2515 }
2516 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002517 // Make sure index is in range...
2518 uint32_t field_idx = 0;
2519 RecordDecl::field_iterator field, field_end;
2520 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
2521 {
2522 if (idx == child_idx)
2523 {
2524 // Print the member type if requested
2525 // Print the member name and equal sign
2526 child_name.assign(field->getNameAsString().c_str());
2527
2528 // Figure out the type byte size (field_type_info.first) and
2529 // alignment (field_type_info.second) from the AST context.
Greg Clayton6beaaa62011-01-17 03:46:26 +00002530 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
Greg Claytonc982c762010-07-09 20:39:50 +00002531 assert(field_idx < record_layout.getFieldCount());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002532
2533 child_byte_size = field_type_info.first / 8;
2534
2535 // Figure out the field offset within the current struct/union/class type
2536 bit_offset = record_layout.getFieldOffset (field_idx);
2537 child_byte_offset = bit_offset / 8;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002538 if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002539 child_bitfield_bit_offset = bit_offset % 8;
2540
2541 return field->getType().getAsOpaquePtr();
2542 }
2543 }
2544 }
2545 break;
2546
Greg Clayton9e409562010-07-28 02:04:09 +00002547 case clang::Type::ObjCObject:
2548 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00002549 if (GetCompleteQualType (ast, parent_qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00002550 {
Sean Callanan78e37602011-01-27 04:42:51 +00002551 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002552 assert (objc_class_type);
2553 if (objc_class_type)
2554 {
2555 uint32_t child_idx = 0;
2556 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2557
2558 if (class_interface_decl)
2559 {
2560
Greg Clayton6beaaa62011-01-17 03:46:26 +00002561 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Clayton9e409562010-07-28 02:04:09 +00002562 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
2563 if (superclass_interface_decl)
2564 {
2565 if (omit_empty_base_classes)
2566 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002567 if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
Greg Clayton9e409562010-07-28 02:04:09 +00002568 {
2569 if (idx == 0)
2570 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002571 QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
Greg Clayton9e409562010-07-28 02:04:09 +00002572
2573
2574 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
2575
Greg Clayton6beaaa62011-01-17 03:46:26 +00002576 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002577
2578 child_byte_size = ivar_type_info.first / 8;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002579 child_byte_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002580 child_is_base_class = true;
Greg Clayton9e409562010-07-28 02:04:09 +00002581
2582 return ivar_qual_type.getAsOpaquePtr();
2583 }
2584
2585 ++child_idx;
2586 }
2587 }
2588 else
2589 ++child_idx;
2590 }
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002591
2592 const uint32_t superclass_idx = child_idx;
Greg Clayton9e409562010-07-28 02:04:09 +00002593
2594 if (idx < (child_idx + class_interface_decl->ivar_size()))
2595 {
2596 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
2597
2598 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
2599 {
2600 if (child_idx == idx)
2601 {
2602 const ObjCIvarDecl* ivar_decl = *ivar_pos;
2603
2604 QualType ivar_qual_type(ivar_decl->getType());
2605
2606 child_name.assign(ivar_decl->getNameAsString().c_str());
2607
Greg Clayton6beaaa62011-01-17 03:46:26 +00002608 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002609
2610 child_byte_size = ivar_type_info.first / 8;
2611
2612 // Figure out the field offset within the current struct/union/class type
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002613 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
Greg Clayton9e409562010-07-28 02:04:09 +00002614 child_byte_offset = bit_offset / 8;
2615
2616 return ivar_qual_type.getAsOpaquePtr();
2617 }
2618 ++child_idx;
2619 }
2620 }
2621 }
2622 }
2623 }
2624 break;
2625
2626 case clang::Type::ObjCObjectPointer:
2627 {
Sean Callanan78e37602011-01-27 04:42:51 +00002628 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002629 QualType pointee_type = pointer_type->getPointeeType();
2630
2631 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2632 {
Greg Claytone221f822011-01-21 01:59:00 +00002633 child_is_deref_of_parent = false;
2634 bool tmp_child_is_deref_of_parent = false;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002635 return GetChildClangTypeAtIndex (ast,
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002636 parent_name,
2637 pointer_type->getPointeeType().getAsOpaquePtr(),
2638 idx,
2639 transparent_pointers,
2640 omit_empty_base_classes,
2641 child_name,
2642 child_byte_size,
2643 child_byte_offset,
2644 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002645 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002646 child_is_base_class,
2647 tmp_child_is_deref_of_parent);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002648 }
2649 else
2650 {
Greg Claytone221f822011-01-21 01:59:00 +00002651 child_is_deref_of_parent = true;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002652 if (parent_name)
2653 {
2654 child_name.assign(1, '*');
2655 child_name += parent_name;
2656 }
2657
2658 // We have a pointer to an simple type
2659 if (idx == 0)
2660 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002661 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002662 assert(clang_type_info.first % 8 == 0);
2663 child_byte_size = clang_type_info.first / 8;
2664 child_byte_offset = 0;
2665 return pointee_type.getAsOpaquePtr();
2666 }
2667 }
Greg Clayton9e409562010-07-28 02:04:09 +00002668 }
2669 break;
2670
Greg Claytone1a916a2010-07-21 22:12:05 +00002671 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002672 {
2673 const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
2674 const uint64_t element_count = array->getSize().getLimitedValue();
2675
2676 if (idx < element_count)
2677 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002678 if (GetCompleteQualType (ast, array->getElementType()))
2679 {
2680 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002681
Greg Clayton6beaaa62011-01-17 03:46:26 +00002682 char element_name[64];
2683 ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002684
Greg Clayton6beaaa62011-01-17 03:46:26 +00002685 child_name.assign(element_name);
2686 assert(field_type_info.first % 8 == 0);
2687 child_byte_size = field_type_info.first / 8;
2688 child_byte_offset = idx * child_byte_size;
2689 return array->getElementType().getAsOpaquePtr();
2690 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002691 }
2692 }
2693 break;
2694
Greg Claytone1a916a2010-07-21 22:12:05 +00002695 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002696 {
Sean Callanan78e37602011-01-27 04:42:51 +00002697 const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002698 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton97a43712011-01-08 22:26:47 +00002699
2700 // Don't dereference "void *" pointers
2701 if (pointee_type->isVoidType())
2702 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002703
2704 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2705 {
Greg Claytone221f822011-01-21 01:59:00 +00002706 child_is_deref_of_parent = false;
2707 bool tmp_child_is_deref_of_parent = false;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002708 return GetChildClangTypeAtIndex (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002709 parent_name,
2710 pointer_type->getPointeeType().getAsOpaquePtr(),
2711 idx,
2712 transparent_pointers,
2713 omit_empty_base_classes,
2714 child_name,
2715 child_byte_size,
2716 child_byte_offset,
2717 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002718 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002719 child_is_base_class,
2720 tmp_child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002721 }
2722 else
2723 {
Greg Claytone221f822011-01-21 01:59:00 +00002724 child_is_deref_of_parent = true;
2725
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002726 if (parent_name)
2727 {
2728 child_name.assign(1, '*');
2729 child_name += parent_name;
2730 }
2731
2732 // We have a pointer to an simple type
2733 if (idx == 0)
2734 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002735 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002736 assert(clang_type_info.first % 8 == 0);
2737 child_byte_size = clang_type_info.first / 8;
2738 child_byte_offset = 0;
2739 return pointee_type.getAsOpaquePtr();
2740 }
2741 }
2742 }
2743 break;
2744
Greg Clayton73b472d2010-10-27 03:32:59 +00002745 case clang::Type::LValueReference:
2746 case clang::Type::RValueReference:
2747 {
Sean Callanan78e37602011-01-27 04:42:51 +00002748 const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00002749 QualType pointee_type(reference_type->getPointeeType());
2750 clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
2751 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
2752 {
Greg Claytone221f822011-01-21 01:59:00 +00002753 child_is_deref_of_parent = false;
2754 bool tmp_child_is_deref_of_parent = false;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002755 return GetChildClangTypeAtIndex (ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002756 parent_name,
2757 pointee_clang_type,
2758 idx,
2759 transparent_pointers,
2760 omit_empty_base_classes,
2761 child_name,
2762 child_byte_size,
2763 child_byte_offset,
2764 child_bitfield_bit_size,
2765 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002766 child_is_base_class,
2767 tmp_child_is_deref_of_parent);
Greg Clayton73b472d2010-10-27 03:32:59 +00002768 }
2769 else
2770 {
2771 if (parent_name)
2772 {
2773 child_name.assign(1, '&');
2774 child_name += parent_name;
2775 }
2776
2777 // We have a pointer to an simple type
2778 if (idx == 0)
2779 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002780 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Clayton73b472d2010-10-27 03:32:59 +00002781 assert(clang_type_info.first % 8 == 0);
2782 child_byte_size = clang_type_info.first / 8;
2783 child_byte_offset = 0;
2784 return pointee_type.getAsOpaquePtr();
2785 }
2786 }
2787 }
2788 break;
2789
Greg Claytone1a916a2010-07-21 22:12:05 +00002790 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002791 return GetChildClangTypeAtIndex (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002792 parent_name,
Sean Callanan48114472010-12-13 01:26:27 +00002793 cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002794 idx,
2795 transparent_pointers,
2796 omit_empty_base_classes,
2797 child_name,
2798 child_byte_size,
2799 child_byte_offset,
2800 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002801 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002802 child_is_base_class,
2803 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002804 break;
2805
2806 default:
2807 break;
2808 }
2809 }
Greg Clayton19503a22010-07-23 15:37:46 +00002810 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002811}
2812
2813static inline bool
2814BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
2815{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002816 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002817}
2818
2819static uint32_t
2820GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
2821{
2822 uint32_t num_bases = 0;
2823 if (cxx_record_decl)
2824 {
2825 if (omit_empty_base_classes)
2826 {
2827 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2828 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2829 base_class != base_class_end;
2830 ++base_class)
2831 {
2832 // Skip empty base classes
2833 if (omit_empty_base_classes)
2834 {
2835 if (BaseSpecifierIsEmpty (base_class))
2836 continue;
2837 }
2838 ++num_bases;
2839 }
2840 }
2841 else
2842 num_bases = cxx_record_decl->getNumBases();
2843 }
2844 return num_bases;
2845}
2846
2847
2848static uint32_t
2849GetIndexForRecordBase
2850(
2851 const RecordDecl *record_decl,
2852 const CXXBaseSpecifier *base_spec,
2853 bool omit_empty_base_classes
2854)
2855{
2856 uint32_t child_idx = 0;
2857
2858 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2859
2860// const char *super_name = record_decl->getNameAsCString();
2861// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
2862// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
2863//
2864 if (cxx_record_decl)
2865 {
2866 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2867 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2868 base_class != base_class_end;
2869 ++base_class)
2870 {
2871 if (omit_empty_base_classes)
2872 {
2873 if (BaseSpecifierIsEmpty (base_class))
2874 continue;
2875 }
2876
2877// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
2878// child_idx,
2879// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
2880//
2881//
2882 if (base_class == base_spec)
2883 return child_idx;
2884 ++child_idx;
2885 }
2886 }
2887
2888 return UINT32_MAX;
2889}
2890
2891
2892static uint32_t
2893GetIndexForRecordChild
2894(
2895 const RecordDecl *record_decl,
2896 NamedDecl *canonical_decl,
2897 bool omit_empty_base_classes
2898)
2899{
2900 uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
2901
2902// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2903//
2904//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
2905// if (cxx_record_decl)
2906// {
2907// CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2908// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2909// base_class != base_class_end;
2910// ++base_class)
2911// {
2912// if (omit_empty_base_classes)
2913// {
2914// if (BaseSpecifierIsEmpty (base_class))
2915// continue;
2916// }
2917//
2918//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
2919//// record_decl->getNameAsCString(),
2920//// canonical_decl->getNameAsCString(),
2921//// child_idx,
2922//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
2923//
2924//
2925// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2926// if (curr_base_class_decl == canonical_decl)
2927// {
2928// return child_idx;
2929// }
2930// ++child_idx;
2931// }
2932// }
2933//
2934// const uint32_t num_bases = child_idx;
2935 RecordDecl::field_iterator field, field_end;
2936 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
2937 field != field_end;
2938 ++field, ++child_idx)
2939 {
2940// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
2941// record_decl->getNameAsCString(),
2942// canonical_decl->getNameAsCString(),
2943// child_idx - num_bases,
2944// field->getNameAsCString());
2945
2946 if (field->getCanonicalDecl() == canonical_decl)
2947 return child_idx;
2948 }
2949
2950 return UINT32_MAX;
2951}
2952
2953// Look for a child member (doesn't include base classes, but it does include
2954// their members) in the type hierarchy. Returns an index path into "clang_type"
2955// on how to reach the appropriate member.
2956//
2957// class A
2958// {
2959// public:
2960// int m_a;
2961// int m_b;
2962// };
2963//
2964// class B
2965// {
2966// };
2967//
2968// class C :
2969// public B,
2970// public A
2971// {
2972// };
2973//
2974// If we have a clang type that describes "class C", and we wanted to looked
2975// "m_b" in it:
2976//
2977// With omit_empty_base_classes == false we would get an integer array back with:
2978// { 1, 1 }
2979// The first index 1 is the child index for "class A" within class C
2980// The second index 1 is the child index for "m_b" within class A
2981//
2982// With omit_empty_base_classes == true we would get an integer array back with:
2983// { 0, 1 }
2984// The first index 0 is the child index for "class A" within class C (since class B doesn't have any members it doesn't count)
2985// The second index 1 is the child index for "m_b" within class A
2986
2987size_t
2988ClangASTContext::GetIndexOfChildMemberWithName
2989(
Greg Clayton6beaaa62011-01-17 03:46:26 +00002990 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002991 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002992 const char *name,
2993 bool omit_empty_base_classes,
2994 std::vector<uint32_t>& child_indexes
2995)
2996{
2997 if (clang_type && name && name[0])
2998 {
2999 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00003000 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3001 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003002 {
Greg Claytone1a916a2010-07-21 22:12:05 +00003003 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00003004 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003005 {
3006 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3007 const RecordDecl *record_decl = record_type->getDecl();
3008
3009 assert(record_decl);
3010 uint32_t child_idx = 0;
3011
3012 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3013
3014 // Try and find a field that matches NAME
3015 RecordDecl::field_iterator field, field_end;
3016 StringRef name_sref(name);
3017 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
3018 field != field_end;
3019 ++field, ++child_idx)
3020 {
3021 if (field->getName().equals (name_sref))
3022 {
3023 // We have to add on the number of base classes to this index!
3024 child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
3025 return child_indexes.size();
3026 }
3027 }
3028
3029 if (cxx_record_decl)
3030 {
3031 const RecordDecl *parent_record_decl = cxx_record_decl;
3032
3033 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
3034
3035 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
3036 // Didn't find things easily, lets let clang do its thang...
Greg Clayton6beaaa62011-01-17 03:46:26 +00003037 IdentifierInfo & ident_ref = ast->Idents.get(name, name + strlen (name));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003038 DeclarationName decl_name(&ident_ref);
3039
3040 CXXBasePaths paths;
3041 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
3042 decl_name.getAsOpaquePtr(),
3043 paths))
3044 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003045 CXXBasePaths::const_paths_iterator path, path_end = paths.end();
3046 for (path = paths.begin(); path != path_end; ++path)
3047 {
3048 const size_t num_path_elements = path->size();
3049 for (size_t e=0; e<num_path_elements; ++e)
3050 {
3051 CXXBasePathElement elem = (*path)[e];
3052
3053 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
3054 if (child_idx == UINT32_MAX)
3055 {
3056 child_indexes.clear();
3057 return 0;
3058 }
3059 else
3060 {
3061 child_indexes.push_back (child_idx);
3062 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
3063 }
3064 }
3065 DeclContext::lookup_iterator named_decl_pos;
3066 for (named_decl_pos = path->Decls.first;
3067 named_decl_pos != path->Decls.second && parent_record_decl;
3068 ++named_decl_pos)
3069 {
3070 //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
3071
3072 child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
3073 if (child_idx == UINT32_MAX)
3074 {
3075 child_indexes.clear();
3076 return 0;
3077 }
3078 else
3079 {
3080 child_indexes.push_back (child_idx);
3081 }
3082 }
3083 }
3084 return child_indexes.size();
3085 }
3086 }
3087
3088 }
3089 break;
3090
Greg Clayton9e409562010-07-28 02:04:09 +00003091 case clang::Type::ObjCObject:
3092 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00003093 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00003094 {
3095 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00003096 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003097 assert (objc_class_type);
3098 if (objc_class_type)
3099 {
3100 uint32_t child_idx = 0;
3101 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3102
3103 if (class_interface_decl)
3104 {
3105 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3106 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3107
Greg Clayton6ba78152010-09-18 02:11:07 +00003108 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
Greg Clayton9e409562010-07-28 02:04:09 +00003109 {
3110 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3111
3112 if (ivar_decl->getName().equals (name_sref))
3113 {
3114 if ((!omit_empty_base_classes && superclass_interface_decl) ||
3115 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
3116 ++child_idx;
3117
3118 child_indexes.push_back (child_idx);
3119 return child_indexes.size();
3120 }
3121 }
3122
3123 if (superclass_interface_decl)
3124 {
3125 // The super class index is always zero for ObjC classes,
3126 // so we push it onto the child indexes in case we find
3127 // an ivar in our superclass...
3128 child_indexes.push_back (0);
3129
Greg Clayton6beaaa62011-01-17 03:46:26 +00003130 if (GetIndexOfChildMemberWithName (ast,
3131 ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00003132 name,
3133 omit_empty_base_classes,
3134 child_indexes))
3135 {
3136 // We did find an ivar in a superclass so just
3137 // return the results!
3138 return child_indexes.size();
3139 }
3140
3141 // We didn't find an ivar matching "name" in our
3142 // superclass, pop the superclass zero index that
3143 // we pushed on above.
3144 child_indexes.pop_back();
3145 }
3146 }
3147 }
3148 }
3149 break;
3150
3151 case clang::Type::ObjCObjectPointer:
3152 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003153 return GetIndexOfChildMemberWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00003154 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
3155 name,
3156 omit_empty_base_classes,
3157 child_indexes);
3158 }
3159 break;
3160
3161
Greg Claytone1a916a2010-07-21 22:12:05 +00003162 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003163 {
3164// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
3165// const uint64_t element_count = array->getSize().getLimitedValue();
3166//
3167// if (idx < element_count)
3168// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003169// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003170//
3171// char element_name[32];
3172// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
3173//
3174// child_name.assign(element_name);
3175// assert(field_type_info.first % 8 == 0);
3176// child_byte_size = field_type_info.first / 8;
3177// child_byte_offset = idx * child_byte_size;
3178// return array->getElementType().getAsOpaquePtr();
3179// }
3180 }
3181 break;
3182
Greg Claytone1a916a2010-07-21 22:12:05 +00003183// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003184// {
3185// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
3186// QualType pointee_type = mem_ptr_type->getPointeeType();
3187//
3188// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3189// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003190// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003191// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
3192// name);
3193// }
3194// }
3195// break;
3196//
Greg Claytone1a916a2010-07-21 22:12:05 +00003197 case clang::Type::LValueReference:
3198 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003199 {
Sean Callanan78e37602011-01-27 04:42:51 +00003200 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003201 QualType pointee_type = reference_type->getPointeeType();
3202
3203 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3204 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003205 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003206 reference_type->getPointeeType().getAsOpaquePtr(),
3207 name,
3208 omit_empty_base_classes,
3209 child_indexes);
3210 }
3211 }
3212 break;
3213
Greg Claytone1a916a2010-07-21 22:12:05 +00003214 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003215 {
Sean Callanan78e37602011-01-27 04:42:51 +00003216 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003217 QualType pointee_type = pointer_type->getPointeeType();
3218
3219 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3220 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003221 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003222 pointer_type->getPointeeType().getAsOpaquePtr(),
3223 name,
3224 omit_empty_base_classes,
3225 child_indexes);
3226 }
3227 else
3228 {
3229// if (parent_name)
3230// {
3231// child_name.assign(1, '*');
3232// child_name += parent_name;
3233// }
3234//
3235// // We have a pointer to an simple type
3236// if (idx == 0)
3237// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003238// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003239// assert(clang_type_info.first % 8 == 0);
3240// child_byte_size = clang_type_info.first / 8;
3241// child_byte_offset = 0;
3242// return pointee_type.getAsOpaquePtr();
3243// }
3244 }
3245 }
3246 break;
3247
Greg Claytone1a916a2010-07-21 22:12:05 +00003248 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00003249 return GetIndexOfChildMemberWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00003250 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003251 name,
3252 omit_empty_base_classes,
3253 child_indexes);
3254
3255 default:
3256 break;
3257 }
3258 }
3259 return 0;
3260}
3261
3262
3263// Get the index of the child of "clang_type" whose name matches. This function
3264// doesn't descend into the children, but only looks one level deep and name
3265// matches can include base class names.
3266
3267uint32_t
3268ClangASTContext::GetIndexOfChildWithName
3269(
Greg Clayton6beaaa62011-01-17 03:46:26 +00003270 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003271 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003272 const char *name,
3273 bool omit_empty_base_classes
3274)
3275{
3276 if (clang_type && name && name[0])
3277 {
3278 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00003279
Greg Clayton737b9322010-09-13 03:32:57 +00003280 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
Greg Clayton9e409562010-07-28 02:04:09 +00003281
Greg Clayton737b9322010-09-13 03:32:57 +00003282 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003283 {
Greg Claytone1a916a2010-07-21 22:12:05 +00003284 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00003285 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003286 {
3287 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3288 const RecordDecl *record_decl = record_type->getDecl();
3289
3290 assert(record_decl);
3291 uint32_t child_idx = 0;
3292
3293 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3294
3295 if (cxx_record_decl)
3296 {
3297 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3298 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3299 base_class != base_class_end;
3300 ++base_class)
3301 {
3302 // Skip empty base classes
3303 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3304 if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
3305 continue;
3306
3307 if (base_class->getType().getAsString().compare (name) == 0)
3308 return child_idx;
3309 ++child_idx;
3310 }
3311 }
3312
3313 // Try and find a field that matches NAME
3314 RecordDecl::field_iterator field, field_end;
3315 StringRef name_sref(name);
3316 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
3317 field != field_end;
3318 ++field, ++child_idx)
3319 {
3320 if (field->getName().equals (name_sref))
3321 return child_idx;
3322 }
3323
3324 }
3325 break;
3326
Greg Clayton9e409562010-07-28 02:04:09 +00003327 case clang::Type::ObjCObject:
3328 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00003329 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00003330 {
3331 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00003332 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003333 assert (objc_class_type);
3334 if (objc_class_type)
3335 {
3336 uint32_t child_idx = 0;
3337 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3338
3339 if (class_interface_decl)
3340 {
3341 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3342 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3343
3344 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
3345 {
3346 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3347
3348 if (ivar_decl->getName().equals (name_sref))
3349 {
3350 if ((!omit_empty_base_classes && superclass_interface_decl) ||
3351 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
3352 ++child_idx;
3353
3354 return child_idx;
3355 }
3356 }
3357
3358 if (superclass_interface_decl)
3359 {
3360 if (superclass_interface_decl->getName().equals (name_sref))
3361 return 0;
3362 }
3363 }
3364 }
3365 }
3366 break;
3367
3368 case clang::Type::ObjCObjectPointer:
3369 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003370 return GetIndexOfChildWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00003371 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
3372 name,
3373 omit_empty_base_classes);
3374 }
3375 break;
3376
Greg Claytone1a916a2010-07-21 22:12:05 +00003377 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003378 {
3379// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
3380// const uint64_t element_count = array->getSize().getLimitedValue();
3381//
3382// if (idx < element_count)
3383// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003384// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003385//
3386// char element_name[32];
3387// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
3388//
3389// child_name.assign(element_name);
3390// assert(field_type_info.first % 8 == 0);
3391// child_byte_size = field_type_info.first / 8;
3392// child_byte_offset = idx * child_byte_size;
3393// return array->getElementType().getAsOpaquePtr();
3394// }
3395 }
3396 break;
3397
Greg Claytone1a916a2010-07-21 22:12:05 +00003398// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003399// {
3400// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
3401// QualType pointee_type = mem_ptr_type->getPointeeType();
3402//
3403// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3404// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003405// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003406// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
3407// name);
3408// }
3409// }
3410// break;
3411//
Greg Claytone1a916a2010-07-21 22:12:05 +00003412 case clang::Type::LValueReference:
3413 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003414 {
Sean Callanan78e37602011-01-27 04:42:51 +00003415 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003416 QualType pointee_type = reference_type->getPointeeType();
3417
3418 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3419 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003420 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003421 reference_type->getPointeeType().getAsOpaquePtr(),
3422 name,
3423 omit_empty_base_classes);
3424 }
3425 }
3426 break;
3427
Greg Claytone1a916a2010-07-21 22:12:05 +00003428 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003429 {
Sean Callanan78e37602011-01-27 04:42:51 +00003430 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003431 QualType pointee_type = pointer_type->getPointeeType();
3432
3433 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3434 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003435 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003436 pointer_type->getPointeeType().getAsOpaquePtr(),
3437 name,
3438 omit_empty_base_classes);
3439 }
3440 else
3441 {
3442// if (parent_name)
3443// {
3444// child_name.assign(1, '*');
3445// child_name += parent_name;
3446// }
3447//
3448// // We have a pointer to an simple type
3449// if (idx == 0)
3450// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003451// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003452// assert(clang_type_info.first % 8 == 0);
3453// child_byte_size = clang_type_info.first / 8;
3454// child_byte_offset = 0;
3455// return pointee_type.getAsOpaquePtr();
3456// }
3457 }
3458 }
3459 break;
3460
Greg Claytone1a916a2010-07-21 22:12:05 +00003461 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00003462 return GetIndexOfChildWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00003463 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003464 name,
3465 omit_empty_base_classes);
3466
3467 default:
3468 break;
3469 }
3470 }
3471 return UINT32_MAX;
3472}
3473
3474#pragma mark TagType
3475
3476bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00003477ClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003478{
3479 if (tag_clang_type)
3480 {
3481 QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00003482 const clang::Type *clang_type = tag_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003483 if (clang_type)
3484 {
Sean Callanan78e37602011-01-27 04:42:51 +00003485 const TagType *tag_type = dyn_cast<TagType>(clang_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003486 if (tag_type)
3487 {
3488 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
3489 if (tag_decl)
3490 {
3491 tag_decl->setTagKind ((TagDecl::TagKind)kind);
3492 return true;
3493 }
3494 }
3495 }
3496 }
3497 return false;
3498}
3499
3500
3501#pragma mark DeclContext Functions
3502
3503DeclContext *
Greg Clayton1be10fc2010-09-29 01:12:09 +00003504ClangASTContext::GetDeclContextForType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003505{
3506 if (clang_type == NULL)
3507 return NULL;
3508
3509 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00003510 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3511 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003512 {
Greg Clayton9e409562010-07-28 02:04:09 +00003513 case clang::Type::FunctionNoProto: break;
3514 case clang::Type::FunctionProto: break;
3515 case clang::Type::IncompleteArray: break;
3516 case clang::Type::VariableArray: break;
3517 case clang::Type::ConstantArray: break;
3518 case clang::Type::ExtVector: break;
3519 case clang::Type::Vector: break;
3520 case clang::Type::Builtin: break;
3521 case clang::Type::BlockPointer: break;
3522 case clang::Type::Pointer: break;
3523 case clang::Type::LValueReference: break;
3524 case clang::Type::RValueReference: break;
3525 case clang::Type::MemberPointer: break;
3526 case clang::Type::Complex: break;
3527 case clang::Type::ObjCObject: break;
3528 case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
3529 case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
3530 case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl();
3531 case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl();
Sean Callanan48114472010-12-13 01:26:27 +00003532 case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003533
Greg Clayton9e409562010-07-28 02:04:09 +00003534 case clang::Type::TypeOfExpr: break;
3535 case clang::Type::TypeOf: break;
3536 case clang::Type::Decltype: break;
3537 //case clang::Type::QualifiedName: break;
3538 case clang::Type::TemplateSpecialization: break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003539 }
3540 // No DeclContext in this type...
3541 return NULL;
3542}
3543
3544#pragma mark Namespace Declarations
3545
3546NamespaceDecl *
3547ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
3548{
3549 // TODO: Do something intelligent with the Declaration object passed in
3550 // like maybe filling in the SourceLocation with it...
3551 if (name)
3552 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003553 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003554 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00003555 decl_ctx = ast->getTranslationUnitDecl();
3556 return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), &ast->Idents.get(name));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003557 }
3558 return NULL;
3559}
3560
3561
3562#pragma mark Function Types
3563
3564FunctionDecl *
Greg Clayton1be10fc2010-09-29 01:12:09 +00003565ClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003566{
3567 if (name)
3568 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003569 ASTContext *ast = getASTContext();
3570 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003571
3572 if (name && name[0])
3573 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003574 return FunctionDecl::Create(*ast,
3575 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003576 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00003577 DeclarationName (&ast->Idents.get(name)),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003578 QualType::getFromOpaquePtr(function_clang_type),
3579 NULL,
3580 (FunctionDecl::StorageClass)storage,
3581 (FunctionDecl::StorageClass)storage,
3582 is_inline);
3583 }
3584 else
3585 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003586 return FunctionDecl::Create(*ast,
3587 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003588 SourceLocation(),
3589 DeclarationName (),
3590 QualType::getFromOpaquePtr(function_clang_type),
3591 NULL,
3592 (FunctionDecl::StorageClass)storage,
3593 (FunctionDecl::StorageClass)storage,
3594 is_inline);
3595 }
3596 }
3597 return NULL;
3598}
3599
Greg Clayton1be10fc2010-09-29 01:12:09 +00003600clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00003601ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003602 clang_type_t result_type,
3603 clang_type_t *args,
Sean Callananc81256a2010-09-16 20:40:25 +00003604 unsigned num_args,
3605 bool is_variadic,
3606 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003607{
Greg Clayton6beaaa62011-01-17 03:46:26 +00003608 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003609 std::vector<QualType> qual_type_args;
3610 for (unsigned i=0; i<num_args; ++i)
3611 qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
3612
3613 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00003614 FunctionProtoType::ExtProtoInfo proto_info;
3615 proto_info.Variadic = is_variadic;
3616 proto_info.HasExceptionSpec = false;
3617 proto_info.HasAnyExceptionSpec = false;
3618 proto_info.TypeQuals = type_quals;
3619 proto_info.NumExceptions = 0;
3620 proto_info.Exceptions = NULL;
3621
Greg Clayton6beaaa62011-01-17 03:46:26 +00003622 return ast->getFunctionType(QualType::getFromOpaquePtr(result_type),
Greg Clayton471b31c2010-07-20 22:52:08 +00003623 qual_type_args.empty() ? NULL : &qual_type_args.front(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003624 qual_type_args.size(),
Sean Callanan2c777c42011-01-18 23:32:05 +00003625 proto_info).getAsOpaquePtr(); // NoReturn);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003626}
3627
3628ParmVarDecl *
Greg Clayton1be10fc2010-09-29 01:12:09 +00003629ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003630{
Greg Clayton6beaaa62011-01-17 03:46:26 +00003631 ASTContext *ast = getASTContext();
3632 assert (ast != NULL);
3633 return ParmVarDecl::Create(*ast,
3634 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003635 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00003636 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callananc81256a2010-09-16 20:40:25 +00003637 QualType::getFromOpaquePtr(param_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003638 NULL,
3639 (VarDecl::StorageClass)storage,
3640 (VarDecl::StorageClass)storage,
3641 0);
3642}
3643
3644void
3645ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
3646{
3647 if (function_decl)
3648 function_decl->setParams (params, num_params);
3649}
3650
3651
3652#pragma mark Array Types
3653
Greg Clayton1be10fc2010-09-29 01:12:09 +00003654clang_type_t
3655ClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003656{
3657 if (element_type)
3658 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003659 ASTContext *ast = getASTContext();
3660 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003661 llvm::APInt ap_element_count (64, element_count);
Greg Clayton6beaaa62011-01-17 03:46:26 +00003662 return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003663 ap_element_count,
3664 ArrayType::Normal,
3665 0).getAsOpaquePtr(); // ElemQuals
3666 }
3667 return NULL;
3668}
3669
3670
3671#pragma mark TagDecl
3672
3673bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00003674ClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003675{
3676 if (clang_type)
3677 {
3678 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00003679 const clang::Type *t = qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003680 if (t)
3681 {
Sean Callanan78e37602011-01-27 04:42:51 +00003682 const TagType *tag_type = dyn_cast<TagType>(t);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003683 if (tag_type)
3684 {
3685 TagDecl *tag_decl = tag_type->getDecl();
3686 if (tag_decl)
3687 {
3688 tag_decl->startDefinition();
3689 return true;
3690 }
3691 }
3692 }
3693 }
3694 return false;
3695}
3696
3697bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00003698ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003699{
3700 if (clang_type)
3701 {
3702 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton14372242010-09-29 03:44:17 +00003703
3704 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3705
3706 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003707 {
Greg Clayton14372242010-09-29 03:44:17 +00003708 cxx_record_decl->completeDefinition();
3709
3710 return true;
3711 }
3712
Sean Callanan78e37602011-01-27 04:42:51 +00003713 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
Sean Callanana2424172010-10-25 00:29:48 +00003714
3715 if (objc_class_type)
3716 {
3717 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3718
3719 class_interface_decl->setForwardDecl(false);
3720 }
3721
Greg Clayton14372242010-09-29 03:44:17 +00003722 const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
3723
3724 if (enum_type)
3725 {
3726 EnumDecl *enum_decl = enum_type->getDecl();
3727
3728 if (enum_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003729 {
Greg Clayton14372242010-09-29 03:44:17 +00003730 /// TODO This really needs to be fixed.
3731
3732 unsigned NumPositiveBits = 1;
3733 unsigned NumNegativeBits = 0;
3734
Greg Clayton6beaaa62011-01-17 03:46:26 +00003735 ASTContext *ast = getASTContext();
Greg Claytone02b8502010-10-12 04:29:14 +00003736
3737 QualType promotion_qual_type;
3738 // If the enum integer type is less than an integer in bit width,
3739 // then we must promote it to an integer size.
Greg Clayton6beaaa62011-01-17 03:46:26 +00003740 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
Greg Claytone02b8502010-10-12 04:29:14 +00003741 {
3742 if (enum_decl->getIntegerType()->isSignedIntegerType())
Greg Clayton6beaaa62011-01-17 03:46:26 +00003743 promotion_qual_type = ast->IntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00003744 else
Greg Clayton6beaaa62011-01-17 03:46:26 +00003745 promotion_qual_type = ast->UnsignedIntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00003746 }
3747 else
3748 promotion_qual_type = enum_decl->getIntegerType();
3749
3750 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Clayton14372242010-09-29 03:44:17 +00003751 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003752 }
3753 }
3754 }
3755 return false;
3756}
3757
3758
3759#pragma mark Enumeration Types
3760
Greg Clayton1be10fc2010-09-29 01:12:09 +00003761clang_type_t
Greg Claytonca512b32011-01-14 04:54:56 +00003762ClangASTContext::CreateEnumerationType
3763(
3764 const char *name,
3765 DeclContext *decl_ctx,
3766 const Declaration &decl,
3767 clang_type_t integer_qual_type
3768)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003769{
3770 // TODO: Do something intelligent with the Declaration object passed in
3771 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00003772 ASTContext *ast = getASTContext();
3773 assert (ast != NULL);
Greg Claytone02b8502010-10-12 04:29:14 +00003774
3775 // TODO: ask about these...
3776// const bool IsScoped = false;
3777// const bool IsFixed = false;
3778
Greg Clayton6beaaa62011-01-17 03:46:26 +00003779 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00003780 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00003781 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00003782 name && name[0] ? &ast->Idents.get(name) : NULL,
Greg Claytone02b8502010-10-12 04:29:14 +00003783 SourceLocation(),
Sean Callanan48114472010-12-13 01:26:27 +00003784 NULL,
3785 false, // IsScoped
3786 false, // IsScopedUsingClassTag
3787 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00003788
3789
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003790 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00003791 {
3792 // TODO: check if we should be setting the promotion type too?
3793 enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00003794
3795 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
3796
Greg Clayton6beaaa62011-01-17 03:46:26 +00003797 return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
Greg Clayton83ff3892010-09-12 23:17:56 +00003798 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003799 return NULL;
3800}
3801
Greg Clayton1be10fc2010-09-29 01:12:09 +00003802clang_type_t
3803ClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
3804{
3805 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3806
Sean Callanan78e37602011-01-27 04:42:51 +00003807 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Greg Clayton1be10fc2010-09-29 01:12:09 +00003808 if (clang_type)
3809 {
3810 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3811 if (enum_type)
3812 {
3813 EnumDecl *enum_decl = enum_type->getDecl();
3814 if (enum_decl)
3815 return enum_decl->getIntegerType().getAsOpaquePtr();
3816 }
3817 }
3818 return NULL;
3819}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003820bool
3821ClangASTContext::AddEnumerationValueToEnumerationType
3822(
Greg Clayton1be10fc2010-09-29 01:12:09 +00003823 clang_type_t enum_clang_type,
3824 clang_type_t enumerator_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003825 const Declaration &decl,
3826 const char *name,
3827 int64_t enum_value,
3828 uint32_t enum_value_bit_size
3829)
3830{
3831 if (enum_clang_type && enumerator_clang_type && name)
3832 {
3833 // TODO: Do something intelligent with the Declaration object passed in
3834 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00003835 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003836 IdentifierTable *identifier_table = getIdentifierTable();
3837
Greg Clayton6beaaa62011-01-17 03:46:26 +00003838 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003839 assert (identifier_table != NULL);
3840 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3841
Sean Callanan78e37602011-01-27 04:42:51 +00003842 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003843 if (clang_type)
3844 {
3845 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3846
3847 if (enum_type)
3848 {
3849 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
3850 enum_llvm_apsint = enum_value;
3851 EnumConstantDecl *enumerator_decl =
Greg Clayton6beaaa62011-01-17 03:46:26 +00003852 EnumConstantDecl::Create (*ast,
3853 enum_type->getDecl(),
3854 SourceLocation(),
3855 name ? &identifier_table->get(name) : NULL, // Identifier
3856 QualType::getFromOpaquePtr(enumerator_clang_type),
3857 NULL,
3858 enum_llvm_apsint);
3859
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003860 if (enumerator_decl)
3861 {
3862 enum_type->getDecl()->addDecl(enumerator_decl);
3863 return true;
3864 }
3865 }
3866 }
3867 }
3868 return false;
3869}
3870
3871#pragma mark Pointers & References
3872
Greg Clayton1be10fc2010-09-29 01:12:09 +00003873clang_type_t
3874ClangASTContext::CreatePointerType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003875{
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003876 return CreatePointerType (getASTContext(), clang_type);
3877}
3878
3879clang_type_t
3880ClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
3881{
3882 if (ast && clang_type)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00003883 {
3884 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3885
Greg Clayton737b9322010-09-13 03:32:57 +00003886 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3887 switch (type_class)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00003888 {
3889 case clang::Type::ObjCObject:
3890 case clang::Type::ObjCInterface:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003891 return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00003892
Greg Clayton5fb47cd2010-07-29 20:06:32 +00003893 default:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003894 return ast->getPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00003895 }
3896 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003897 return NULL;
3898}
3899
Greg Clayton1be10fc2010-09-29 01:12:09 +00003900clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00003901ClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
3902 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003903{
3904 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00003905 return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003906 return NULL;
3907}
3908
Greg Clayton1be10fc2010-09-29 01:12:09 +00003909clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00003910ClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
3911 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003912{
3913 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00003914 return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003915 return NULL;
3916}
3917
Greg Clayton1be10fc2010-09-29 01:12:09 +00003918clang_type_t
3919ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
Greg Clayton9b81a312010-06-12 01:20:30 +00003920{
3921 if (clang_pointee_type && clang_pointee_type)
3922 return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
3923 QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
3924 return NULL;
3925}
3926
Greg Clayton1a65ae12011-01-25 23:55:37 +00003927uint32_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003928ClangASTContext::GetPointerBitSize ()
3929{
Greg Clayton6beaaa62011-01-17 03:46:26 +00003930 ASTContext *ast = getASTContext();
3931 return ast->getTypeSize(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003932}
3933
3934bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00003935ClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003936{
3937 if (clang_type == NULL)
3938 return false;
3939
3940 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00003941 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3942 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003943 {
Sean Callanana2424172010-10-25 00:29:48 +00003944 case clang::Type::Builtin:
3945 switch (cast<clang::BuiltinType>(qual_type)->getKind())
3946 {
3947 default:
3948 break;
3949 case clang::BuiltinType::ObjCId:
3950 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00003951 return true;
3952 }
3953 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00003954 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003955 if (target_type)
3956 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
3957 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00003958 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003959 if (target_type)
3960 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
3961 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00003962 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003963 if (target_type)
3964 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
3965 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00003966 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003967 if (target_type)
3968 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
3969 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00003970 case clang::Type::LValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003971 if (target_type)
3972 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
3973 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00003974 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003975 if (target_type)
3976 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
3977 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00003978 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00003979 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003980 default:
3981 break;
3982 }
3983 return false;
3984}
3985
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003986bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00003987ClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003988{
3989 if (!clang_type)
3990 return false;
3991
3992 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3993 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
3994
3995 if (builtin_type)
3996 {
3997 if (builtin_type->isInteger())
3998 is_signed = builtin_type->isSignedInteger();
3999
4000 return true;
4001 }
4002
4003 return false;
4004}
4005
4006bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004007ClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004008{
4009 if (clang_type)
4010 {
4011 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00004012 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4013 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004014 {
Sean Callanana2424172010-10-25 00:29:48 +00004015 case clang::Type::Builtin:
4016 switch (cast<clang::BuiltinType>(qual_type)->getKind())
4017 {
4018 default:
4019 break;
4020 case clang::BuiltinType::ObjCId:
4021 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00004022 return true;
4023 }
4024 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00004025 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004026 if (target_type)
4027 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4028 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004029 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004030 if (target_type)
4031 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4032 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004033 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004034 if (target_type)
4035 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4036 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004037 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004038 if (target_type)
4039 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4040 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004041 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00004042 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004043 default:
4044 break;
4045 }
4046 }
4047 return false;
4048}
4049
4050bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004051ClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004052{
4053 if (clang_type)
4054 {
4055 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4056
4057 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
4058 {
4059 clang::BuiltinType::Kind kind = BT->getKind();
4060 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
4061 {
4062 count = 1;
4063 is_complex = false;
4064 return true;
4065 }
4066 }
4067 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
4068 {
4069 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
4070 {
4071 count = 2;
4072 is_complex = true;
4073 return true;
4074 }
4075 }
4076 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
4077 {
4078 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
4079 {
4080 count = VT->getNumElements();
4081 is_complex = false;
4082 return true;
4083 }
4084 }
4085 }
4086 return false;
4087}
4088
Greg Clayton8f92f0a2010-10-14 22:52:14 +00004089
4090bool
4091ClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
4092{
4093 if (clang_type)
4094 {
4095 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4096
4097 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4098 if (cxx_record_decl)
4099 {
4100 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
4101 return true;
4102 }
4103 }
4104 class_name.clear();
4105 return false;
4106}
4107
4108
Greg Clayton0fffff52010-09-24 05:15:53 +00004109bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004110ClangASTContext::IsCXXClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00004111{
4112 if (clang_type)
4113 {
4114 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4115 if (qual_type->getAsCXXRecordDecl() != NULL)
4116 return true;
4117 }
4118 return false;
4119}
4120
4121bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004122ClangASTContext::IsObjCClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00004123{
4124 if (clang_type)
4125 {
4126 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4127 if (qual_type->isObjCObjectOrInterfaceType())
4128 return true;
4129 }
4130 return false;
4131}
4132
4133
Greg Clayton73b472d2010-10-27 03:32:59 +00004134bool
4135ClangASTContext::IsCharType (clang_type_t clang_type)
4136{
4137 if (clang_type)
4138 return QualType::getFromOpaquePtr(clang_type)->isCharType();
4139 return false;
4140}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004141
4142bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004143ClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004144{
Greg Clayton73b472d2010-10-27 03:32:59 +00004145 clang_type_t pointee_or_element_clang_type = NULL;
4146 Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
4147
4148 if (pointee_or_element_clang_type == NULL)
4149 return false;
4150
4151 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004152 {
Greg Clayton73b472d2010-10-27 03:32:59 +00004153 QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
4154
4155 if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004156 {
Greg Clayton73b472d2010-10-27 03:32:59 +00004157 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4158 if (type_flags.Test (eTypeIsArray))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004159 {
Greg Clayton73b472d2010-10-27 03:32:59 +00004160 // We know the size of the array and it could be a C string
4161 // since it is an array of characters
4162 length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4163 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004164 }
Greg Clayton73b472d2010-10-27 03:32:59 +00004165 else
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004166 {
Greg Clayton73b472d2010-10-27 03:32:59 +00004167 length = 0;
4168 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004169 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004170
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004171 }
4172 }
4173 return false;
4174}
4175
4176bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004177ClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
Greg Clayton737b9322010-09-13 03:32:57 +00004178{
4179 if (clang_type)
4180 {
4181 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4182
4183 if (qual_type->isFunctionPointerType())
4184 return true;
4185
4186 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4187 switch (type_class)
4188 {
4189 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00004190 return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00004191
4192 case clang::Type::LValueReference:
4193 case clang::Type::RValueReference:
4194 {
Sean Callanan78e37602011-01-27 04:42:51 +00004195 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00004196 if (reference_type)
4197 return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
4198 }
4199 break;
4200 }
4201 }
4202 return false;
4203}
4204
Greg Clayton73b472d2010-10-27 03:32:59 +00004205size_t
4206ClangASTContext::GetArraySize (clang_type_t clang_type)
4207{
4208 if (clang_type)
4209 {
Sean Callanan78e37602011-01-27 04:42:51 +00004210 const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00004211 if (array)
4212 return array->getSize().getLimitedValue();
4213 }
4214 return 0;
4215}
Greg Clayton737b9322010-09-13 03:32:57 +00004216
4217bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004218ClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004219{
4220 if (!clang_type)
4221 return false;
4222
4223 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4224
Greg Clayton737b9322010-09-13 03:32:57 +00004225 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4226 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004227 {
Greg Claytone1a916a2010-07-21 22:12:05 +00004228 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004229 if (member_type)
4230 *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
4231 if (size)
4232 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX);
4233 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004234 case clang::Type::IncompleteArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004235 if (member_type)
4236 *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
4237 if (size)
4238 *size = 0;
4239 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004240 case clang::Type::VariableArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004241 if (member_type)
4242 *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
4243 if (size)
4244 *size = 0;
Greg Clayton03dbf2e2011-02-02 00:52:14 +00004245 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004246 case clang::Type::DependentSizedArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004247 if (member_type)
4248 *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
4249 if (size)
4250 *size = 0;
4251 return true;
4252 }
4253 return false;
4254}
4255
4256
4257#pragma mark Typedefs
4258
Greg Clayton1be10fc2010-09-29 01:12:09 +00004259clang_type_t
4260ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004261{
4262 if (clang_type)
4263 {
4264 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00004265 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004266 IdentifierTable *identifier_table = getIdentifierTable();
Greg Clayton6beaaa62011-01-17 03:46:26 +00004267 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004268 assert (identifier_table != NULL);
4269 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00004270 decl_ctx = ast->getTranslationUnitDecl();
4271 TypedefDecl *decl = TypedefDecl::Create (*ast,
4272 decl_ctx,
4273 SourceLocation(),
4274 name ? &identifier_table->get(name) : NULL, // Identifier
4275 ast->CreateTypeSourceInfo(qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00004276
4277 decl->setAccess(AS_public); // TODO respect proper access specifier
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004278
4279 // Get a uniqued QualType for the typedef decl type
Greg Clayton6beaaa62011-01-17 03:46:26 +00004280 return ast->getTypedefType (decl).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004281 }
4282 return NULL;
4283}
4284
4285
4286std::string
Greg Clayton1be10fc2010-09-29 01:12:09 +00004287ClangASTContext::GetTypeName (clang_type_t opaque_qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004288{
4289 std::string return_name;
4290
Greg Clayton1be10fc2010-09-29 01:12:09 +00004291 QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004292
Greg Clayton1be10fc2010-09-29 01:12:09 +00004293 const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004294 if (typedef_type)
4295 {
Greg Clayton1be10fc2010-09-29 01:12:09 +00004296 const TypedefDecl *typedef_decl = typedef_type->getDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004297 return_name = typedef_decl->getQualifiedNameAsString();
4298 }
4299 else
4300 {
4301 return_name = qual_type.getAsString();
4302 }
4303
4304 return return_name;
4305}
4306
4307// Disable this for now since I can't seem to get a nicely formatted float
4308// out of the APFloat class without just getting the float, double or quad
4309// and then using a formatted print on it which defeats the purpose. We ideally
4310// would like to get perfect string values for any kind of float semantics
4311// so we can support remote targets. The code below also requires a patch to
4312// llvm::APInt.
4313//bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00004314//ClangASTContext::ConvertFloatValueToString (ASTContext *ast, clang_type_t clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004315//{
4316// uint32_t count = 0;
4317// bool is_complex = false;
4318// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
4319// {
4320// unsigned num_bytes_per_float = byte_size / count;
4321// unsigned num_bits_per_float = num_bytes_per_float * 8;
4322//
4323// float_str.clear();
4324// uint32_t i;
4325// for (i=0; i<count; i++)
4326// {
4327// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
4328// bool is_ieee = false;
4329// APFloat ap_float(ap_int, is_ieee);
4330// char s[1024];
4331// unsigned int hex_digits = 0;
4332// bool upper_case = false;
4333//
4334// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
4335// {
4336// if (i > 0)
4337// float_str.append(", ");
4338// float_str.append(s);
4339// if (i == 1 && is_complex)
4340// float_str.append(1, 'i');
4341// }
4342// }
4343// return !float_str.empty();
4344// }
4345// return false;
4346//}
4347
4348size_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00004349ClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004350{
4351 if (clang_type)
4352 {
4353 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4354 uint32_t count = 0;
4355 bool is_complex = false;
4356 if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
4357 {
4358 // TODO: handle complex and vector types
4359 if (count != 1)
4360 return false;
4361
4362 StringRef s_sref(s);
Greg Clayton6beaaa62011-01-17 03:46:26 +00004363 APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004364
Greg Clayton6beaaa62011-01-17 03:46:26 +00004365 const uint64_t bit_size = ast->getTypeSize (qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004366 const uint64_t byte_size = bit_size / 8;
4367 if (dst_size >= byte_size)
4368 {
4369 if (bit_size == sizeof(float)*8)
4370 {
4371 float float32 = ap_float.convertToFloat();
4372 ::memcpy (dst, &float32, byte_size);
4373 return byte_size;
4374 }
4375 else if (bit_size >= 64)
4376 {
4377 llvm::APInt ap_int(ap_float.bitcastToAPInt());
4378 ::memcpy (dst, ap_int.getRawData(), byte_size);
4379 return byte_size;
4380 }
4381 }
4382 }
4383 }
4384 return 0;
4385}
Sean Callanan6fe64b52010-09-17 02:24:29 +00004386
4387unsigned
Greg Clayton1be10fc2010-09-29 01:12:09 +00004388ClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
Sean Callanan6fe64b52010-09-17 02:24:29 +00004389{
4390 assert (clang_type);
4391
4392 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4393
4394 return qual_type.getQualifiers().getCVRQualifiers();
4395}
Greg Clayton6beaaa62011-01-17 03:46:26 +00004396
4397bool
4398ClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
4399{
4400 if (clang_type == NULL)
4401 return false;
4402
Greg Claytonc432c192011-01-20 04:18:48 +00004403 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00004404}
4405
4406
4407bool
4408ClangASTContext::GetCompleteType (clang_type_t clang_type)
4409{
4410 return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
4411}
4412