blob: 382133a78d85a5ebf1a85ac117d2f0d186a0090b [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"
Jim Inghamd555bac2011-06-24 22:03:24 +000061#include "lldb/Target/ExecutionContext.h"
62#include "lldb/Target/Process.h"
63#include "lldb/Target/ObjCLanguageRuntime.h"
64
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065
Eli Friedman932197d2010-06-13 19:06:42 +000066#include <stdio.h>
67
Greg Claytonc86103d2010-08-05 01:57:25 +000068using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000069using namespace lldb_private;
70using namespace llvm;
71using namespace clang;
72
Greg Clayton6beaaa62011-01-17 03:46:26 +000073
74static bool
75GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type)
76{
77 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
78 switch (type_class)
79 {
80 case clang::Type::Record:
81 case clang::Type::Enum:
82 {
Sean Callanan78e37602011-01-27 04:42:51 +000083 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +000084 if (tag_type)
85 {
86 clang::TagDecl *tag_decl = tag_type->getDecl();
87 if (tag_decl)
88 {
89 if (tag_decl->getDefinition())
90 return true;
91
92 if (tag_decl->hasExternalLexicalStorage())
93 {
Greg Clayton007d5be2011-05-30 00:49:24 +000094 if (ast)
Greg Clayton6beaaa62011-01-17 03:46:26 +000095 {
Greg Clayton007d5be2011-05-30 00:49:24 +000096 ExternalASTSource *external_ast_source = ast->getExternalSource();
97 if (external_ast_source)
98 {
99 external_ast_source->CompleteType(tag_decl);
100 return !tag_type->isIncompleteType();
101 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000102 }
103 }
104 return false;
105 }
106 }
107
108 }
109 break;
110
111 case clang::Type::ObjCObject:
112 case clang::Type::ObjCInterface:
113 {
Sean Callanan78e37602011-01-27 04:42:51 +0000114 const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000115 if (objc_class_type)
116 {
117 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
118 // We currently can't complete objective C types through the newly added ASTContext
119 // because it only supports TagDecl objects right now...
Enrico Granata9dd75c82011-07-15 23:30:15 +0000120 if (class_interface_decl)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000121 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000122 bool is_forward_decl = class_interface_decl->isForwardDecl();
123 if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage())
Greg Clayton6beaaa62011-01-17 03:46:26 +0000124 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000125 if (ast)
Greg Clayton007d5be2011-05-30 00:49:24 +0000126 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000127 ExternalASTSource *external_ast_source = ast->getExternalSource();
128 if (external_ast_source)
129 {
130 external_ast_source->CompleteType (class_interface_decl);
131 is_forward_decl = class_interface_decl->isForwardDecl();
132 }
Greg Clayton007d5be2011-05-30 00:49:24 +0000133 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000134 return is_forward_decl == false;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000135 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000136 return true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000137 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000138 else
139 return false;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000140 }
141 }
142 break;
143
144 case clang::Type::Typedef:
145 return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Sean Callanan912855f2011-08-11 23:56:13 +0000146
147 case clang::Type::Elaborated:
148 return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType());
Greg Clayton6beaaa62011-01-17 03:46:26 +0000149
150 default:
151 break;
152 }
153
154 return true;
155}
156
157
Greg Clayton8cf05932010-07-22 18:30:50 +0000158static AccessSpecifier
Greg Claytonc86103d2010-08-05 01:57:25 +0000159ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000160{
161 switch (access)
162 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000163 default: break;
164 case eAccessNone: return AS_none;
165 case eAccessPublic: return AS_public;
166 case eAccessPrivate: return AS_private;
167 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000168 }
169 return AS_none;
170}
171
172static ObjCIvarDecl::AccessControl
Greg Claytonc86103d2010-08-05 01:57:25 +0000173ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000174{
175 switch (access)
176 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000177 default: break;
178 case eAccessNone: return ObjCIvarDecl::None;
179 case eAccessPublic: return ObjCIvarDecl::Public;
180 case eAccessPrivate: return ObjCIvarDecl::Private;
181 case eAccessProtected: return ObjCIvarDecl::Protected;
182 case eAccessPackage: return ObjCIvarDecl::Package;
Greg Clayton8cf05932010-07-22 18:30:50 +0000183 }
184 return ObjCIvarDecl::None;
185}
186
187
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000188static void
189ParseLangArgs
190(
191 LangOptions &Opts,
Greg Clayton94e5d782010-06-13 17:34:29 +0000192 InputKind IK
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000193)
194{
195 // FIXME: Cleanup per-file based stuff.
196
197 // Set some properties which depend soley on the input kind; it would be nice
198 // to move these to the language standard, and have the driver resolve the
199 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000200 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000201 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000202 } else if (IK == IK_ObjC ||
203 IK == IK_ObjCXX ||
204 IK == IK_PreprocessedObjC ||
205 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000206 Opts.ObjC1 = Opts.ObjC2 = 1;
207 }
208
209 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
210
211 if (LangStd == LangStandard::lang_unspecified) {
212 // Based on the base language, pick one.
213 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000214 case IK_None:
215 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000216 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000217 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000218 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000219 LangStd = LangStandard::lang_opencl;
220 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000221 case IK_CUDA:
222 LangStd = LangStandard::lang_cuda;
223 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000224 case IK_Asm:
225 case IK_C:
226 case IK_PreprocessedC:
227 case IK_ObjC:
228 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000229 LangStd = LangStandard::lang_gnu99;
230 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000231 case IK_CXX:
232 case IK_PreprocessedCXX:
233 case IK_ObjCXX:
234 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000235 LangStd = LangStandard::lang_gnucxx98;
236 break;
237 }
238 }
239
240 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
241 Opts.BCPLComment = Std.hasBCPLComments();
242 Opts.C99 = Std.isC99();
243 Opts.CPlusPlus = Std.isCPlusPlus();
244 Opts.CPlusPlus0x = Std.isCPlusPlus0x();
245 Opts.Digraphs = Std.hasDigraphs();
246 Opts.GNUMode = Std.isGNUMode();
247 Opts.GNUInline = !Std.isC99();
248 Opts.HexFloats = Std.hasHexFloats();
249 Opts.ImplicitInt = Std.hasImplicitInt();
250
251 // OpenCL has some additional defaults.
252 if (LangStd == LangStandard::lang_opencl) {
253 Opts.OpenCL = 1;
254 Opts.AltiVec = 1;
255 Opts.CXXOperatorNames = 1;
256 Opts.LaxVectorConversions = 1;
257 }
258
259 // OpenCL and C++ both have bool, true, false keywords.
260 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
261
262// if (Opts.CPlusPlus)
263// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
264//
265// if (Args.hasArg(OPT_fobjc_gc_only))
266// Opts.setGCMode(LangOptions::GCOnly);
267// else if (Args.hasArg(OPT_fobjc_gc))
268// Opts.setGCMode(LangOptions::HybridGC);
269//
270// if (Args.hasArg(OPT_print_ivar_layout))
271// Opts.ObjCGCBitmapPrint = 1;
272//
273// if (Args.hasArg(OPT_faltivec))
274// Opts.AltiVec = 1;
275//
276// if (Args.hasArg(OPT_pthread))
277// Opts.POSIXThreads = 1;
278//
279// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
280// "default");
281// if (Vis == "default")
Sean Callanan31e851c2010-10-29 18:38:40 +0000282 Opts.setVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000283// else if (Vis == "hidden")
284// Opts.setVisibilityMode(LangOptions::Hidden);
285// else if (Vis == "protected")
286// Opts.setVisibilityMode(LangOptions::Protected);
287// else
288// Diags.Report(diag::err_drv_invalid_value)
289// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
290
291// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
292
293 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
294 // is specified, or -std is set to a conforming mode.
295 Opts.Trigraphs = !Opts.GNUMode;
296// if (Args.hasArg(OPT_trigraphs))
297// Opts.Trigraphs = 1;
298//
299// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
300// OPT_fno_dollars_in_identifiers,
301// !Opts.AsmPreprocessor);
302// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
303// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
304// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
305// if (Args.hasArg(OPT_fno_lax_vector_conversions))
306// Opts.LaxVectorConversions = 0;
307// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
308// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
309// Opts.Blocks = Args.hasArg(OPT_fblocks);
310// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
311// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
312// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
313// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
314// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
315// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
316// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
317// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
318// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
319// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
320// Diags);
321// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
322// Opts.ObjCConstantStringClass = getLastArgValue(Args,
323// OPT_fconstant_string_class);
324// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
325// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
326// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
327// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
328// Opts.Static = Args.hasArg(OPT_static_define);
329 Opts.OptimizeSize = 0;
330
331 // FIXME: Eliminate this dependency.
332// unsigned Opt =
333// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
334// Opts.Optimize = Opt != 0;
335 unsigned Opt = 0;
336
337 // This is the __NO_INLINE__ define, which just depends on things like the
338 // optimization level and -fno-inline, not actually whether the backend has
339 // inlining enabled.
340 //
341 // FIXME: This is affected by other options (-fno-inline).
342 Opts.NoInline = !Opt;
343
344// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
345// switch (SSP) {
346// default:
347// Diags.Report(diag::err_drv_invalid_value)
348// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
349// break;
350// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
351// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
352// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
353// }
354}
355
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000356
Greg Clayton6beaaa62011-01-17 03:46:26 +0000357ClangASTContext::ClangASTContext (const char *target_triple) :
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000358 m_target_triple(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000359 m_ast_ap(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000360 m_language_options_ap(),
361 m_source_manager_ap(),
362 m_diagnostic_ap(),
363 m_target_options_ap(),
364 m_target_info_ap(),
365 m_identifier_table_ap(),
366 m_selector_table_ap(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000367 m_builtins_ap(),
368 m_callback_tag_decl (NULL),
369 m_callback_objc_decl (NULL),
370 m_callback_baton (NULL)
371
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000372{
373 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000374 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000375}
376
377//----------------------------------------------------------------------
378// Destructor
379//----------------------------------------------------------------------
380ClangASTContext::~ClangASTContext()
381{
382 m_builtins_ap.reset();
383 m_selector_table_ap.reset();
384 m_identifier_table_ap.reset();
385 m_target_info_ap.reset();
386 m_target_options_ap.reset();
387 m_diagnostic_ap.reset();
388 m_source_manager_ap.reset();
389 m_language_options_ap.reset();
Greg Clayton6beaaa62011-01-17 03:46:26 +0000390 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000391}
392
393
394void
395ClangASTContext::Clear()
396{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000397 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000398 m_language_options_ap.reset();
399 m_source_manager_ap.reset();
400 m_diagnostic_ap.reset();
401 m_target_options_ap.reset();
402 m_target_info_ap.reset();
403 m_identifier_table_ap.reset();
404 m_selector_table_ap.reset();
405 m_builtins_ap.reset();
406}
407
408const char *
409ClangASTContext::GetTargetTriple ()
410{
411 return m_target_triple.c_str();
412}
413
414void
415ClangASTContext::SetTargetTriple (const char *target_triple)
416{
417 Clear();
418 m_target_triple.assign(target_triple);
419}
420
Greg Clayton514487e2011-02-15 21:59:32 +0000421void
422ClangASTContext::SetArchitecture (const ArchSpec &arch)
423{
Greg Clayton880cbb02011-07-30 01:26:02 +0000424 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000425}
426
Greg Clayton6beaaa62011-01-17 03:46:26 +0000427bool
428ClangASTContext::HasExternalSource ()
429{
430 ASTContext *ast = getASTContext();
431 if (ast)
432 return ast->getExternalSource () != NULL;
433 return false;
434}
435
436void
437ClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
438{
439 ASTContext *ast = getASTContext();
440 if (ast)
441 {
442 ast->setExternalSource (ast_source_ap);
443 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
444 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
445 }
446}
447
448void
449ClangASTContext::RemoveExternalSource ()
450{
451 ASTContext *ast = getASTContext();
452
453 if (ast)
454 {
455 llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
456 ast->setExternalSource (empty_ast_source_ap);
457 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
458 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
459 }
460}
461
462
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000463
464ASTContext *
465ClangASTContext::getASTContext()
466{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000467 if (m_ast_ap.get() == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000468 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000469 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
470 *getSourceManager(),
471 *getTargetInfo(),
472 *getIdentifierTable(),
473 *getSelectorTable(),
474 *getBuiltinContext(),
475 0));
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000476
Greg Clayton6beaaa62011-01-17 03:46:26 +0000477 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
478 {
479 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
480 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
481 }
482
483 m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000484 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000485 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000486}
487
488Builtin::Context *
489ClangASTContext::getBuiltinContext()
490{
491 if (m_builtins_ap.get() == NULL)
492 m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
493 return m_builtins_ap.get();
494}
495
496IdentifierTable *
497ClangASTContext::getIdentifierTable()
498{
499 if (m_identifier_table_ap.get() == NULL)
500 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
501 return m_identifier_table_ap.get();
502}
503
504LangOptions *
505ClangASTContext::getLanguageOptions()
506{
507 if (m_language_options_ap.get() == NULL)
508 {
509 m_language_options_ap.reset(new LangOptions());
Greg Clayton94e5d782010-06-13 17:34:29 +0000510 ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
511// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000512 }
513 return m_language_options_ap.get();
514}
515
516SelectorTable *
517ClangASTContext::getSelectorTable()
518{
519 if (m_selector_table_ap.get() == NULL)
520 m_selector_table_ap.reset (new SelectorTable());
521 return m_selector_table_ap.get();
522}
523
Sean Callanan79439e82010-11-18 02:56:27 +0000524clang::FileManager *
525ClangASTContext::getFileManager()
526{
527 if (m_file_manager_ap.get() == NULL)
Greg Clayton38a61402010-12-02 23:20:03 +0000528 {
529 clang::FileSystemOptions file_system_options;
530 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
531 }
Sean Callanan79439e82010-11-18 02:56:27 +0000532 return m_file_manager_ap.get();
533}
534
Greg Claytone1a916a2010-07-21 22:12:05 +0000535clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000536ClangASTContext::getSourceManager()
537{
538 if (m_source_manager_ap.get() == NULL)
Greg Clayton38a61402010-12-02 23:20:03 +0000539 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000540 return m_source_manager_ap.get();
541}
542
543Diagnostic *
544ClangASTContext::getDiagnostic()
545{
546 if (m_diagnostic_ap.get() == NULL)
Greg Claytona651b532010-11-19 21:46:54 +0000547 {
548 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
549 m_diagnostic_ap.reset(new Diagnostic(diag_id_sp));
550 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000551 return m_diagnostic_ap.get();
552}
553
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000554class NullDiagnosticClient : public DiagnosticClient
555{
556public:
557 NullDiagnosticClient ()
558 {
559 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
560 }
561
562 void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info)
563 {
564 if (m_log)
565 {
566 llvm::SmallVectorImpl<char> diag_str(10);
567 info.FormatDiagnostic(diag_str);
568 diag_str.push_back('\0');
569 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
570 }
571 }
572private:
573 LogSP m_log;
574};
575
576DiagnosticClient *
577ClangASTContext::getDiagnosticClient()
578{
579 if (m_diagnostic_client_ap.get() == NULL)
580 m_diagnostic_client_ap.reset(new NullDiagnosticClient);
581
582 return m_diagnostic_client_ap.get();
583}
584
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000585TargetOptions *
586ClangASTContext::getTargetOptions()
587{
588 if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
589 {
590 m_target_options_ap.reset (new TargetOptions());
591 if (m_target_options_ap.get())
592 m_target_options_ap->Triple = m_target_triple;
593 }
594 return m_target_options_ap.get();
595}
596
597
598TargetInfo *
599ClangASTContext::getTargetInfo()
600{
601 // target_triple should be something like "x86_64-apple-darwin10"
602 if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
603 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
604 return m_target_info_ap.get();
605}
606
607#pragma mark Basic Types
608
609static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000610QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000611{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000612 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000613 if (qual_type_bit_size == bit_size)
614 return true;
615 return false;
616}
617
Greg Clayton1be10fc2010-09-29 01:12:09 +0000618clang_type_t
Greg Claytonc86103d2010-08-05 01:57:25 +0000619ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000620{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000621 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000622
Greg Clayton6beaaa62011-01-17 03:46:26 +0000623 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000624
Greg Clayton6beaaa62011-01-17 03:46:26 +0000625 return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000626}
627
Greg Clayton1be10fc2010-09-29 01:12:09 +0000628clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000629ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000630{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000631 if (!ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000632 return NULL;
633
634 switch (encoding)
635 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000636 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000637 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
638 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000639 break;
640
Greg Claytonc86103d2010-08-05 01:57:25 +0000641 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000642 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
643 return ast->UnsignedCharTy.getAsOpaquePtr();
644 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
645 return ast->UnsignedShortTy.getAsOpaquePtr();
646 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
647 return ast->UnsignedIntTy.getAsOpaquePtr();
648 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
649 return ast->UnsignedLongTy.getAsOpaquePtr();
650 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
651 return ast->UnsignedLongLongTy.getAsOpaquePtr();
652 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
653 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000654 break;
655
Greg Claytonc86103d2010-08-05 01:57:25 +0000656 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000657 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
658 return ast->CharTy.getAsOpaquePtr();
659 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
660 return ast->ShortTy.getAsOpaquePtr();
661 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
662 return ast->IntTy.getAsOpaquePtr();
663 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
664 return ast->LongTy.getAsOpaquePtr();
665 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
666 return ast->LongLongTy.getAsOpaquePtr();
667 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
668 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000669 break;
670
Greg Claytonc86103d2010-08-05 01:57:25 +0000671 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000672 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
673 return ast->FloatTy.getAsOpaquePtr();
674 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
675 return ast->DoubleTy.getAsOpaquePtr();
676 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
677 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000678 break;
679
Greg Claytonc86103d2010-08-05 01:57:25 +0000680 case eEncodingVector:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000681 default:
682 break;
683 }
684
685 return NULL;
686}
687
Greg Clayton1be10fc2010-09-29 01:12:09 +0000688clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000689ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
690{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000691 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000692
693 #define streq(a,b) strcmp(a,b) == 0
Greg Clayton6beaaa62011-01-17 03:46:26 +0000694 assert (ast != NULL);
695 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000696 {
697 switch (dw_ate)
698 {
699 default:
700 break;
701
702 case DW_ATE_address:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000703 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
704 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000705 break;
706
707 case DW_ATE_boolean:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000708 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
709 return ast->BoolTy.getAsOpaquePtr();
710 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
711 return ast->UnsignedCharTy.getAsOpaquePtr();
712 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
713 return ast->UnsignedShortTy.getAsOpaquePtr();
714 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
715 return ast->UnsignedIntTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000716 break;
717
Greg Clayton49462ea2011-01-15 02:52:14 +0000718 case DW_ATE_lo_user:
719 // This has been seen to mean DW_AT_complex_integer
Greg Clayton5732f242011-01-27 09:15:11 +0000720 if (::strstr(type_name, "complex"))
Greg Clayton49462ea2011-01-15 02:52:14 +0000721 {
722 clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000723 return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000724 }
725 break;
726
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000727 case DW_ATE_complex_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000728 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
729 return ast->FloatComplexTy.getAsOpaquePtr();
730 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
731 return ast->DoubleComplexTy.getAsOpaquePtr();
732 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
733 return ast->LongDoubleComplexTy.getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000734 else
735 {
736 clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000737 return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000738 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000739 break;
740
741 case DW_ATE_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000742 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
743 return ast->FloatTy.getAsOpaquePtr();
744 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
745 return ast->DoubleTy.getAsOpaquePtr();
746 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
747 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000748 break;
749
750 case DW_ATE_signed:
751 if (type_name)
752 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000753 if (strstr(type_name, "long long"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000754 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000755 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
756 return ast->LongLongTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000757 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000758 else if (strstr(type_name, "long"))
759 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000760 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
761 return ast->LongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000762 }
763 else if (strstr(type_name, "short"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000764 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000765 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
766 return ast->ShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000767 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000768 else if (strstr(type_name, "char"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000769 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000770 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
771 return ast->CharTy.getAsOpaquePtr();
772 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
773 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000774 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000775 else if (strstr(type_name, "int"))
776 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000777 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
778 return ast->IntTy.getAsOpaquePtr();
779 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
780 return ast->Int128Ty.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000781 }
782 else if (streq(type_name, "wchar_t"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000783 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000784 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
785 return ast->WCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000786 }
Greg Clayton7bd65b92011-02-09 23:39:34 +0000787 else if (streq(type_name, "void"))
788 {
789 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
790 return ast->VoidTy.getAsOpaquePtr();
791 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000792 }
793 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000794 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
795 return ast->CharTy.getAsOpaquePtr();
796 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
797 return ast->ShortTy.getAsOpaquePtr();
798 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
799 return ast->IntTy.getAsOpaquePtr();
800 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
801 return ast->LongTy.getAsOpaquePtr();
802 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
803 return ast->LongLongTy.getAsOpaquePtr();
804 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
805 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000806 break;
807
808 case DW_ATE_signed_char:
809 if (type_name)
810 {
811 if (streq(type_name, "signed char"))
812 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000813 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
814 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000815 }
816 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000817 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
818 return ast->CharTy.getAsOpaquePtr();
819 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
820 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000821 break;
822
823 case DW_ATE_unsigned:
824 if (type_name)
825 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000826 if (strstr(type_name, "long long"))
827 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000828 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
829 return ast->UnsignedLongLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000830 }
831 else if (strstr(type_name, "long"))
832 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000833 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
834 return ast->UnsignedLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000835 }
836 else if (strstr(type_name, "short"))
837 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000838 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
839 return ast->UnsignedShortTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000840 }
841 else if (strstr(type_name, "char"))
842 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000843 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
844 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000845 }
846 else if (strstr(type_name, "int"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000847 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000848 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
849 return ast->UnsignedIntTy.getAsOpaquePtr();
850 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
851 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000852 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000853 }
854 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000855 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
856 return ast->UnsignedCharTy.getAsOpaquePtr();
857 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
858 return ast->UnsignedShortTy.getAsOpaquePtr();
859 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
860 return ast->UnsignedIntTy.getAsOpaquePtr();
861 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
862 return ast->UnsignedLongTy.getAsOpaquePtr();
863 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
864 return ast->UnsignedLongLongTy.getAsOpaquePtr();
865 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
866 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000867 break;
868
869 case DW_ATE_unsigned_char:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000870 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
871 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton7bd65b92011-02-09 23:39:34 +0000872 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
873 return ast->UnsignedShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000874 break;
875
876 case DW_ATE_imaginary_float:
877 break;
878 }
879 }
880 // This assert should fire for anything that we don't catch above so we know
881 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +0000882 if (type_name)
883 {
884 fprintf (stderr, "error: need to add support for DW_TAG_base_type '%s' encoded with DW_ATE = 0x%x, bit_size = %u\n", type_name, dw_ate, bit_size);
885 }
886 else
887 {
888 fprintf (stderr, "error: need to add support for DW_TAG_base_type encoded with DW_ATE = 0x%x, bit_size = %u\n", dw_ate, bit_size);
889 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000890 return NULL;
891}
892
Greg Clayton1be10fc2010-09-29 01:12:09 +0000893clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000894ClangASTContext::GetBuiltInType_void(ASTContext *ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000895{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000896 return ast->VoidTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000897}
898
Greg Clayton1be10fc2010-09-29 01:12:09 +0000899clang_type_t
Sean Callananf7c3e272010-11-19 02:52:21 +0000900ClangASTContext::GetBuiltInType_bool()
901{
902 return getASTContext()->BoolTy.getAsOpaquePtr();
903}
904
905clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000906ClangASTContext::GetBuiltInType_objc_id()
907{
Sean Callananf6c73082010-12-06 23:53:20 +0000908 return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000909}
910
Greg Clayton1be10fc2010-09-29 01:12:09 +0000911clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000912ClangASTContext::GetBuiltInType_objc_Class()
913{
Sean Callanana2424172010-10-25 00:29:48 +0000914 return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000915}
916
Greg Clayton1be10fc2010-09-29 01:12:09 +0000917clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000918ClangASTContext::GetBuiltInType_objc_selector()
919{
Sean Callananf6c73082010-12-06 23:53:20 +0000920 return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000921}
922
Greg Clayton1be10fc2010-09-29 01:12:09 +0000923clang_type_t
Sean Callanan77502262011-05-12 23:54:16 +0000924ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
925{
926 return ast->UnknownAnyTy.getAsOpaquePtr();
927}
928
929clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000930ClangASTContext::GetCStringType (bool is_const)
931{
932 QualType char_type(getASTContext()->CharTy);
933
934 if (is_const)
935 char_type.addConst();
936
937 return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
938}
939
Greg Clayton1be10fc2010-09-29 01:12:09 +0000940clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000941ClangASTContext::GetVoidPtrType (bool is_const)
942{
943 return GetVoidPtrType(getASTContext(), is_const);
944}
945
Greg Clayton1be10fc2010-09-29 01:12:09 +0000946clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000947ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000948{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000949 QualType void_ptr_type(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000950
951 if (is_const)
952 void_ptr_type.addConst();
953
954 return void_ptr_type.getAsOpaquePtr();
955}
956
Greg Clayton1be10fc2010-09-29 01:12:09 +0000957clang_type_t
Greg Clayton38a61402010-12-02 23:20:03 +0000958ClangASTContext::CopyType (ASTContext *dst_ast,
959 ASTContext *src_ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +0000960 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000961{
Sean Callanan79439e82010-11-18 02:56:27 +0000962 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +0000963 FileManager file_manager (file_system_options);
964 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +0000965 *src_ast, file_manager,
966 false);
Sean Callanan0617fcb2010-11-09 22:37:10 +0000967
Greg Clayton38a61402010-12-02 23:20:03 +0000968 QualType src (QualType::getFromOpaquePtr(clang_type));
969 QualType dst (importer.Import(src));
Sean Callanan0617fcb2010-11-09 22:37:10 +0000970
971 return dst.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000972}
973
Greg Clayton526e5af2010-11-13 03:52:47 +0000974
975clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +0000976ClangASTContext::CopyDecl (ASTContext *dst_ast,
977 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +0000978 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000979{
Sean Callanan79439e82010-11-18 02:56:27 +0000980 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +0000981 FileManager file_manager (file_system_options);
982 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +0000983 *src_ast, file_manager,
984 false);
Greg Clayton526e5af2010-11-13 03:52:47 +0000985
986 return importer.Import(source_decl);
987}
988
Sean Callanan23a30272010-07-16 00:00:27 +0000989bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000990ClangASTContext::AreTypesSame(ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +0000991 clang_type_t type1,
992 clang_type_t type2)
Sean Callanan4dcca2622010-07-15 22:30:52 +0000993{
Greg Claytonf4ecaa52011-02-16 23:00:21 +0000994 return ast->hasSameType (QualType::getFromOpaquePtr(type1),
995 QualType::getFromOpaquePtr(type2));
Sean Callanan4dcca2622010-07-15 22:30:52 +0000996}
997
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000998#pragma mark CVR modifiers
999
Greg Clayton1be10fc2010-09-29 01:12:09 +00001000clang_type_t
1001ClangASTContext::AddConstModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001002{
1003 if (clang_type)
1004 {
1005 QualType result(QualType::getFromOpaquePtr(clang_type));
1006 result.addConst();
1007 return result.getAsOpaquePtr();
1008 }
1009 return NULL;
1010}
1011
Greg Clayton1be10fc2010-09-29 01:12:09 +00001012clang_type_t
1013ClangASTContext::AddRestrictModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001014{
1015 if (clang_type)
1016 {
1017 QualType result(QualType::getFromOpaquePtr(clang_type));
1018 result.getQualifiers().setRestrict (true);
1019 return result.getAsOpaquePtr();
1020 }
1021 return NULL;
1022}
1023
Greg Clayton1be10fc2010-09-29 01:12:09 +00001024clang_type_t
1025ClangASTContext::AddVolatileModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001026{
1027 if (clang_type)
1028 {
1029 QualType result(QualType::getFromOpaquePtr(clang_type));
1030 result.getQualifiers().setVolatile (true);
1031 return result.getAsOpaquePtr();
1032 }
1033 return NULL;
1034}
1035
Greg Clayton6beaaa62011-01-17 03:46:26 +00001036
1037clang_type_t
1038ClangASTContext::GetTypeForDecl (TagDecl *decl)
1039{
1040 // No need to call the getASTContext() accessor (which can create the AST
1041 // if it isn't created yet, because we can't have created a decl in this
1042 // AST if our AST didn't already exist...
1043 if (m_ast_ap.get())
1044 return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1045 return NULL;
1046}
1047
1048clang_type_t
1049ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1050{
1051 // No need to call the getASTContext() accessor (which can create the AST
1052 // if it isn't created yet, because we can't have created a decl in this
1053 // AST if our AST didn't already exist...
1054 if (m_ast_ap.get())
1055 return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1056 return NULL;
1057}
1058
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001059#pragma mark Structure, Unions, Classes
1060
Greg Clayton1be10fc2010-09-29 01:12:09 +00001061clang_type_t
Greg Claytonc86103d2010-08-05 01:57:25 +00001062ClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001063{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001064 ASTContext *ast = getASTContext();
1065 assert (ast != NULL);
Sean Callanana2424172010-10-25 00:29:48 +00001066
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001067 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001068 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001069
Greg Clayton9e409562010-07-28 02:04:09 +00001070
Greg Claytone1be9962011-08-24 23:50:00 +00001071 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001072 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001073 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001074 bool isInternal = false;
1075 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
1076 }
1077
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001078 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1079 // we will need to update this code. I was told to currently always use
1080 // the CXXRecordDecl class since we often don't know from debug information
1081 // if something is struct or a class, so we default to always use the more
1082 // complete definition just in case.
Greg Clayton6beaaa62011-01-17 03:46:26 +00001083 CXXRecordDecl *decl = CXXRecordDecl::Create(*ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001084 (TagDecl::TagKind)kind,
1085 decl_ctx,
1086 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00001087 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001088 name && name[0] ? &ast->Idents.get(name) : NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001089
Greg Clayton6beaaa62011-01-17 03:46:26 +00001090 return ast->getTagDeclType(decl).getAsOpaquePtr();
1091}
1092
1093bool
1094ClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1095{
1096 if (clang_type == NULL)
1097 return false;
1098
1099 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1100
1101 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1102 switch (type_class)
1103 {
1104 case clang::Type::Record:
1105 {
1106 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1107 if (cxx_record_decl)
1108 {
1109 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001110 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001111 return true;
1112 }
1113 }
1114 break;
1115
1116 case clang::Type::Enum:
1117 {
1118 EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1119 if (enum_decl)
1120 {
1121 enum_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001122 enum_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001123 return true;
1124 }
1125 }
1126 break;
1127
1128 case clang::Type::ObjCObject:
1129 case clang::Type::ObjCInterface:
1130 {
Sean Callanan78e37602011-01-27 04:42:51 +00001131 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00001132 assert (objc_class_type);
1133 if (objc_class_type)
1134 {
1135 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1136
1137 if (class_interface_decl)
1138 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001139 class_interface_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001140 class_interface_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001141 return true;
1142 }
1143 }
1144 }
1145 break;
1146
1147 case clang::Type::Typedef:
1148 return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Sean Callanan912855f2011-08-11 23:56:13 +00001149
1150 case clang::Type::Elaborated:
1151 return ClangASTContext::SetHasExternalStorage (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001152
1153 default:
1154 break;
1155 }
1156 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001157}
1158
Greg Claytona3c444a2010-10-01 23:13:49 +00001159static bool
1160IsOperator (const char *name, OverloadedOperatorKind &op_kind)
1161{
1162 if (name == NULL || name[0] == '\0')
1163 return false;
1164
Sean Callanana43f20d2010-12-10 19:51:54 +00001165#define OPERATOR_PREFIX "operator"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001166#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
Sean Callananbfeff8c2010-12-10 02:15:55 +00001167
1168 const char *post_op_name = NULL;
1169
Sean Callanana43f20d2010-12-10 19:51:54 +00001170 bool no_space = true;
Sean Callananbfeff8c2010-12-10 02:15:55 +00001171
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001172 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
Greg Claytona3c444a2010-10-01 23:13:49 +00001173 return false;
1174
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001175 post_op_name = name + OPERATOR_PREFIX_LENGTH;
1176
Sean Callanana43f20d2010-12-10 19:51:54 +00001177 if (post_op_name[0] == ' ')
1178 {
1179 post_op_name++;
1180 no_space = false;
1181 }
1182
1183#undef OPERATOR_PREFIX
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001184#undef OPERATOR_PREFIX_LENGTH
Sean Callanana43f20d2010-12-10 19:51:54 +00001185
Greg Claytona3c444a2010-10-01 23:13:49 +00001186 // This is an operator, set the overloaded operator kind to invalid
1187 // in case this is a conversion operator...
1188 op_kind = NUM_OVERLOADED_OPERATORS;
1189
1190 switch (post_op_name[0])
1191 {
Sean Callananbfeff8c2010-12-10 02:15:55 +00001192 default:
1193 if (no_space)
1194 return false;
1195 break;
Greg Claytona3c444a2010-10-01 23:13:49 +00001196 case 'n':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001197 if (no_space)
1198 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001199 if (strcmp (post_op_name, "new") == 0)
1200 op_kind = OO_New;
1201 else if (strcmp (post_op_name, "new[]") == 0)
1202 op_kind = OO_Array_New;
1203 break;
1204
1205 case 'd':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001206 if (no_space)
1207 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001208 if (strcmp (post_op_name, "delete") == 0)
1209 op_kind = OO_Delete;
1210 else if (strcmp (post_op_name, "delete[]") == 0)
1211 op_kind = OO_Array_Delete;
1212 break;
1213
1214 case '+':
1215 if (post_op_name[1] == '\0')
1216 op_kind = OO_Plus;
1217 else if (post_op_name[2] == '\0')
1218 {
1219 if (post_op_name[1] == '=')
1220 op_kind = OO_PlusEqual;
1221 else if (post_op_name[1] == '+')
1222 op_kind = OO_PlusPlus;
1223 }
1224 break;
1225
1226 case '-':
1227 if (post_op_name[1] == '\0')
1228 op_kind = OO_Minus;
1229 else if (post_op_name[2] == '\0')
1230 {
1231 switch (post_op_name[1])
1232 {
1233 case '=': op_kind = OO_MinusEqual; break;
1234 case '-': op_kind = OO_MinusMinus; break;
1235 case '>': op_kind = OO_Arrow; break;
1236 }
1237 }
1238 else if (post_op_name[3] == '\0')
1239 {
1240 if (post_op_name[2] == '*')
1241 op_kind = OO_ArrowStar; break;
1242 }
1243 break;
1244
1245 case '*':
1246 if (post_op_name[1] == '\0')
1247 op_kind = OO_Star;
1248 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1249 op_kind = OO_StarEqual;
1250 break;
1251
1252 case '/':
1253 if (post_op_name[1] == '\0')
1254 op_kind = OO_Slash;
1255 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1256 op_kind = OO_SlashEqual;
1257 break;
1258
1259 case '%':
1260 if (post_op_name[1] == '\0')
1261 op_kind = OO_Percent;
1262 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1263 op_kind = OO_PercentEqual;
1264 break;
1265
1266
1267 case '^':
1268 if (post_op_name[1] == '\0')
1269 op_kind = OO_Caret;
1270 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1271 op_kind = OO_CaretEqual;
1272 break;
1273
1274 case '&':
1275 if (post_op_name[1] == '\0')
1276 op_kind = OO_Amp;
1277 else if (post_op_name[2] == '\0')
1278 {
1279 switch (post_op_name[1])
1280 {
1281 case '=': op_kind = OO_AmpEqual; break;
1282 case '&': op_kind = OO_AmpAmp; break;
1283 }
1284 }
1285 break;
1286
1287 case '|':
1288 if (post_op_name[1] == '\0')
1289 op_kind = OO_Pipe;
1290 else if (post_op_name[2] == '\0')
1291 {
1292 switch (post_op_name[1])
1293 {
1294 case '=': op_kind = OO_PipeEqual; break;
1295 case '|': op_kind = OO_PipePipe; break;
1296 }
1297 }
1298 break;
1299
1300 case '~':
1301 if (post_op_name[1] == '\0')
1302 op_kind = OO_Tilde;
1303 break;
1304
1305 case '!':
1306 if (post_op_name[1] == '\0')
1307 op_kind = OO_Exclaim;
1308 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1309 op_kind = OO_ExclaimEqual;
1310 break;
1311
1312 case '=':
1313 if (post_op_name[1] == '\0')
1314 op_kind = OO_Equal;
1315 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1316 op_kind = OO_EqualEqual;
1317 break;
1318
1319 case '<':
1320 if (post_op_name[1] == '\0')
1321 op_kind = OO_Less;
1322 else if (post_op_name[2] == '\0')
1323 {
1324 switch (post_op_name[1])
1325 {
1326 case '<': op_kind = OO_LessLess; break;
1327 case '=': op_kind = OO_LessEqual; break;
1328 }
1329 }
1330 else if (post_op_name[3] == '\0')
1331 {
1332 if (post_op_name[2] == '=')
1333 op_kind = OO_LessLessEqual;
1334 }
1335 break;
1336
1337 case '>':
1338 if (post_op_name[1] == '\0')
1339 op_kind = OO_Greater;
1340 else if (post_op_name[2] == '\0')
1341 {
1342 switch (post_op_name[1])
1343 {
1344 case '>': op_kind = OO_GreaterGreater; break;
1345 case '=': op_kind = OO_GreaterEqual; break;
1346 }
1347 }
1348 else if (post_op_name[1] == '>' &&
1349 post_op_name[2] == '=' &&
1350 post_op_name[3] == '\0')
1351 {
1352 op_kind = OO_GreaterGreaterEqual;
1353 }
1354 break;
1355
1356 case ',':
1357 if (post_op_name[1] == '\0')
1358 op_kind = OO_Comma;
1359 break;
1360
1361 case '(':
1362 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1363 op_kind = OO_Call;
1364 break;
1365
1366 case '[':
1367 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1368 op_kind = OO_Subscript;
1369 break;
1370 }
1371
1372 return true;
1373}
Greg Clayton6beaaa62011-01-17 03:46:26 +00001374
Greg Clayton090d0982011-06-19 03:43:27 +00001375static inline bool
1376check_op_param (bool unary, bool binary, uint32_t num_params)
1377{
1378 // The parameter count doens't include "this"
1379 if (num_params == 0)
1380 return unary;
1381 if (num_params == 1)
1382 return binary;
1383 return false;
1384}
1385
1386bool
1387ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1388{
1389#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (Unary, Binary, num_params);
1390 switch (op_kind)
1391 {
1392#include "clang/Basic/OperatorKinds.def"
1393 default: break;
1394 }
1395 return false;
1396}
1397
Greg Claytona51ed9b2010-09-23 01:09:21 +00001398CXXMethodDecl *
Sean Callanan61da09b2010-09-17 02:58:26 +00001399ClangASTContext::AddMethodToCXXRecordType
1400(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001401 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001402 clang_type_t record_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001403 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001404 clang_type_t method_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001405 lldb::AccessType access,
Greg Clayton0fffff52010-09-24 05:15:53 +00001406 bool is_virtual,
1407 bool is_static,
Greg Claytonf51de672010-10-01 02:31:07 +00001408 bool is_inline,
1409 bool is_explicit
Greg Claytona51ed9b2010-09-23 01:09:21 +00001410)
Sean Callanan61da09b2010-09-17 02:58:26 +00001411{
Sean Callananfc55f5d2010-09-21 00:44:12 +00001412 if (!record_opaque_type || !method_opaque_type || !name)
Johnny Chend440bcc2010-09-28 16:10:54 +00001413 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001414
Greg Clayton6beaaa62011-01-17 03:46:26 +00001415 assert(ast);
Sean Callanan61da09b2010-09-17 02:58:26 +00001416
Greg Clayton6beaaa62011-01-17 03:46:26 +00001417 IdentifierTable *identifier_table = &ast->Idents;
Sean Callanan61da09b2010-09-17 02:58:26 +00001418
1419 assert(identifier_table);
1420
Sean Callananfc55f5d2010-09-21 00:44:12 +00001421 QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00001422
Greg Clayton6beaaa62011-01-17 03:46:26 +00001423 CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
Sean Callanan61da09b2010-09-17 02:58:26 +00001424
Greg Clayton0fffff52010-09-24 05:15:53 +00001425 if (cxx_record_decl == NULL)
Greg Claytona51ed9b2010-09-23 01:09:21 +00001426 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001427
Greg Clayton0fffff52010-09-24 05:15:53 +00001428 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001429
Greg Claytonf51de672010-10-01 02:31:07 +00001430 CXXMethodDecl *cxx_method_decl = NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001431
Greg Claytonf51de672010-10-01 02:31:07 +00001432 DeclarationName decl_name (&identifier_table->get(name));
Greg Clayton878eaf12010-10-01 03:45:20 +00001433
Greg Clayton878eaf12010-10-01 03:45:20 +00001434 const bool is_implicitly_declared = false;
Greg Claytonf51de672010-10-01 02:31:07 +00001435
Sean Callanan78e37602011-01-27 04:42:51 +00001436 const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
Greg Clayton878eaf12010-10-01 03:45:20 +00001437
Greg Clayton90a2acd2010-10-02 01:40:05 +00001438 if (function_Type == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001439 return NULL;
1440
Sean Callanan78e37602011-01-27 04:42:51 +00001441 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
Greg Clayton878eaf12010-10-01 03:45:20 +00001442
1443 if (!method_function_prototype)
1444 return NULL;
1445
1446 unsigned int num_params = method_function_prototype->getNumArgs();
1447
1448 if (name[0] == '~')
Greg Claytonf51de672010-10-01 02:31:07 +00001449 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001450 cxx_method_decl = CXXDestructorDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001451 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001452 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001453 DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001454 method_qual_type,
Sean Callanan31e851c2010-10-29 18:38:40 +00001455 NULL,
Greg Clayton878eaf12010-10-01 03:45:20 +00001456 is_inline,
1457 is_implicitly_declared);
1458 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001459 else if (decl_name == cxx_record_decl->getDeclName())
Greg Clayton878eaf12010-10-01 03:45:20 +00001460 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001461 cxx_method_decl = CXXConstructorDecl::Create (*ast,
Greg Claytonf51de672010-10-01 02:31:07 +00001462 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001463 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001464 DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
Greg Claytonf51de672010-10-01 02:31:07 +00001465 method_qual_type,
1466 NULL, // TypeSourceInfo *
1467 is_explicit,
1468 is_inline,
1469 is_implicitly_declared);
1470 }
1471 else
Greg Clayton878eaf12010-10-01 03:45:20 +00001472 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001473
1474 OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1475 if (IsOperator (name, op_kind))
Greg Clayton878eaf12010-10-01 03:45:20 +00001476 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001477 if (op_kind != NUM_OVERLOADED_OPERATORS)
1478 {
Greg Clayton090d0982011-06-19 03:43:27 +00001479 // Check the number of operator parameters. Sometimes we have
1480 // seen bad DWARF that doesn't correctly describe operators and
1481 // if we try to create a methed and add it to the class, clang
1482 // will assert and crash, so we need to make sure things are
1483 // acceptable.
1484 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
1485 return NULL;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001486 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001487 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001488 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001489 DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001490 method_qual_type,
1491 NULL, // TypeSourceInfo *
Greg Claytona3c444a2010-10-01 23:13:49 +00001492 is_static,
1493 SC_None,
Sean Callananfb0b7582011-03-15 00:17:19 +00001494 is_inline,
1495 SourceLocation());
Greg Claytona3c444a2010-10-01 23:13:49 +00001496 }
1497 else if (num_params == 0)
1498 {
1499 // Conversion operators don't take params...
Greg Clayton6beaaa62011-01-17 03:46:26 +00001500 cxx_method_decl = CXXConversionDecl::Create (*ast,
Greg Claytona3c444a2010-10-01 23:13:49 +00001501 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001502 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001503 DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
Greg Claytona3c444a2010-10-01 23:13:49 +00001504 method_qual_type,
1505 NULL, // TypeSourceInfo *
1506 is_inline,
Sean Callananfb0b7582011-03-15 00:17:19 +00001507 is_explicit,
1508 SourceLocation());
Greg Claytona3c444a2010-10-01 23:13:49 +00001509 }
Greg Clayton878eaf12010-10-01 03:45:20 +00001510 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001511
1512 if (cxx_method_decl == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001513 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001514 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001515 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001516 SourceLocation(),
Greg Claytona3c444a2010-10-01 23:13:49 +00001517 DeclarationNameInfo (decl_name, SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001518 method_qual_type,
1519 NULL, // TypeSourceInfo *
1520 is_static,
1521 SC_None,
Sean Callananfb0b7582011-03-15 00:17:19 +00001522 is_inline,
1523 SourceLocation());
Greg Clayton878eaf12010-10-01 03:45:20 +00001524 }
Greg Claytonf51de672010-10-01 02:31:07 +00001525 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001526
Greg Clayton1be10fc2010-09-29 01:12:09 +00001527 AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
Greg Clayton0fffff52010-09-24 05:15:53 +00001528
1529 cxx_method_decl->setAccess (access_specifier);
1530 cxx_method_decl->setVirtualAsWritten (is_virtual);
Sean Callanane2ef6e32010-09-23 03:01:22 +00001531
Sean Callananfc55f5d2010-09-21 00:44:12 +00001532 // Populate the method decl with parameter decls
Sean Callananfc55f5d2010-09-21 00:44:12 +00001533
Charles Davis8c444c42011-05-19 23:33:46 +00001534 llvm::SmallVector<ParmVarDecl *, 12> params;
Sean Callananfc55f5d2010-09-21 00:44:12 +00001535
1536 for (int param_index = 0;
1537 param_index < num_params;
1538 ++param_index)
1539 {
Charles Davis8c444c42011-05-19 23:33:46 +00001540 params.push_back (ParmVarDecl::Create (*ast,
1541 cxx_method_decl,
1542 SourceLocation(),
1543 SourceLocation(),
1544 NULL, // anonymous
1545 method_function_prototype->getArgType(param_index),
1546 NULL,
1547 SC_None,
1548 SC_None,
1549 NULL));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001550 }
1551
Charles Davis8c444c42011-05-19 23:33:46 +00001552 cxx_method_decl->setParams (params.data(), num_params);
Sean Callananfc55f5d2010-09-21 00:44:12 +00001553
Greg Clayton0fffff52010-09-24 05:15:53 +00001554 cxx_record_decl->addDecl (cxx_method_decl);
Greg Claytonc432c192011-01-20 04:18:48 +00001555
1556// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
1557// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
1558// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
1559// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
1560// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
1561// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
1562// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
1563// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
1564// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
Greg Claytona51ed9b2010-09-23 01:09:21 +00001565 return cxx_method_decl;
Sean Callanan61da09b2010-09-17 02:58:26 +00001566}
1567
1568bool
Greg Clayton8cf05932010-07-22 18:30:50 +00001569ClangASTContext::AddFieldToRecordType
1570(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001571 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001572 clang_type_t record_clang_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001573 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001574 clang_type_t field_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001575 AccessType access,
1576 uint32_t bitfield_bit_size
1577)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001578{
1579 if (record_clang_type == NULL || field_type == NULL)
1580 return false;
1581
Greg Clayton6beaaa62011-01-17 03:46:26 +00001582 IdentifierTable *identifier_table = &ast->Idents;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001583
Greg Clayton6beaaa62011-01-17 03:46:26 +00001584 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001585 assert (identifier_table != NULL);
1586
1587 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
1588
Sean Callanan78e37602011-01-27 04:42:51 +00001589 const clang::Type *clang_type = record_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001590 if (clang_type)
1591 {
1592 const RecordType *record_type = dyn_cast<RecordType>(clang_type);
1593
1594 if (record_type)
1595 {
1596 RecordDecl *record_decl = record_type->getDecl();
1597
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001598 clang::Expr *bit_width = NULL;
1599 if (bitfield_bit_size != 0)
1600 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001601 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1602 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001603 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001604 FieldDecl *field = FieldDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001605 record_decl,
1606 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00001607 SourceLocation(),
Greg Clayton8cf05932010-07-22 18:30:50 +00001608 name ? &identifier_table->get(name) : NULL, // Identifier
1609 QualType::getFromOpaquePtr(field_type), // Field type
Sean Callanancc427fa2011-07-30 02:42:06 +00001610 NULL, // TInfo *
Greg Clayton8cf05932010-07-22 18:30:50 +00001611 bit_width, // BitWidth
Sean Callanancc427fa2011-07-30 02:42:06 +00001612 false, // Mutable
1613 false); // HasInit
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001614
Greg Clayton8cf05932010-07-22 18:30:50 +00001615 field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001616
1617 if (field)
1618 {
1619 record_decl->addDecl(field);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001620 }
1621 }
Greg Clayton9e409562010-07-28 02:04:09 +00001622 else
1623 {
Sean Callanan78e37602011-01-27 04:42:51 +00001624 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
Greg Clayton9e409562010-07-28 02:04:09 +00001625 if (objc_class_type)
1626 {
Greg Clayton0fffff52010-09-24 05:15:53 +00001627 bool is_synthesized = false;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001628 ClangASTContext::AddObjCClassIVar (ast,
Sean Callanan6e6a7c72010-09-16 20:01:08 +00001629 record_clang_type,
Greg Clayton9e409562010-07-28 02:04:09 +00001630 name,
1631 field_type,
1632 access,
1633 bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00001634 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00001635 }
1636 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001637 }
1638 return false;
1639}
1640
1641bool
1642ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1643{
1644 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1645}
1646
1647bool
1648ClangASTContext::FieldIsBitfield
1649(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001650 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001651 FieldDecl* field,
1652 uint32_t& bitfield_bit_size
1653)
1654{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001655 if (ast == NULL || field == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001656 return false;
1657
1658 if (field->isBitField())
1659 {
1660 Expr* bit_width_expr = field->getBitWidth();
1661 if (bit_width_expr)
1662 {
1663 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001664 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001665 {
1666 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1667 return true;
1668 }
1669 }
1670 }
1671 return false;
1672}
1673
1674bool
1675ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1676{
1677 if (record_decl == NULL)
1678 return false;
1679
1680 if (!record_decl->field_empty())
1681 return true;
1682
1683 // No fields, lets check this is a CXX record and check the base classes
1684 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1685 if (cxx_record_decl)
1686 {
1687 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1688 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1689 base_class != base_class_end;
1690 ++base_class)
1691 {
1692 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1693 if (RecordHasFields(base_class_decl))
1694 return true;
1695 }
1696 }
1697 return false;
1698}
1699
1700void
Greg Clayton6beaaa62011-01-17 03:46:26 +00001701ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001702{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001703 if (clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001704 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001705 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1706
Sean Callanan78e37602011-01-27 04:42:51 +00001707 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00001708 if (record_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001709 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001710 RecordDecl *record_decl = record_type->getDecl();
1711 if (record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001712 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001713 uint32_t field_idx;
1714 RecordDecl::field_iterator field, field_end;
1715 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
1716 field != field_end;
1717 ++field, ++field_idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001718 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001719 // If no accessibility was assigned, assign the correct one
1720 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
1721 field->setAccess ((AccessSpecifier)default_accessibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001722 }
1723 }
1724 }
1725 }
1726}
1727
1728#pragma mark C++ Base Classes
1729
1730CXXBaseSpecifier *
Greg Clayton1be10fc2010-09-29 01:12:09 +00001731ClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001732{
1733 if (base_class_type)
Greg Claytone6371122010-07-30 20:30:44 +00001734 return new CXXBaseSpecifier (SourceRange(),
1735 is_virtual,
1736 base_of_class,
1737 ConvertAccessTypeToAccessSpecifier (access),
Sean Callanan2c777c42011-01-18 23:32:05 +00001738 getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
1739 SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001740 return NULL;
1741}
1742
Greg Clayton0b42ac32010-07-02 01:29:13 +00001743void
1744ClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1745{
1746 for (unsigned i=0; i<num_base_classes; ++i)
1747 {
1748 delete base_classes[i];
1749 base_classes[i] = NULL;
1750 }
1751}
1752
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001753bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00001754ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001755{
1756 if (class_clang_type)
1757 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001758 CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
1759 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001760 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001761 cxx_record_decl->setBases(base_classes, num_base_classes);
1762 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001763 }
1764 }
1765 return false;
1766}
Greg Clayton8cf05932010-07-22 18:30:50 +00001767#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001768
Greg Clayton1be10fc2010-09-29 01:12:09 +00001769clang_type_t
Greg Clayton8cf05932010-07-22 18:30:50 +00001770ClangASTContext::CreateObjCClass
1771(
1772 const char *name,
1773 DeclContext *decl_ctx,
1774 bool isForwardDecl,
1775 bool isInternal
1776)
1777{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001778 ASTContext *ast = getASTContext();
1779 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00001780 assert (name && name[0]);
1781 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001782 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00001783
1784 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1785 // we will need to update this code. I was told to currently always use
1786 // the CXXRecordDecl class since we often don't know from debug information
1787 // if something is struct or a class, so we default to always use the more
1788 // complete definition just in case.
Greg Clayton6beaaa62011-01-17 03:46:26 +00001789 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001790 decl_ctx,
1791 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001792 &ast->Idents.get(name),
Greg Clayton8cf05932010-07-22 18:30:50 +00001793 SourceLocation(),
1794 isForwardDecl,
1795 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00001796
Greg Clayton6beaaa62011-01-17 03:46:26 +00001797 return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00001798}
1799
1800bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00001801ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
Greg Clayton8cf05932010-07-22 18:30:50 +00001802{
1803 if (class_opaque_type && super_opaque_type)
1804 {
1805 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
1806 QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
Sean Callanan78e37602011-01-27 04:42:51 +00001807 const clang::Type *class_type = class_qual_type.getTypePtr();
1808 const clang::Type *super_type = super_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00001809 if (class_type && super_type)
1810 {
Sean Callanan78e37602011-01-27 04:42:51 +00001811 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
1812 const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00001813 if (objc_class_type && objc_super_type)
1814 {
1815 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1816 ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
1817 if (class_interface_decl && super_interface_decl)
1818 {
1819 class_interface_decl->setSuperClass(super_interface_decl);
1820 return true;
1821 }
1822 }
1823 }
1824 }
1825 return false;
1826}
1827
1828
1829bool
1830ClangASTContext::AddObjCClassIVar
1831(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001832 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001833 clang_type_t class_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001834 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001835 clang_type_t ivar_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001836 AccessType access,
1837 uint32_t bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00001838 bool is_synthesized
Greg Clayton8cf05932010-07-22 18:30:50 +00001839)
1840{
1841 if (class_opaque_type == NULL || ivar_opaque_type == NULL)
1842 return false;
1843
Greg Clayton6beaaa62011-01-17 03:46:26 +00001844 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton8cf05932010-07-22 18:30:50 +00001845
Greg Clayton6beaaa62011-01-17 03:46:26 +00001846 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00001847 assert (identifier_table != NULL);
1848
1849 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
1850
Sean Callanan78e37602011-01-27 04:42:51 +00001851 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00001852 if (class_type)
1853 {
Sean Callanan78e37602011-01-27 04:42:51 +00001854 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00001855
1856 if (objc_class_type)
1857 {
1858 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1859
1860 if (class_interface_decl)
1861 {
1862 clang::Expr *bit_width = NULL;
1863 if (bitfield_bit_size != 0)
1864 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001865 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1866 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Greg Clayton8cf05932010-07-22 18:30:50 +00001867 }
1868
Greg Clayton6beaaa62011-01-17 03:46:26 +00001869 ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast,
Greg Clayton9e409562010-07-28 02:04:09 +00001870 class_interface_decl,
1871 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00001872 SourceLocation(),
Greg Clayton9e409562010-07-28 02:04:09 +00001873 &identifier_table->get(name), // Identifier
1874 QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
1875 NULL, // TypeSourceInfo *
1876 ConvertAccessTypeToObjCIvarAccessControl (access),
1877 bit_width,
Greg Clayton0fffff52010-09-24 05:15:53 +00001878 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00001879
1880 if (field)
1881 {
1882 class_interface_decl->addDecl(field);
1883 return true;
1884 }
Greg Clayton8cf05932010-07-22 18:30:50 +00001885 }
1886 }
1887 }
1888 return false;
1889}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001890
Greg Clayton9e409562010-07-28 02:04:09 +00001891
1892bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00001893ClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
Greg Clayton9e409562010-07-28 02:04:09 +00001894{
1895 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
1896
Sean Callanan78e37602011-01-27 04:42:51 +00001897 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton9e409562010-07-28 02:04:09 +00001898 if (class_type)
1899 {
Sean Callanan78e37602011-01-27 04:42:51 +00001900 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton9e409562010-07-28 02:04:09 +00001901
1902 if (objc_class_type)
1903 return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
1904 }
1905 return false;
1906}
1907
1908bool
1909ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
1910{
1911 while (class_interface_decl)
1912 {
1913 if (class_interface_decl->ivar_size() > 0)
1914 return true;
1915
1916 if (check_superclass)
1917 class_interface_decl = class_interface_decl->getSuperClass();
1918 else
1919 break;
1920 }
1921 return false;
1922}
Greg Clayton0fffff52010-09-24 05:15:53 +00001923
Greg Clayton1be10fc2010-09-29 01:12:09 +00001924ObjCMethodDecl *
Greg Clayton0fffff52010-09-24 05:15:53 +00001925ClangASTContext::AddMethodToObjCObjectType
1926(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001927 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001928 clang_type_t class_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00001929 const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
Greg Clayton1be10fc2010-09-29 01:12:09 +00001930 clang_type_t method_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00001931 lldb::AccessType access
1932)
1933{
1934 if (class_opaque_type == NULL || method_opaque_type == NULL)
1935 return NULL;
1936
Greg Clayton6beaaa62011-01-17 03:46:26 +00001937 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton0fffff52010-09-24 05:15:53 +00001938
Greg Clayton6beaaa62011-01-17 03:46:26 +00001939 assert (ast != NULL);
Greg Clayton0fffff52010-09-24 05:15:53 +00001940 assert (identifier_table != NULL);
1941
1942 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
1943
Sean Callanan78e37602011-01-27 04:42:51 +00001944 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton0fffff52010-09-24 05:15:53 +00001945 if (class_type == NULL)
1946 return NULL;
1947
Sean Callanan78e37602011-01-27 04:42:51 +00001948 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton0fffff52010-09-24 05:15:53 +00001949
1950 if (objc_class_type == NULL)
1951 return NULL;
1952
1953 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1954
1955 if (class_interface_decl == NULL)
1956 return NULL;
Greg Clayton9e409562010-07-28 02:04:09 +00001957
Greg Clayton0fffff52010-09-24 05:15:53 +00001958 const char *selector_start = ::strchr (name, ' ');
1959 if (selector_start == NULL)
1960 return NULL;
1961
1962 selector_start++;
1963 if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
1964 return NULL;
1965 llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
1966
Greg Clayton450e3f32010-10-12 02:24:53 +00001967 size_t len = 0;
Greg Clayton0fffff52010-09-24 05:15:53 +00001968 const char *start;
Greg Clayton450e3f32010-10-12 02:24:53 +00001969 //printf ("name = '%s'\n", name);
1970
1971 unsigned num_selectors_with_args = 0;
1972 for (start = selector_start;
Greg Clayton0fffff52010-09-24 05:15:53 +00001973 start && *start != '\0' && *start != ']';
Greg Clayton450e3f32010-10-12 02:24:53 +00001974 start += len)
Greg Clayton0fffff52010-09-24 05:15:53 +00001975 {
Greg Clayton450e3f32010-10-12 02:24:53 +00001976 len = ::strcspn(start, ":]");
Greg Clayton90f90cd2010-10-27 04:01:14 +00001977 bool has_arg = (start[len] == ':');
1978 if (has_arg)
Greg Clayton450e3f32010-10-12 02:24:53 +00001979 ++num_selectors_with_args;
Greg Clayton0fffff52010-09-24 05:15:53 +00001980 selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
Greg Clayton90f90cd2010-10-27 04:01:14 +00001981 if (has_arg)
1982 len += 1;
Greg Clayton0fffff52010-09-24 05:15:53 +00001983 }
1984
1985
1986 if (selector_idents.size() == 0)
1987 return 0;
1988
Greg Clayton6beaaa62011-01-17 03:46:26 +00001989 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
Greg Clayton0fffff52010-09-24 05:15:53 +00001990 selector_idents.data());
1991
1992 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
1993
1994 // Populate the method decl with parameter decls
Sean Callanan78e37602011-01-27 04:42:51 +00001995 const clang::Type *method_type(method_qual_type.getTypePtr());
Greg Clayton0fffff52010-09-24 05:15:53 +00001996
1997 if (method_type == NULL)
1998 return NULL;
1999
Sean Callanan78e37602011-01-27 04:42:51 +00002000 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00002001
2002 if (!method_function_prototype)
2003 return NULL;
2004
2005
2006 bool is_variadic = false;
2007 bool is_synthesized = false;
2008 bool is_defined = false;
2009 ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
2010
2011 const unsigned num_args = method_function_prototype->getNumArgs();
2012
Greg Clayton6beaaa62011-01-17 03:46:26 +00002013 ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00002014 SourceLocation(), // beginLoc,
2015 SourceLocation(), // endLoc,
2016 method_selector,
2017 method_function_prototype->getResultType(),
2018 NULL, // TypeSourceInfo *ResultTInfo,
2019 GetDeclContextForType (class_opaque_type),
2020 name[0] == '-',
2021 is_variadic,
2022 is_synthesized,
2023 is_defined,
2024 imp_control,
2025 num_args);
2026
2027
2028 if (objc_method_decl == NULL)
2029 return NULL;
2030
2031 if (num_args > 0)
2032 {
2033 llvm::SmallVector<ParmVarDecl *, 12> params;
2034
2035 for (int param_index = 0; param_index < num_args; ++param_index)
2036 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002037 params.push_back (ParmVarDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00002038 objc_method_decl,
2039 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00002040 SourceLocation(),
Greg Clayton0fffff52010-09-24 05:15:53 +00002041 NULL, // anonymous
2042 method_function_prototype->getArgType(param_index),
2043 NULL,
2044 SC_Auto,
2045 SC_Auto,
2046 NULL));
2047 }
2048
Greg Clayton6beaaa62011-01-17 03:46:26 +00002049 objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args);
Greg Clayton0fffff52010-09-24 05:15:53 +00002050 }
2051
2052 class_interface_decl->addDecl (objc_method_decl);
2053
2054
2055 return objc_method_decl;
2056}
2057
2058
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002059uint32_t
Greg Clayton73b472d2010-10-27 03:32:59 +00002060ClangASTContext::GetTypeInfo
2061(
2062 clang_type_t clang_type,
Greg Clayton6beaaa62011-01-17 03:46:26 +00002063 clang::ASTContext *ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002064 clang_type_t *pointee_or_element_clang_type
2065)
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002066{
2067 if (clang_type == NULL)
Greg Clayton73b472d2010-10-27 03:32:59 +00002068 return 0;
2069
2070 if (pointee_or_element_clang_type)
2071 *pointee_or_element_clang_type = NULL;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002072
2073 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2074
2075 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2076 switch (type_class)
2077 {
Sean Callanana2424172010-10-25 00:29:48 +00002078 case clang::Type::Builtin:
2079 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2080 {
Sean Callanana2424172010-10-25 00:29:48 +00002081 case clang::BuiltinType::ObjCId:
2082 case clang::BuiltinType::ObjCClass:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002083 if (ast && pointee_or_element_clang_type)
2084 *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Sean Callanana2424172010-10-25 00:29:48 +00002085 return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
Enrico Granataf9fa6ee2011-07-12 00:18:11 +00002086 break;
2087 case clang::BuiltinType::Bool:
2088 case clang::BuiltinType::Char_U:
2089 case clang::BuiltinType::UChar:
2090 case clang::BuiltinType::WChar_U:
2091 case clang::BuiltinType::Char16:
2092 case clang::BuiltinType::Char32:
2093 case clang::BuiltinType::UShort:
2094 case clang::BuiltinType::UInt:
2095 case clang::BuiltinType::ULong:
2096 case clang::BuiltinType::ULongLong:
2097 case clang::BuiltinType::UInt128:
2098 case clang::BuiltinType::Char_S:
2099 case clang::BuiltinType::SChar:
2100 case clang::BuiltinType::WChar_S:
2101 case clang::BuiltinType::Short:
2102 case clang::BuiltinType::Int:
2103 case clang::BuiltinType::Long:
2104 case clang::BuiltinType::LongLong:
2105 case clang::BuiltinType::Int128:
2106 case clang::BuiltinType::Float:
2107 case clang::BuiltinType::Double:
2108 case clang::BuiltinType::LongDouble:
2109 return eTypeIsBuiltIn | eTypeHasValue | eTypeIsScalar;
Greg Clayton73b472d2010-10-27 03:32:59 +00002110 default:
2111 break;
Sean Callanana2424172010-10-25 00:29:48 +00002112 }
2113 return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002114
2115 case clang::Type::BlockPointer:
2116 if (pointee_or_element_clang_type)
2117 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2118 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2119
Greg Clayton49462ea2011-01-15 02:52:14 +00002120 case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002121
2122 case clang::Type::ConstantArray:
2123 case clang::Type::DependentSizedArray:
2124 case clang::Type::IncompleteArray:
2125 case clang::Type::VariableArray:
2126 if (pointee_or_element_clang_type)
2127 *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2128 return eTypeHasChildren | eTypeIsArray;
2129
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002130 case clang::Type::DependentName: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002131 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
2132 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
2133 case clang::Type::Decltype: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002134
2135 case clang::Type::Enum:
2136 if (pointee_or_element_clang_type)
2137 *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2138 return eTypeIsEnumeration | eTypeHasValue;
2139
Sean Callanan912855f2011-08-11 23:56:13 +00002140 case clang::Type::Elaborated:
2141 return ClangASTContext::GetTypeInfo (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2142 ast,
2143 pointee_or_element_clang_type);
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002144 case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector;
2145 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
2146 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002147 case clang::Type::InjectedClassName: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002148
2149 case clang::Type::LValueReference:
2150 case clang::Type::RValueReference:
2151 if (pointee_or_element_clang_type)
2152 *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2153 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2154
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002155 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002156
2157 case clang::Type::ObjCObjectPointer:
2158 if (pointee_or_element_clang_type)
2159 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2160 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2161
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002162 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2163 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
Greg Clayton73b472d2010-10-27 03:32:59 +00002164
2165 case clang::Type::Pointer:
2166 if (pointee_or_element_clang_type)
2167 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2168 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2169
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002170 case clang::Type::Record:
2171 if (qual_type->getAsCXXRecordDecl())
2172 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2173 else
2174 return eTypeHasChildren | eTypeIsStructUnion;
2175 break;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002176 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
2177 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
2178 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
Greg Clayton73b472d2010-10-27 03:32:59 +00002179
2180 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002181 return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00002182 ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002183 pointee_or_element_clang_type);
2184
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002185 case clang::Type::TypeOfExpr: return 0;
2186 case clang::Type::TypeOf: return 0;
2187 case clang::Type::UnresolvedUsing: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002188 case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector;
2189 default: return 0;
2190 }
2191 return 0;
2192}
2193
Greg Clayton9e409562010-07-28 02:04:09 +00002194
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002195#pragma mark Aggregate Types
2196
2197bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002198ClangASTContext::IsAggregateType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002199{
2200 if (clang_type == NULL)
2201 return false;
2202
2203 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2204
Greg Clayton737b9322010-09-13 03:32:57 +00002205 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2206 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002207 {
Greg Claytone1a916a2010-07-21 22:12:05 +00002208 case clang::Type::IncompleteArray:
2209 case clang::Type::VariableArray:
2210 case clang::Type::ConstantArray:
2211 case clang::Type::ExtVector:
2212 case clang::Type::Vector:
2213 case clang::Type::Record:
Greg Clayton9e409562010-07-28 02:04:09 +00002214 case clang::Type::ObjCObject:
2215 case clang::Type::ObjCInterface:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002216 return true;
Sean Callanan912855f2011-08-11 23:56:13 +00002217 case clang::Type::Elaborated:
2218 return ClangASTContext::IsAggregateType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Claytone1a916a2010-07-21 22:12:05 +00002219 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002220 return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002221
2222 default:
2223 break;
2224 }
2225 // The clang type does have a value
2226 return false;
2227}
2228
2229uint32_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00002230ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002231{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002232 if (clang_type == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002233 return 0;
2234
2235 uint32_t num_children = 0;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002236 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00002237 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2238 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002239 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002240 case clang::Type::Builtin:
2241 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2242 {
Greg Clayton73b472d2010-10-27 03:32:59 +00002243 case clang::BuiltinType::ObjCId: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002244 case clang::BuiltinType::ObjCClass: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002245 num_children = 1;
Greg Clayton73b472d2010-10-27 03:32:59 +00002246 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002247
2248 default:
2249 break;
2250 }
2251 break;
Greg Clayton54979cd2010-12-15 05:08:08 +00002252
Greg Clayton49462ea2011-01-15 02:52:14 +00002253 case clang::Type::Complex: return 0;
Greg Clayton54979cd2010-12-15 05:08:08 +00002254
Greg Claytone1a916a2010-07-21 22:12:05 +00002255 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00002256 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002257 {
2258 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
2259 const RecordDecl *record_decl = record_type->getDecl();
2260 assert(record_decl);
2261 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2262 if (cxx_record_decl)
2263 {
2264 if (omit_empty_base_classes)
2265 {
2266 // Check each base classes to see if it or any of its
2267 // base classes contain any fields. This can help
2268 // limit the noise in variable views by not having to
2269 // show base classes that contain no members.
2270 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2271 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2272 base_class != base_class_end;
2273 ++base_class)
2274 {
2275 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2276
2277 // Skip empty base classes
2278 if (RecordHasFields(base_class_decl) == false)
2279 continue;
2280
2281 num_children++;
2282 }
2283 }
2284 else
2285 {
2286 // Include all base classes
2287 num_children += cxx_record_decl->getNumBases();
2288 }
2289
2290 }
2291 RecordDecl::field_iterator field, field_end;
2292 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
2293 ++num_children;
2294 }
2295 break;
2296
Greg Clayton9e409562010-07-28 02:04:09 +00002297 case clang::Type::ObjCObject:
2298 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00002299 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00002300 {
Sean Callanan78e37602011-01-27 04:42:51 +00002301 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002302 assert (objc_class_type);
2303 if (objc_class_type)
2304 {
2305 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2306
2307 if (class_interface_decl)
2308 {
2309
2310 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
2311 if (superclass_interface_decl)
2312 {
2313 if (omit_empty_base_classes)
2314 {
2315 if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
2316 ++num_children;
2317 }
2318 else
2319 ++num_children;
2320 }
2321
2322 num_children += class_interface_decl->ivar_size();
2323 }
2324 }
2325 }
2326 break;
2327
2328 case clang::Type::ObjCObjectPointer:
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002329 {
Sean Callanan78e37602011-01-27 04:42:51 +00002330 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002331 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00002332 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2333 pointee_type.getAsOpaquePtr(),
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002334 omit_empty_base_classes);
2335 // If this type points to a simple type, then it has 1 child
2336 if (num_pointee_children == 0)
2337 num_children = 1;
2338 else
2339 num_children = num_pointee_children;
2340 }
2341 break;
Greg Clayton9e409562010-07-28 02:04:09 +00002342
Greg Claytone1a916a2010-07-21 22:12:05 +00002343 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002344 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
2345 break;
2346
Greg Claytone1a916a2010-07-21 22:12:05 +00002347 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002348 {
Sean Callanan78e37602011-01-27 04:42:51 +00002349 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Greg Clayton54979cd2010-12-15 05:08:08 +00002350 QualType pointee_type (pointer_type->getPointeeType());
Greg Clayton6beaaa62011-01-17 03:46:26 +00002351 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2352 pointee_type.getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00002353 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002354 if (num_pointee_children == 0)
Greg Clayton54979cd2010-12-15 05:08:08 +00002355 {
2356 // We have a pointer to a pointee type that claims it has no children.
2357 // We will want to look at
2358 num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
2359 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002360 else
2361 num_children = num_pointee_children;
2362 }
2363 break;
2364
Greg Clayton73b472d2010-10-27 03:32:59 +00002365 case clang::Type::LValueReference:
2366 case clang::Type::RValueReference:
2367 {
Sean Callanan78e37602011-01-27 04:42:51 +00002368 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00002369 QualType pointee_type = reference_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00002370 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2371 pointee_type.getAsOpaquePtr(),
Greg Clayton73b472d2010-10-27 03:32:59 +00002372 omit_empty_base_classes);
2373 // If this type points to a simple type, then it has 1 child
2374 if (num_pointee_children == 0)
2375 num_children = 1;
2376 else
2377 num_children = num_pointee_children;
2378 }
2379 break;
2380
2381
Greg Claytone1a916a2010-07-21 22:12:05 +00002382 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002383 num_children = ClangASTContext::GetNumChildren (ast,
2384 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2385 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002386 break;
Sean Callanan912855f2011-08-11 23:56:13 +00002387
2388 case clang::Type::Elaborated:
2389 num_children = ClangASTContext::GetNumChildren (ast,
2390 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2391 omit_empty_base_classes);
2392 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002393
2394 default:
2395 break;
2396 }
2397 return num_children;
2398}
2399
Greg Clayton54979cd2010-12-15 05:08:08 +00002400// If a pointer to a pointee type (the clang_type arg) says that it has no
2401// children, then we either need to trust it, or override it and return a
2402// different result. For example, an "int *" has one child that is an integer,
2403// but a function pointer doesn't have any children. Likewise if a Record type
2404// claims it has no children, then there really is nothing to show.
2405uint32_t
2406ClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
2407{
2408 if (clang_type == NULL)
2409 return 0;
2410
2411 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2412 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2413 switch (type_class)
2414 {
Greg Clayton97a43712011-01-08 22:26:47 +00002415 case clang::Type::Builtin:
2416 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2417 {
Greg Clayton7260f622011-04-18 08:33:37 +00002418 case clang::BuiltinType::UnknownAny:
Greg Clayton97a43712011-01-08 22:26:47 +00002419 case clang::BuiltinType::Void:
2420 case clang::BuiltinType::NullPtr:
2421 return 0;
2422 case clang::BuiltinType::Bool:
2423 case clang::BuiltinType::Char_U:
2424 case clang::BuiltinType::UChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00002425 case clang::BuiltinType::WChar_U:
Greg Clayton97a43712011-01-08 22:26:47 +00002426 case clang::BuiltinType::Char16:
2427 case clang::BuiltinType::Char32:
2428 case clang::BuiltinType::UShort:
2429 case clang::BuiltinType::UInt:
2430 case clang::BuiltinType::ULong:
2431 case clang::BuiltinType::ULongLong:
2432 case clang::BuiltinType::UInt128:
2433 case clang::BuiltinType::Char_S:
2434 case clang::BuiltinType::SChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00002435 case clang::BuiltinType::WChar_S:
Greg Clayton97a43712011-01-08 22:26:47 +00002436 case clang::BuiltinType::Short:
2437 case clang::BuiltinType::Int:
2438 case clang::BuiltinType::Long:
2439 case clang::BuiltinType::LongLong:
2440 case clang::BuiltinType::Int128:
2441 case clang::BuiltinType::Float:
2442 case clang::BuiltinType::Double:
2443 case clang::BuiltinType::LongDouble:
2444 case clang::BuiltinType::Dependent:
2445 case clang::BuiltinType::Overload:
Greg Clayton97a43712011-01-08 22:26:47 +00002446 case clang::BuiltinType::ObjCId:
2447 case clang::BuiltinType::ObjCClass:
2448 case clang::BuiltinType::ObjCSel:
Sean Callanand12cf8bb2011-05-15 22:34:38 +00002449 case clang::BuiltinType::BoundMember:
Greg Clayton97a43712011-01-08 22:26:47 +00002450 return 1;
2451 }
2452 break;
2453
Greg Clayton49462ea2011-01-15 02:52:14 +00002454 case clang::Type::Complex: return 1;
Greg Clayton54979cd2010-12-15 05:08:08 +00002455 case clang::Type::Pointer: return 1;
2456 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
2457 case clang::Type::LValueReference: return 1;
2458 case clang::Type::RValueReference: return 1;
2459 case clang::Type::MemberPointer: return 0;
2460 case clang::Type::ConstantArray: return 0;
2461 case clang::Type::IncompleteArray: return 0;
2462 case clang::Type::VariableArray: return 0;
2463 case clang::Type::DependentSizedArray: return 0;
2464 case clang::Type::DependentSizedExtVector: return 0;
2465 case clang::Type::Vector: return 0;
2466 case clang::Type::ExtVector: return 0;
2467 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
2468 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
2469 case clang::Type::UnresolvedUsing: return 0;
2470 case clang::Type::Paren: return 0;
2471 case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00002472 case clang::Type::Elaborated: return ClangASTContext::GetNumPointeeChildren (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton54979cd2010-12-15 05:08:08 +00002473 case clang::Type::TypeOfExpr: return 0;
2474 case clang::Type::TypeOf: return 0;
2475 case clang::Type::Decltype: return 0;
2476 case clang::Type::Record: return 0;
2477 case clang::Type::Enum: return 1;
Greg Clayton54979cd2010-12-15 05:08:08 +00002478 case clang::Type::TemplateTypeParm: return 1;
2479 case clang::Type::SubstTemplateTypeParm: return 1;
2480 case clang::Type::TemplateSpecialization: return 1;
2481 case clang::Type::InjectedClassName: return 0;
2482 case clang::Type::DependentName: return 1;
2483 case clang::Type::DependentTemplateSpecialization: return 1;
2484 case clang::Type::ObjCObject: return 0;
2485 case clang::Type::ObjCInterface: return 0;
2486 case clang::Type::ObjCObjectPointer: return 1;
2487 default:
2488 break;
2489 }
2490 return 0;
2491}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002492
Greg Clayton1be10fc2010-09-29 01:12:09 +00002493clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002494ClangASTContext::GetChildClangTypeAtIndex
2495(
Jim Inghamd555bac2011-06-24 22:03:24 +00002496 ExecutionContext *exe_ctx,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002497 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002498 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002499 uint32_t idx,
2500 bool transparent_pointers,
2501 bool omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00002502 bool ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002503 std::string& child_name,
2504 uint32_t &child_byte_size,
2505 int32_t &child_byte_offset,
2506 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002507 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002508 bool &child_is_base_class,
2509 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002510)
2511{
2512 if (parent_clang_type)
2513
Jim Inghamd555bac2011-06-24 22:03:24 +00002514 return GetChildClangTypeAtIndex (exe_ctx,
2515 getASTContext(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002516 parent_name,
2517 parent_clang_type,
2518 idx,
2519 transparent_pointers,
2520 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00002521 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002522 child_name,
2523 child_byte_size,
2524 child_byte_offset,
2525 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002526 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002527 child_is_base_class,
2528 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002529 return NULL;
2530}
2531
Greg Clayton1be10fc2010-09-29 01:12:09 +00002532clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002533ClangASTContext::GetChildClangTypeAtIndex
2534(
Jim Inghamd555bac2011-06-24 22:03:24 +00002535 ExecutionContext *exe_ctx,
Greg Clayton6beaaa62011-01-17 03:46:26 +00002536 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002537 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002538 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002539 uint32_t idx,
2540 bool transparent_pointers,
2541 bool omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00002542 bool ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002543 std::string& child_name,
2544 uint32_t &child_byte_size,
2545 int32_t &child_byte_offset,
2546 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002547 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002548 bool &child_is_base_class,
2549 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002550)
2551{
2552 if (parent_clang_type == NULL)
2553 return NULL;
2554
Greg Clayton6beaaa62011-01-17 03:46:26 +00002555 if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002556 {
2557 uint32_t bit_offset;
2558 child_bitfield_bit_size = 0;
2559 child_bitfield_bit_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002560 child_is_base_class = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002561 QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00002562 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
2563 switch (parent_type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002564 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002565 case clang::Type::Builtin:
2566 switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
2567 {
2568 case clang::BuiltinType::ObjCId:
2569 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00002570 child_name = "isa";
Greg Clayton6beaaa62011-01-17 03:46:26 +00002571 child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
2572 return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002573
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002574 default:
2575 break;
2576 }
2577 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002578
Greg Claytone1a916a2010-07-21 22:12:05 +00002579 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00002580 if (GetCompleteQualType (ast, parent_qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002581 {
2582 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
2583 const RecordDecl *record_decl = record_type->getDecl();
2584 assert(record_decl);
Greg Clayton6beaaa62011-01-17 03:46:26 +00002585 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002586 uint32_t child_idx = 0;
2587
2588 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2589 if (cxx_record_decl)
2590 {
2591 // We might have base classes to print out first
2592 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2593 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2594 base_class != base_class_end;
2595 ++base_class)
2596 {
2597 const CXXRecordDecl *base_class_decl = NULL;
2598
2599 // Skip empty base classes
2600 if (omit_empty_base_classes)
2601 {
2602 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2603 if (RecordHasFields(base_class_decl) == false)
2604 continue;
2605 }
2606
2607 if (idx == child_idx)
2608 {
2609 if (base_class_decl == NULL)
2610 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2611
2612
2613 if (base_class->isVirtual())
Greg Clayton6ed95942011-01-22 07:12:45 +00002614 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002615 else
Greg Clayton6ed95942011-01-22 07:12:45 +00002616 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002617
2618 // Base classes should be a multiple of 8 bits in size
2619 assert (bit_offset % 8 == 0);
2620 child_byte_offset = bit_offset/8;
Greg Claytone3055942011-06-30 02:28:26 +00002621
2622 child_name = ClangASTType::GetTypeNameForQualType(base_class->getType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002623
Greg Clayton6beaaa62011-01-17 03:46:26 +00002624 uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002625
Jim Inghamf46b3382011-04-15 23:42:06 +00002626 // Base classes bit sizes should be a multiple of 8 bits in size
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002627 assert (clang_type_info_bit_size % 8 == 0);
2628 child_byte_size = clang_type_info_bit_size / 8;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002629 child_is_base_class = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002630 return base_class->getType().getAsOpaquePtr();
2631 }
2632 // We don't increment the child index in the for loop since we might
2633 // be skipping empty base classes
2634 ++child_idx;
2635 }
2636 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002637 // Make sure index is in range...
2638 uint32_t field_idx = 0;
2639 RecordDecl::field_iterator field, field_end;
2640 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
2641 {
2642 if (idx == child_idx)
2643 {
2644 // Print the member type if requested
2645 // Print the member name and equal sign
2646 child_name.assign(field->getNameAsString().c_str());
2647
2648 // Figure out the type byte size (field_type_info.first) and
2649 // alignment (field_type_info.second) from the AST context.
Greg Clayton6beaaa62011-01-17 03:46:26 +00002650 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
Greg Claytonc982c762010-07-09 20:39:50 +00002651 assert(field_idx < record_layout.getFieldCount());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002652
2653 child_byte_size = field_type_info.first / 8;
2654
2655 // Figure out the field offset within the current struct/union/class type
2656 bit_offset = record_layout.getFieldOffset (field_idx);
2657 child_byte_offset = bit_offset / 8;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002658 if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002659 child_bitfield_bit_offset = bit_offset % 8;
2660
2661 return field->getType().getAsOpaquePtr();
2662 }
2663 }
2664 }
2665 break;
2666
Greg Clayton9e409562010-07-28 02:04:09 +00002667 case clang::Type::ObjCObject:
2668 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00002669 if (GetCompleteQualType (ast, parent_qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00002670 {
Sean Callanan78e37602011-01-27 04:42:51 +00002671 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002672 assert (objc_class_type);
2673 if (objc_class_type)
2674 {
2675 uint32_t child_idx = 0;
2676 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2677
2678 if (class_interface_decl)
2679 {
2680
Greg Clayton6beaaa62011-01-17 03:46:26 +00002681 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Clayton9e409562010-07-28 02:04:09 +00002682 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
2683 if (superclass_interface_decl)
2684 {
2685 if (omit_empty_base_classes)
2686 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002687 if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
Greg Clayton9e409562010-07-28 02:04:09 +00002688 {
2689 if (idx == 0)
2690 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002691 QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
Greg Clayton9e409562010-07-28 02:04:09 +00002692
2693
2694 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
2695
Greg Clayton6beaaa62011-01-17 03:46:26 +00002696 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002697
2698 child_byte_size = ivar_type_info.first / 8;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002699 child_byte_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002700 child_is_base_class = true;
Greg Clayton9e409562010-07-28 02:04:09 +00002701
2702 return ivar_qual_type.getAsOpaquePtr();
2703 }
2704
2705 ++child_idx;
2706 }
2707 }
2708 else
2709 ++child_idx;
2710 }
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002711
2712 const uint32_t superclass_idx = child_idx;
Greg Clayton9e409562010-07-28 02:04:09 +00002713
2714 if (idx < (child_idx + class_interface_decl->ivar_size()))
2715 {
2716 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
2717
2718 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
2719 {
2720 if (child_idx == idx)
2721 {
2722 const ObjCIvarDecl* ivar_decl = *ivar_pos;
2723
2724 QualType ivar_qual_type(ivar_decl->getType());
2725
2726 child_name.assign(ivar_decl->getNameAsString().c_str());
2727
Greg Clayton6beaaa62011-01-17 03:46:26 +00002728 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002729
2730 child_byte_size = ivar_type_info.first / 8;
2731
2732 // Figure out the field offset within the current struct/union/class type
Jim Inghamd555bac2011-06-24 22:03:24 +00002733 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
2734 // that doesn't account for the space taken up by unbacked properties, or from
2735 // the changing size of base classes that are newer than this class.
2736 // So if we have a process around that we can ask about this object, do so.
2737 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
2738
2739 if (exe_ctx && exe_ctx->process)
2740 {
2741 ObjCLanguageRuntime *objc_runtime = exe_ctx->process->GetObjCLanguageRuntime();
2742 if (objc_runtime != NULL)
2743 {
Enrico Granata6f3533f2011-07-29 19:53:35 +00002744 ClangASTType parent_ast_type (ast, parent_qual_type.getAsOpaquePtr());
Jim Inghamd555bac2011-06-24 22:03:24 +00002745 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
2746 }
2747 }
2748
2749 if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
2750 {
2751 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
2752 child_byte_offset = bit_offset / 8;
2753 }
Greg Clayton9e409562010-07-28 02:04:09 +00002754
2755 return ivar_qual_type.getAsOpaquePtr();
2756 }
2757 ++child_idx;
2758 }
2759 }
2760 }
2761 }
2762 }
2763 break;
2764
2765 case clang::Type::ObjCObjectPointer:
2766 {
Sean Callanan78e37602011-01-27 04:42:51 +00002767 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002768 QualType pointee_type = pointer_type->getPointeeType();
2769
2770 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2771 {
Greg Claytone221f822011-01-21 01:59:00 +00002772 child_is_deref_of_parent = false;
2773 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00002774 return GetChildClangTypeAtIndex (exe_ctx,
2775 ast,
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002776 parent_name,
2777 pointer_type->getPointeeType().getAsOpaquePtr(),
2778 idx,
2779 transparent_pointers,
2780 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00002781 ignore_array_bounds,
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002782 child_name,
2783 child_byte_size,
2784 child_byte_offset,
2785 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002786 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002787 child_is_base_class,
2788 tmp_child_is_deref_of_parent);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002789 }
2790 else
2791 {
Greg Claytone221f822011-01-21 01:59:00 +00002792 child_is_deref_of_parent = true;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002793 if (parent_name)
2794 {
2795 child_name.assign(1, '*');
2796 child_name += parent_name;
2797 }
2798
2799 // We have a pointer to an simple type
2800 if (idx == 0)
2801 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002802 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002803 assert(clang_type_info.first % 8 == 0);
2804 child_byte_size = clang_type_info.first / 8;
2805 child_byte_offset = 0;
2806 return pointee_type.getAsOpaquePtr();
2807 }
2808 }
Greg Clayton9e409562010-07-28 02:04:09 +00002809 }
2810 break;
2811
Greg Claytone1a916a2010-07-21 22:12:05 +00002812 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002813 {
2814 const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
2815 const uint64_t element_count = array->getSize().getLimitedValue();
2816
Greg Claytondaf515f2011-07-09 20:12:33 +00002817 if (ignore_array_bounds || idx < element_count)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002818 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002819 if (GetCompleteQualType (ast, array->getElementType()))
2820 {
2821 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002822
Greg Clayton6beaaa62011-01-17 03:46:26 +00002823 char element_name[64];
2824 ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002825
Greg Clayton6beaaa62011-01-17 03:46:26 +00002826 child_name.assign(element_name);
2827 assert(field_type_info.first % 8 == 0);
2828 child_byte_size = field_type_info.first / 8;
Greg Claytondaf515f2011-07-09 20:12:33 +00002829 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002830 return array->getElementType().getAsOpaquePtr();
2831 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002832 }
2833 }
2834 break;
2835
Greg Claytone1a916a2010-07-21 22:12:05 +00002836 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002837 {
Sean Callanan78e37602011-01-27 04:42:51 +00002838 const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002839 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton97a43712011-01-08 22:26:47 +00002840
2841 // Don't dereference "void *" pointers
2842 if (pointee_type->isVoidType())
2843 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002844
2845 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2846 {
Greg Claytone221f822011-01-21 01:59:00 +00002847 child_is_deref_of_parent = false;
2848 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00002849 return GetChildClangTypeAtIndex (exe_ctx,
2850 ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002851 parent_name,
2852 pointer_type->getPointeeType().getAsOpaquePtr(),
2853 idx,
2854 transparent_pointers,
2855 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00002856 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002857 child_name,
2858 child_byte_size,
2859 child_byte_offset,
2860 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002861 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002862 child_is_base_class,
2863 tmp_child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002864 }
2865 else
2866 {
Greg Claytone221f822011-01-21 01:59:00 +00002867 child_is_deref_of_parent = true;
2868
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002869 if (parent_name)
2870 {
2871 child_name.assign(1, '*');
2872 child_name += parent_name;
2873 }
2874
2875 // We have a pointer to an simple type
2876 if (idx == 0)
2877 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002878 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002879 assert(clang_type_info.first % 8 == 0);
2880 child_byte_size = clang_type_info.first / 8;
2881 child_byte_offset = 0;
2882 return pointee_type.getAsOpaquePtr();
2883 }
2884 }
2885 }
2886 break;
2887
Greg Clayton73b472d2010-10-27 03:32:59 +00002888 case clang::Type::LValueReference:
2889 case clang::Type::RValueReference:
2890 {
Sean Callanan78e37602011-01-27 04:42:51 +00002891 const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00002892 QualType pointee_type(reference_type->getPointeeType());
2893 clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
2894 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
2895 {
Greg Claytone221f822011-01-21 01:59:00 +00002896 child_is_deref_of_parent = false;
2897 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00002898 return GetChildClangTypeAtIndex (exe_ctx,
2899 ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002900 parent_name,
2901 pointee_clang_type,
2902 idx,
2903 transparent_pointers,
2904 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00002905 ignore_array_bounds,
Greg Clayton73b472d2010-10-27 03:32:59 +00002906 child_name,
2907 child_byte_size,
2908 child_byte_offset,
2909 child_bitfield_bit_size,
2910 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002911 child_is_base_class,
2912 tmp_child_is_deref_of_parent);
Greg Clayton73b472d2010-10-27 03:32:59 +00002913 }
2914 else
2915 {
2916 if (parent_name)
2917 {
2918 child_name.assign(1, '&');
2919 child_name += parent_name;
2920 }
2921
2922 // We have a pointer to an simple type
2923 if (idx == 0)
2924 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002925 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Clayton73b472d2010-10-27 03:32:59 +00002926 assert(clang_type_info.first % 8 == 0);
2927 child_byte_size = clang_type_info.first / 8;
2928 child_byte_offset = 0;
2929 return pointee_type.getAsOpaquePtr();
2930 }
2931 }
2932 }
2933 break;
2934
Greg Claytone1a916a2010-07-21 22:12:05 +00002935 case clang::Type::Typedef:
Jim Inghamd555bac2011-06-24 22:03:24 +00002936 return GetChildClangTypeAtIndex (exe_ctx,
2937 ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002938 parent_name,
Sean Callanan48114472010-12-13 01:26:27 +00002939 cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002940 idx,
2941 transparent_pointers,
2942 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00002943 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002944 child_name,
2945 child_byte_size,
2946 child_byte_offset,
2947 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002948 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00002949 child_is_base_class,
2950 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002951 break;
Sean Callanan912855f2011-08-11 23:56:13 +00002952
2953 case clang::Type::Elaborated:
2954 return GetChildClangTypeAtIndex (exe_ctx,
2955 ast,
2956 parent_name,
2957 cast<ElaboratedType>(parent_qual_type)->getNamedType().getAsOpaquePtr(),
2958 idx,
2959 transparent_pointers,
2960 omit_empty_base_classes,
2961 ignore_array_bounds,
2962 child_name,
2963 child_byte_size,
2964 child_byte_offset,
2965 child_bitfield_bit_size,
2966 child_bitfield_bit_offset,
2967 child_is_base_class,
2968 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002969
2970 default:
2971 break;
2972 }
2973 }
Greg Clayton19503a22010-07-23 15:37:46 +00002974 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002975}
2976
2977static inline bool
2978BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
2979{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002980 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002981}
2982
2983static uint32_t
2984GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
2985{
2986 uint32_t num_bases = 0;
2987 if (cxx_record_decl)
2988 {
2989 if (omit_empty_base_classes)
2990 {
2991 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2992 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2993 base_class != base_class_end;
2994 ++base_class)
2995 {
2996 // Skip empty base classes
2997 if (omit_empty_base_classes)
2998 {
2999 if (BaseSpecifierIsEmpty (base_class))
3000 continue;
3001 }
3002 ++num_bases;
3003 }
3004 }
3005 else
3006 num_bases = cxx_record_decl->getNumBases();
3007 }
3008 return num_bases;
3009}
3010
3011
3012static uint32_t
3013GetIndexForRecordBase
3014(
3015 const RecordDecl *record_decl,
3016 const CXXBaseSpecifier *base_spec,
3017 bool omit_empty_base_classes
3018)
3019{
3020 uint32_t child_idx = 0;
3021
3022 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3023
3024// const char *super_name = record_decl->getNameAsCString();
3025// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
3026// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
3027//
3028 if (cxx_record_decl)
3029 {
3030 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3031 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3032 base_class != base_class_end;
3033 ++base_class)
3034 {
3035 if (omit_empty_base_classes)
3036 {
3037 if (BaseSpecifierIsEmpty (base_class))
3038 continue;
3039 }
3040
3041// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
3042// child_idx,
3043// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
3044//
3045//
3046 if (base_class == base_spec)
3047 return child_idx;
3048 ++child_idx;
3049 }
3050 }
3051
3052 return UINT32_MAX;
3053}
3054
3055
3056static uint32_t
3057GetIndexForRecordChild
3058(
3059 const RecordDecl *record_decl,
3060 NamedDecl *canonical_decl,
3061 bool omit_empty_base_classes
3062)
3063{
3064 uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
3065
3066// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3067//
3068//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
3069// if (cxx_record_decl)
3070// {
3071// CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3072// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3073// base_class != base_class_end;
3074// ++base_class)
3075// {
3076// if (omit_empty_base_classes)
3077// {
3078// if (BaseSpecifierIsEmpty (base_class))
3079// continue;
3080// }
3081//
3082//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
3083//// record_decl->getNameAsCString(),
3084//// canonical_decl->getNameAsCString(),
3085//// child_idx,
3086//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
3087//
3088//
3089// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3090// if (curr_base_class_decl == canonical_decl)
3091// {
3092// return child_idx;
3093// }
3094// ++child_idx;
3095// }
3096// }
3097//
3098// const uint32_t num_bases = child_idx;
3099 RecordDecl::field_iterator field, field_end;
3100 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
3101 field != field_end;
3102 ++field, ++child_idx)
3103 {
3104// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
3105// record_decl->getNameAsCString(),
3106// canonical_decl->getNameAsCString(),
3107// child_idx - num_bases,
3108// field->getNameAsCString());
3109
3110 if (field->getCanonicalDecl() == canonical_decl)
3111 return child_idx;
3112 }
3113
3114 return UINT32_MAX;
3115}
3116
3117// Look for a child member (doesn't include base classes, but it does include
3118// their members) in the type hierarchy. Returns an index path into "clang_type"
3119// on how to reach the appropriate member.
3120//
3121// class A
3122// {
3123// public:
3124// int m_a;
3125// int m_b;
3126// };
3127//
3128// class B
3129// {
3130// };
3131//
3132// class C :
3133// public B,
3134// public A
3135// {
3136// };
3137//
3138// If we have a clang type that describes "class C", and we wanted to looked
3139// "m_b" in it:
3140//
3141// With omit_empty_base_classes == false we would get an integer array back with:
3142// { 1, 1 }
3143// The first index 1 is the child index for "class A" within class C
3144// The second index 1 is the child index for "m_b" within class A
3145//
3146// With omit_empty_base_classes == true we would get an integer array back with:
3147// { 0, 1 }
3148// 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)
3149// The second index 1 is the child index for "m_b" within class A
3150
3151size_t
3152ClangASTContext::GetIndexOfChildMemberWithName
3153(
Greg Clayton6beaaa62011-01-17 03:46:26 +00003154 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003155 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003156 const char *name,
3157 bool omit_empty_base_classes,
3158 std::vector<uint32_t>& child_indexes
3159)
3160{
3161 if (clang_type && name && name[0])
3162 {
3163 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00003164 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3165 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003166 {
Greg Claytone1a916a2010-07-21 22:12:05 +00003167 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00003168 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003169 {
3170 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3171 const RecordDecl *record_decl = record_type->getDecl();
3172
3173 assert(record_decl);
3174 uint32_t child_idx = 0;
3175
3176 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3177
3178 // Try and find a field that matches NAME
3179 RecordDecl::field_iterator field, field_end;
3180 StringRef name_sref(name);
3181 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
3182 field != field_end;
3183 ++field, ++child_idx)
3184 {
3185 if (field->getName().equals (name_sref))
3186 {
3187 // We have to add on the number of base classes to this index!
3188 child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
3189 return child_indexes.size();
3190 }
3191 }
3192
3193 if (cxx_record_decl)
3194 {
3195 const RecordDecl *parent_record_decl = cxx_record_decl;
3196
3197 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
3198
3199 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
3200 // Didn't find things easily, lets let clang do its thang...
Sean Callanancc427fa2011-07-30 02:42:06 +00003201 IdentifierInfo & ident_ref = ast->Idents.get(name_sref);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003202 DeclarationName decl_name(&ident_ref);
3203
3204 CXXBasePaths paths;
3205 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
3206 decl_name.getAsOpaquePtr(),
3207 paths))
3208 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003209 CXXBasePaths::const_paths_iterator path, path_end = paths.end();
3210 for (path = paths.begin(); path != path_end; ++path)
3211 {
3212 const size_t num_path_elements = path->size();
3213 for (size_t e=0; e<num_path_elements; ++e)
3214 {
3215 CXXBasePathElement elem = (*path)[e];
3216
3217 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
3218 if (child_idx == UINT32_MAX)
3219 {
3220 child_indexes.clear();
3221 return 0;
3222 }
3223 else
3224 {
3225 child_indexes.push_back (child_idx);
3226 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
3227 }
3228 }
3229 DeclContext::lookup_iterator named_decl_pos;
3230 for (named_decl_pos = path->Decls.first;
3231 named_decl_pos != path->Decls.second && parent_record_decl;
3232 ++named_decl_pos)
3233 {
3234 //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
3235
3236 child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
3237 if (child_idx == UINT32_MAX)
3238 {
3239 child_indexes.clear();
3240 return 0;
3241 }
3242 else
3243 {
3244 child_indexes.push_back (child_idx);
3245 }
3246 }
3247 }
3248 return child_indexes.size();
3249 }
3250 }
3251
3252 }
3253 break;
3254
Greg Clayton9e409562010-07-28 02:04:09 +00003255 case clang::Type::ObjCObject:
3256 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00003257 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00003258 {
3259 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00003260 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003261 assert (objc_class_type);
3262 if (objc_class_type)
3263 {
3264 uint32_t child_idx = 0;
3265 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3266
3267 if (class_interface_decl)
3268 {
3269 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3270 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3271
Greg Clayton6ba78152010-09-18 02:11:07 +00003272 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
Greg Clayton9e409562010-07-28 02:04:09 +00003273 {
3274 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3275
3276 if (ivar_decl->getName().equals (name_sref))
3277 {
3278 if ((!omit_empty_base_classes && superclass_interface_decl) ||
3279 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
3280 ++child_idx;
3281
3282 child_indexes.push_back (child_idx);
3283 return child_indexes.size();
3284 }
3285 }
3286
3287 if (superclass_interface_decl)
3288 {
3289 // The super class index is always zero for ObjC classes,
3290 // so we push it onto the child indexes in case we find
3291 // an ivar in our superclass...
3292 child_indexes.push_back (0);
3293
Greg Clayton6beaaa62011-01-17 03:46:26 +00003294 if (GetIndexOfChildMemberWithName (ast,
3295 ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00003296 name,
3297 omit_empty_base_classes,
3298 child_indexes))
3299 {
3300 // We did find an ivar in a superclass so just
3301 // return the results!
3302 return child_indexes.size();
3303 }
3304
3305 // We didn't find an ivar matching "name" in our
3306 // superclass, pop the superclass zero index that
3307 // we pushed on above.
3308 child_indexes.pop_back();
3309 }
3310 }
3311 }
3312 }
3313 break;
3314
3315 case clang::Type::ObjCObjectPointer:
3316 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003317 return GetIndexOfChildMemberWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00003318 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
3319 name,
3320 omit_empty_base_classes,
3321 child_indexes);
3322 }
3323 break;
3324
3325
Greg Claytone1a916a2010-07-21 22:12:05 +00003326 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003327 {
3328// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
3329// const uint64_t element_count = array->getSize().getLimitedValue();
3330//
3331// if (idx < element_count)
3332// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003333// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003334//
3335// char element_name[32];
3336// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
3337//
3338// child_name.assign(element_name);
3339// assert(field_type_info.first % 8 == 0);
3340// child_byte_size = field_type_info.first / 8;
3341// child_byte_offset = idx * child_byte_size;
3342// return array->getElementType().getAsOpaquePtr();
3343// }
3344 }
3345 break;
3346
Greg Claytone1a916a2010-07-21 22:12:05 +00003347// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003348// {
3349// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
3350// QualType pointee_type = mem_ptr_type->getPointeeType();
3351//
3352// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3353// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003354// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003355// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
3356// name);
3357// }
3358// }
3359// break;
3360//
Greg Claytone1a916a2010-07-21 22:12:05 +00003361 case clang::Type::LValueReference:
3362 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003363 {
Sean Callanan78e37602011-01-27 04:42:51 +00003364 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003365 QualType pointee_type = reference_type->getPointeeType();
3366
3367 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3368 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003369 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003370 reference_type->getPointeeType().getAsOpaquePtr(),
3371 name,
3372 omit_empty_base_classes,
3373 child_indexes);
3374 }
3375 }
3376 break;
3377
Greg Claytone1a916a2010-07-21 22:12:05 +00003378 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003379 {
Sean Callanan78e37602011-01-27 04:42:51 +00003380 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003381 QualType pointee_type = pointer_type->getPointeeType();
3382
3383 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3384 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003385 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003386 pointer_type->getPointeeType().getAsOpaquePtr(),
3387 name,
3388 omit_empty_base_classes,
3389 child_indexes);
3390 }
3391 else
3392 {
3393// if (parent_name)
3394// {
3395// child_name.assign(1, '*');
3396// child_name += parent_name;
3397// }
3398//
3399// // We have a pointer to an simple type
3400// if (idx == 0)
3401// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003402// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003403// assert(clang_type_info.first % 8 == 0);
3404// child_byte_size = clang_type_info.first / 8;
3405// child_byte_offset = 0;
3406// return pointee_type.getAsOpaquePtr();
3407// }
3408 }
3409 }
3410 break;
3411
Greg Claytone1a916a2010-07-21 22:12:05 +00003412 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00003413 return GetIndexOfChildMemberWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00003414 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003415 name,
3416 omit_empty_base_classes,
3417 child_indexes);
3418
3419 default:
3420 break;
3421 }
3422 }
3423 return 0;
3424}
3425
3426
3427// Get the index of the child of "clang_type" whose name matches. This function
3428// doesn't descend into the children, but only looks one level deep and name
3429// matches can include base class names.
3430
3431uint32_t
3432ClangASTContext::GetIndexOfChildWithName
3433(
Greg Clayton6beaaa62011-01-17 03:46:26 +00003434 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003435 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003436 const char *name,
3437 bool omit_empty_base_classes
3438)
3439{
3440 if (clang_type && name && name[0])
3441 {
3442 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00003443
Greg Clayton737b9322010-09-13 03:32:57 +00003444 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
Greg Clayton9e409562010-07-28 02:04:09 +00003445
Greg Clayton737b9322010-09-13 03:32:57 +00003446 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003447 {
Greg Claytone1a916a2010-07-21 22:12:05 +00003448 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00003449 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003450 {
3451 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3452 const RecordDecl *record_decl = record_type->getDecl();
3453
3454 assert(record_decl);
3455 uint32_t child_idx = 0;
3456
3457 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3458
3459 if (cxx_record_decl)
3460 {
3461 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3462 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3463 base_class != base_class_end;
3464 ++base_class)
3465 {
3466 // Skip empty base classes
3467 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3468 if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
3469 continue;
3470
Greg Claytone3055942011-06-30 02:28:26 +00003471 std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType()));
3472 if (base_class_type_name.compare (name) == 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003473 return child_idx;
3474 ++child_idx;
3475 }
3476 }
3477
3478 // Try and find a field that matches NAME
3479 RecordDecl::field_iterator field, field_end;
3480 StringRef name_sref(name);
3481 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
3482 field != field_end;
3483 ++field, ++child_idx)
3484 {
3485 if (field->getName().equals (name_sref))
3486 return child_idx;
3487 }
3488
3489 }
3490 break;
3491
Greg Clayton9e409562010-07-28 02:04:09 +00003492 case clang::Type::ObjCObject:
3493 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00003494 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00003495 {
3496 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00003497 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003498 assert (objc_class_type);
3499 if (objc_class_type)
3500 {
3501 uint32_t child_idx = 0;
3502 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3503
3504 if (class_interface_decl)
3505 {
3506 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3507 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3508
3509 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
3510 {
3511 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3512
3513 if (ivar_decl->getName().equals (name_sref))
3514 {
3515 if ((!omit_empty_base_classes && superclass_interface_decl) ||
3516 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
3517 ++child_idx;
3518
3519 return child_idx;
3520 }
3521 }
3522
3523 if (superclass_interface_decl)
3524 {
3525 if (superclass_interface_decl->getName().equals (name_sref))
3526 return 0;
3527 }
3528 }
3529 }
3530 }
3531 break;
3532
3533 case clang::Type::ObjCObjectPointer:
3534 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003535 return GetIndexOfChildWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00003536 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
3537 name,
3538 omit_empty_base_classes);
3539 }
3540 break;
3541
Greg Claytone1a916a2010-07-21 22:12:05 +00003542 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003543 {
3544// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
3545// const uint64_t element_count = array->getSize().getLimitedValue();
3546//
3547// if (idx < element_count)
3548// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003549// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003550//
3551// char element_name[32];
3552// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
3553//
3554// child_name.assign(element_name);
3555// assert(field_type_info.first % 8 == 0);
3556// child_byte_size = field_type_info.first / 8;
3557// child_byte_offset = idx * child_byte_size;
3558// return array->getElementType().getAsOpaquePtr();
3559// }
3560 }
3561 break;
3562
Greg Claytone1a916a2010-07-21 22:12:05 +00003563// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003564// {
3565// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
3566// QualType pointee_type = mem_ptr_type->getPointeeType();
3567//
3568// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3569// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003570// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003571// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
3572// name);
3573// }
3574// }
3575// break;
3576//
Greg Claytone1a916a2010-07-21 22:12:05 +00003577 case clang::Type::LValueReference:
3578 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003579 {
Sean Callanan78e37602011-01-27 04:42:51 +00003580 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003581 QualType pointee_type = reference_type->getPointeeType();
3582
3583 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3584 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003585 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003586 reference_type->getPointeeType().getAsOpaquePtr(),
3587 name,
3588 omit_empty_base_classes);
3589 }
3590 }
3591 break;
3592
Greg Claytone1a916a2010-07-21 22:12:05 +00003593 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003594 {
Sean Callanan78e37602011-01-27 04:42:51 +00003595 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003596 QualType pointee_type = pointer_type->getPointeeType();
3597
3598 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3599 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003600 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003601 pointer_type->getPointeeType().getAsOpaquePtr(),
3602 name,
3603 omit_empty_base_classes);
3604 }
3605 else
3606 {
3607// if (parent_name)
3608// {
3609// child_name.assign(1, '*');
3610// child_name += parent_name;
3611// }
3612//
3613// // We have a pointer to an simple type
3614// if (idx == 0)
3615// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003616// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003617// assert(clang_type_info.first % 8 == 0);
3618// child_byte_size = clang_type_info.first / 8;
3619// child_byte_offset = 0;
3620// return pointee_type.getAsOpaquePtr();
3621// }
3622 }
3623 }
3624 break;
3625
Greg Claytone1a916a2010-07-21 22:12:05 +00003626 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00003627 return GetIndexOfChildWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00003628 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003629 name,
3630 omit_empty_base_classes);
3631
3632 default:
3633 break;
3634 }
3635 }
3636 return UINT32_MAX;
3637}
3638
3639#pragma mark TagType
3640
3641bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00003642ClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003643{
3644 if (tag_clang_type)
3645 {
3646 QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00003647 const clang::Type *clang_type = tag_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003648 if (clang_type)
3649 {
Sean Callanan78e37602011-01-27 04:42:51 +00003650 const TagType *tag_type = dyn_cast<TagType>(clang_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003651 if (tag_type)
3652 {
3653 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
3654 if (tag_decl)
3655 {
3656 tag_decl->setTagKind ((TagDecl::TagKind)kind);
3657 return true;
3658 }
3659 }
3660 }
3661 }
3662 return false;
3663}
3664
3665
3666#pragma mark DeclContext Functions
3667
3668DeclContext *
Greg Clayton1be10fc2010-09-29 01:12:09 +00003669ClangASTContext::GetDeclContextForType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003670{
3671 if (clang_type == NULL)
3672 return NULL;
3673
3674 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00003675 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3676 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003677 {
Sean Callanancc427fa2011-07-30 02:42:06 +00003678 case clang::Type::UnaryTransform: break;
Greg Clayton9e409562010-07-28 02:04:09 +00003679 case clang::Type::FunctionNoProto: break;
3680 case clang::Type::FunctionProto: break;
3681 case clang::Type::IncompleteArray: break;
3682 case clang::Type::VariableArray: break;
3683 case clang::Type::ConstantArray: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00003684 case clang::Type::DependentSizedArray: break;
Greg Clayton9e409562010-07-28 02:04:09 +00003685 case clang::Type::ExtVector: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00003686 case clang::Type::DependentSizedExtVector: break;
Greg Clayton9e409562010-07-28 02:04:09 +00003687 case clang::Type::Vector: break;
3688 case clang::Type::Builtin: break;
3689 case clang::Type::BlockPointer: break;
3690 case clang::Type::Pointer: break;
3691 case clang::Type::LValueReference: break;
3692 case clang::Type::RValueReference: break;
3693 case clang::Type::MemberPointer: break;
3694 case clang::Type::Complex: break;
3695 case clang::Type::ObjCObject: break;
3696 case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
3697 case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
3698 case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl();
3699 case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl();
Sean Callanan48114472010-12-13 01:26:27 +00003700 case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00003701 case clang::Type::Elaborated: return ClangASTContext::GetDeclContextForType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003702 case clang::Type::TypeOfExpr: break;
3703 case clang::Type::TypeOf: break;
3704 case clang::Type::Decltype: break;
3705 //case clang::Type::QualifiedName: break;
3706 case clang::Type::TemplateSpecialization: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00003707 case clang::Type::DependentTemplateSpecialization: break;
3708 case clang::Type::TemplateTypeParm: break;
3709 case clang::Type::SubstTemplateTypeParm: break;
3710 case clang::Type::SubstTemplateTypeParmPack:break;
3711 case clang::Type::PackExpansion: break;
3712 case clang::Type::UnresolvedUsing: break;
3713 case clang::Type::Paren: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00003714 case clang::Type::Attributed: break;
3715 case clang::Type::Auto: break;
3716 case clang::Type::InjectedClassName: break;
3717 case clang::Type::DependentName: break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003718 }
3719 // No DeclContext in this type...
3720 return NULL;
3721}
3722
3723#pragma mark Namespace Declarations
3724
3725NamespaceDecl *
3726ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
3727{
3728 // TODO: Do something intelligent with the Declaration object passed in
3729 // like maybe filling in the SourceLocation with it...
3730 if (name)
3731 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003732 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003733 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00003734 decl_ctx = ast->getTranslationUnitDecl();
Sean Callananfb0b7582011-03-15 00:17:19 +00003735 return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), &ast->Idents.get(name));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003736 }
3737 return NULL;
3738}
3739
3740
3741#pragma mark Function Types
3742
3743FunctionDecl *
Greg Clayton1be10fc2010-09-29 01:12:09 +00003744ClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003745{
3746 if (name)
3747 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003748 ASTContext *ast = getASTContext();
3749 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003750
3751 if (name && name[0])
3752 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003753 return FunctionDecl::Create(*ast,
3754 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003755 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00003756 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00003757 DeclarationName (&ast->Idents.get(name)),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003758 QualType::getFromOpaquePtr(function_clang_type),
3759 NULL,
3760 (FunctionDecl::StorageClass)storage,
3761 (FunctionDecl::StorageClass)storage,
3762 is_inline);
3763 }
3764 else
3765 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003766 return FunctionDecl::Create(*ast,
3767 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003768 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00003769 SourceLocation(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003770 DeclarationName (),
3771 QualType::getFromOpaquePtr(function_clang_type),
3772 NULL,
3773 (FunctionDecl::StorageClass)storage,
3774 (FunctionDecl::StorageClass)storage,
3775 is_inline);
3776 }
3777 }
3778 return NULL;
3779}
3780
Greg Clayton1be10fc2010-09-29 01:12:09 +00003781clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00003782ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003783 clang_type_t result_type,
3784 clang_type_t *args,
Sean Callananc81256a2010-09-16 20:40:25 +00003785 unsigned num_args,
3786 bool is_variadic,
3787 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003788{
Greg Clayton6beaaa62011-01-17 03:46:26 +00003789 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003790 std::vector<QualType> qual_type_args;
3791 for (unsigned i=0; i<num_args; ++i)
3792 qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
3793
3794 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00003795 FunctionProtoType::ExtProtoInfo proto_info;
3796 proto_info.Variadic = is_variadic;
Sean Callananfb0b7582011-03-15 00:17:19 +00003797 proto_info.ExceptionSpecType = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00003798 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00003799 proto_info.RefQualifier = RQ_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00003800 proto_info.NumExceptions = 0;
3801 proto_info.Exceptions = NULL;
3802
Greg Clayton6beaaa62011-01-17 03:46:26 +00003803 return ast->getFunctionType(QualType::getFromOpaquePtr(result_type),
Greg Clayton471b31c2010-07-20 22:52:08 +00003804 qual_type_args.empty() ? NULL : &qual_type_args.front(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003805 qual_type_args.size(),
Sean Callanan2c777c42011-01-18 23:32:05 +00003806 proto_info).getAsOpaquePtr(); // NoReturn);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003807}
3808
3809ParmVarDecl *
Greg Clayton1be10fc2010-09-29 01:12:09 +00003810ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003811{
Greg Clayton6beaaa62011-01-17 03:46:26 +00003812 ASTContext *ast = getASTContext();
3813 assert (ast != NULL);
3814 return ParmVarDecl::Create(*ast,
3815 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003816 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00003817 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00003818 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callananc81256a2010-09-16 20:40:25 +00003819 QualType::getFromOpaquePtr(param_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003820 NULL,
3821 (VarDecl::StorageClass)storage,
3822 (VarDecl::StorageClass)storage,
3823 0);
3824}
3825
3826void
3827ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
3828{
3829 if (function_decl)
3830 function_decl->setParams (params, num_params);
3831}
3832
3833
3834#pragma mark Array Types
3835
Greg Clayton1be10fc2010-09-29 01:12:09 +00003836clang_type_t
3837ClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003838{
3839 if (element_type)
3840 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003841 ASTContext *ast = getASTContext();
3842 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003843 llvm::APInt ap_element_count (64, element_count);
Greg Clayton6beaaa62011-01-17 03:46:26 +00003844 return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003845 ap_element_count,
3846 ArrayType::Normal,
3847 0).getAsOpaquePtr(); // ElemQuals
3848 }
3849 return NULL;
3850}
3851
3852
3853#pragma mark TagDecl
3854
3855bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00003856ClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003857{
3858 if (clang_type)
3859 {
3860 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00003861 const clang::Type *t = qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003862 if (t)
3863 {
Sean Callanan78e37602011-01-27 04:42:51 +00003864 const TagType *tag_type = dyn_cast<TagType>(t);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003865 if (tag_type)
3866 {
3867 TagDecl *tag_decl = tag_type->getDecl();
3868 if (tag_decl)
3869 {
3870 tag_decl->startDefinition();
3871 return true;
3872 }
3873 }
3874 }
3875 }
3876 return false;
3877}
3878
3879bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00003880ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003881{
3882 if (clang_type)
3883 {
3884 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton14372242010-09-29 03:44:17 +00003885
3886 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3887
3888 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003889 {
Greg Clayton14372242010-09-29 03:44:17 +00003890 cxx_record_decl->completeDefinition();
3891
3892 return true;
3893 }
3894
Sean Callanan78e37602011-01-27 04:42:51 +00003895 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
Sean Callanana2424172010-10-25 00:29:48 +00003896
3897 if (objc_class_type)
3898 {
3899 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3900
3901 class_interface_decl->setForwardDecl(false);
3902 }
3903
Greg Clayton14372242010-09-29 03:44:17 +00003904 const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
3905
3906 if (enum_type)
3907 {
3908 EnumDecl *enum_decl = enum_type->getDecl();
3909
3910 if (enum_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003911 {
Greg Clayton14372242010-09-29 03:44:17 +00003912 /// TODO This really needs to be fixed.
3913
3914 unsigned NumPositiveBits = 1;
3915 unsigned NumNegativeBits = 0;
3916
Greg Clayton6beaaa62011-01-17 03:46:26 +00003917 ASTContext *ast = getASTContext();
Greg Claytone02b8502010-10-12 04:29:14 +00003918
3919 QualType promotion_qual_type;
3920 // If the enum integer type is less than an integer in bit width,
3921 // then we must promote it to an integer size.
Greg Clayton6beaaa62011-01-17 03:46:26 +00003922 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
Greg Claytone02b8502010-10-12 04:29:14 +00003923 {
3924 if (enum_decl->getIntegerType()->isSignedIntegerType())
Greg Clayton6beaaa62011-01-17 03:46:26 +00003925 promotion_qual_type = ast->IntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00003926 else
Greg Clayton6beaaa62011-01-17 03:46:26 +00003927 promotion_qual_type = ast->UnsignedIntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00003928 }
3929 else
3930 promotion_qual_type = enum_decl->getIntegerType();
3931
3932 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Clayton14372242010-09-29 03:44:17 +00003933 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003934 }
3935 }
3936 }
3937 return false;
3938}
3939
3940
3941#pragma mark Enumeration Types
3942
Greg Clayton1be10fc2010-09-29 01:12:09 +00003943clang_type_t
Greg Claytonca512b32011-01-14 04:54:56 +00003944ClangASTContext::CreateEnumerationType
3945(
3946 const char *name,
3947 DeclContext *decl_ctx,
3948 const Declaration &decl,
3949 clang_type_t integer_qual_type
3950)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003951{
3952 // TODO: Do something intelligent with the Declaration object passed in
3953 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00003954 ASTContext *ast = getASTContext();
3955 assert (ast != NULL);
Greg Claytone02b8502010-10-12 04:29:14 +00003956
3957 // TODO: ask about these...
3958// const bool IsScoped = false;
3959// const bool IsFixed = false;
3960
Greg Clayton6beaaa62011-01-17 03:46:26 +00003961 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00003962 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00003963 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00003964 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00003965 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callanan48114472010-12-13 01:26:27 +00003966 NULL,
3967 false, // IsScoped
3968 false, // IsScopedUsingClassTag
3969 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00003970
3971
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003972 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00003973 {
3974 // TODO: check if we should be setting the promotion type too?
3975 enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00003976
3977 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
3978
Greg Clayton6beaaa62011-01-17 03:46:26 +00003979 return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
Greg Clayton83ff3892010-09-12 23:17:56 +00003980 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003981 return NULL;
3982}
3983
Greg Clayton1be10fc2010-09-29 01:12:09 +00003984clang_type_t
3985ClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
3986{
3987 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3988
Sean Callanan78e37602011-01-27 04:42:51 +00003989 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Greg Clayton1be10fc2010-09-29 01:12:09 +00003990 if (clang_type)
3991 {
3992 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3993 if (enum_type)
3994 {
3995 EnumDecl *enum_decl = enum_type->getDecl();
3996 if (enum_decl)
3997 return enum_decl->getIntegerType().getAsOpaquePtr();
3998 }
3999 }
4000 return NULL;
4001}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004002bool
4003ClangASTContext::AddEnumerationValueToEnumerationType
4004(
Greg Clayton1be10fc2010-09-29 01:12:09 +00004005 clang_type_t enum_clang_type,
4006 clang_type_t enumerator_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004007 const Declaration &decl,
4008 const char *name,
4009 int64_t enum_value,
4010 uint32_t enum_value_bit_size
4011)
4012{
4013 if (enum_clang_type && enumerator_clang_type && name)
4014 {
4015 // TODO: Do something intelligent with the Declaration object passed in
4016 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00004017 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004018 IdentifierTable *identifier_table = getIdentifierTable();
4019
Greg Clayton6beaaa62011-01-17 03:46:26 +00004020 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004021 assert (identifier_table != NULL);
4022 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
4023
Sean Callanan78e37602011-01-27 04:42:51 +00004024 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004025 if (clang_type)
4026 {
4027 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
4028
4029 if (enum_type)
4030 {
4031 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
4032 enum_llvm_apsint = enum_value;
4033 EnumConstantDecl *enumerator_decl =
Greg Clayton6beaaa62011-01-17 03:46:26 +00004034 EnumConstantDecl::Create (*ast,
4035 enum_type->getDecl(),
4036 SourceLocation(),
4037 name ? &identifier_table->get(name) : NULL, // Identifier
4038 QualType::getFromOpaquePtr(enumerator_clang_type),
4039 NULL,
4040 enum_llvm_apsint);
4041
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004042 if (enumerator_decl)
4043 {
4044 enum_type->getDecl()->addDecl(enumerator_decl);
4045 return true;
4046 }
4047 }
4048 }
4049 }
4050 return false;
4051}
4052
4053#pragma mark Pointers & References
4054
Greg Clayton1be10fc2010-09-29 01:12:09 +00004055clang_type_t
4056ClangASTContext::CreatePointerType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004057{
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00004058 return CreatePointerType (getASTContext(), clang_type);
4059}
4060
4061clang_type_t
4062ClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
4063{
4064 if (ast && clang_type)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00004065 {
4066 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4067
Greg Clayton737b9322010-09-13 03:32:57 +00004068 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4069 switch (type_class)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00004070 {
4071 case clang::Type::ObjCObject:
4072 case clang::Type::ObjCInterface:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00004073 return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00004074
Greg Clayton5fb47cd2010-07-29 20:06:32 +00004075 default:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00004076 return ast->getPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00004077 }
4078 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004079 return NULL;
4080}
4081
Greg Clayton1be10fc2010-09-29 01:12:09 +00004082clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00004083ClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
4084 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004085{
4086 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00004087 return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004088 return NULL;
4089}
4090
Greg Clayton1be10fc2010-09-29 01:12:09 +00004091clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00004092ClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
4093 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004094{
4095 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00004096 return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004097 return NULL;
4098}
4099
Greg Clayton1be10fc2010-09-29 01:12:09 +00004100clang_type_t
4101ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
Greg Clayton9b81a312010-06-12 01:20:30 +00004102{
4103 if (clang_pointee_type && clang_pointee_type)
4104 return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
4105 QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
4106 return NULL;
4107}
4108
Greg Clayton1a65ae12011-01-25 23:55:37 +00004109uint32_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004110ClangASTContext::GetPointerBitSize ()
4111{
Greg Clayton6beaaa62011-01-17 03:46:26 +00004112 ASTContext *ast = getASTContext();
4113 return ast->getTypeSize(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004114}
4115
4116bool
Greg Claytondea8cb42011-06-29 22:09:02 +00004117ClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
4118{
4119 QualType pointee_qual_type;
4120 if (clang_type)
4121 {
4122 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4123 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4124 bool success = false;
4125 switch (type_class)
4126 {
4127 case clang::Type::Builtin:
4128 if (cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
4129 {
4130 if (dynamic_pointee_type)
4131 *dynamic_pointee_type = clang_type;
4132 return true;
4133 }
4134 break;
4135
4136 case clang::Type::ObjCObjectPointer:
4137 if (dynamic_pointee_type)
4138 *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4139 return true;
4140
4141 case clang::Type::Pointer:
4142 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
4143 success = true;
4144 break;
4145
4146 case clang::Type::LValueReference:
4147 case clang::Type::RValueReference:
4148 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
4149 success = true;
4150 break;
4151
4152 case clang::Type::Typedef:
Greg Claytonaffb03b2011-07-08 18:27:39 +00004153 return ClangASTContext::IsPossibleDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
Sean Callanan912855f2011-08-11 23:56:13 +00004154
4155 case clang::Type::Elaborated:
4156 return ClangASTContext::IsPossibleDynamicType (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), dynamic_pointee_type);
4157
Greg Claytondea8cb42011-06-29 22:09:02 +00004158 default:
4159 break;
4160 }
4161
4162 if (success)
4163 {
4164 // Check to make sure what we are pointing too is a possible dynamic C++ type
4165 // We currently accept any "void *" (in case we have a class that has been
4166 // watered down to an opaque pointer) and virtual C++ classes.
4167 const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
4168 switch (pointee_type_class)
4169 {
4170 case clang::Type::Builtin:
4171 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
4172 {
4173 case clang::BuiltinType::UnknownAny:
4174 case clang::BuiltinType::Void:
4175 if (dynamic_pointee_type)
4176 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4177 return true;
4178
4179 case clang::BuiltinType::NullPtr:
4180 case clang::BuiltinType::Bool:
4181 case clang::BuiltinType::Char_U:
4182 case clang::BuiltinType::UChar:
4183 case clang::BuiltinType::WChar_U:
4184 case clang::BuiltinType::Char16:
4185 case clang::BuiltinType::Char32:
4186 case clang::BuiltinType::UShort:
4187 case clang::BuiltinType::UInt:
4188 case clang::BuiltinType::ULong:
4189 case clang::BuiltinType::ULongLong:
4190 case clang::BuiltinType::UInt128:
4191 case clang::BuiltinType::Char_S:
4192 case clang::BuiltinType::SChar:
4193 case clang::BuiltinType::WChar_S:
4194 case clang::BuiltinType::Short:
4195 case clang::BuiltinType::Int:
4196 case clang::BuiltinType::Long:
4197 case clang::BuiltinType::LongLong:
4198 case clang::BuiltinType::Int128:
4199 case clang::BuiltinType::Float:
4200 case clang::BuiltinType::Double:
4201 case clang::BuiltinType::LongDouble:
4202 case clang::BuiltinType::Dependent:
4203 case clang::BuiltinType::Overload:
4204 case clang::BuiltinType::ObjCId:
4205 case clang::BuiltinType::ObjCClass:
4206 case clang::BuiltinType::ObjCSel:
4207 case clang::BuiltinType::BoundMember:
4208 break;
4209 }
4210 break;
4211
4212 case clang::Type::Record:
4213 {
4214 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
4215 if (cxx_record_decl)
4216 {
4217 if (GetCompleteQualType (ast, pointee_qual_type))
4218 {
4219 success = cxx_record_decl->isDynamicClass();
4220 }
4221 else
4222 {
4223 // We failed to get the complete type, so we have to
4224 // treat this as a void * which we might possibly be
4225 // able to complete
4226 success = true;
4227 }
4228 if (success)
4229 {
4230 if (dynamic_pointee_type)
4231 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4232 return true;
4233 }
4234 }
4235 }
4236 break;
4237
4238 case clang::Type::ObjCObject:
4239 case clang::Type::ObjCInterface:
4240 {
4241 const clang::ObjCObjectType *objc_class_type = pointee_qual_type->getAsObjCQualifiedInterfaceType();
4242 if (objc_class_type)
4243 {
4244 GetCompleteQualType (ast, pointee_qual_type);
4245 if (dynamic_pointee_type)
4246 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4247 return true;
4248 }
4249 }
4250 break;
4251
4252 default:
4253 break;
4254 }
4255 }
4256 }
4257 if (dynamic_pointee_type)
4258 *dynamic_pointee_type = NULL;
4259 return false;
4260}
4261
4262
4263bool
Greg Clayton007d5be2011-05-30 00:49:24 +00004264ClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
4265{
4266 QualType pointee_qual_type;
4267 if (clang_type)
4268 {
4269 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4270 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4271 bool success = false;
4272 switch (type_class)
4273 {
4274 case clang::Type::Pointer:
4275 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
4276 success = true;
4277 break;
4278
4279 case clang::Type::LValueReference:
4280 case clang::Type::RValueReference:
4281 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
4282 success = true;
4283 break;
4284
4285 case clang::Type::Typedef:
4286 return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
4287
Sean Callanan912855f2011-08-11 23:56:13 +00004288 case clang::Type::Elaborated:
4289 return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
4290
Greg Clayton007d5be2011-05-30 00:49:24 +00004291 default:
4292 break;
4293 }
4294
4295 if (success)
4296 {
4297 // Check to make sure what we are pointing too is a possible dynamic C++ type
4298 // We currently accept any "void *" (in case we have a class that has been
4299 // watered down to an opaque pointer) and virtual C++ classes.
4300 const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
4301 switch (pointee_type_class)
4302 {
4303 case clang::Type::Builtin:
4304 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
4305 {
4306 case clang::BuiltinType::UnknownAny:
4307 case clang::BuiltinType::Void:
4308 if (dynamic_pointee_type)
4309 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4310 return true;
4311
4312 case clang::BuiltinType::NullPtr:
4313 case clang::BuiltinType::Bool:
4314 case clang::BuiltinType::Char_U:
4315 case clang::BuiltinType::UChar:
4316 case clang::BuiltinType::WChar_U:
4317 case clang::BuiltinType::Char16:
4318 case clang::BuiltinType::Char32:
4319 case clang::BuiltinType::UShort:
4320 case clang::BuiltinType::UInt:
4321 case clang::BuiltinType::ULong:
4322 case clang::BuiltinType::ULongLong:
4323 case clang::BuiltinType::UInt128:
4324 case clang::BuiltinType::Char_S:
4325 case clang::BuiltinType::SChar:
4326 case clang::BuiltinType::WChar_S:
4327 case clang::BuiltinType::Short:
4328 case clang::BuiltinType::Int:
4329 case clang::BuiltinType::Long:
4330 case clang::BuiltinType::LongLong:
4331 case clang::BuiltinType::Int128:
4332 case clang::BuiltinType::Float:
4333 case clang::BuiltinType::Double:
4334 case clang::BuiltinType::LongDouble:
4335 case clang::BuiltinType::Dependent:
4336 case clang::BuiltinType::Overload:
4337 case clang::BuiltinType::ObjCId:
4338 case clang::BuiltinType::ObjCClass:
4339 case clang::BuiltinType::ObjCSel:
4340 case clang::BuiltinType::BoundMember:
4341 break;
4342 }
4343 break;
4344 case clang::Type::Record:
4345 {
4346 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
4347 if (cxx_record_decl)
4348 {
4349 if (GetCompleteQualType (ast, pointee_qual_type))
4350 {
Greg Claytona13ad2ad2011-06-02 01:26:44 +00004351 success = cxx_record_decl->isDynamicClass();
Greg Clayton007d5be2011-05-30 00:49:24 +00004352 }
4353 else
4354 {
4355 // We failed to get the complete type, so we have to
4356 // treat this as a void * which we might possibly be
4357 // able to complete
4358 success = true;
4359 }
4360 if (success)
4361 {
4362 if (dynamic_pointee_type)
4363 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4364 return true;
4365 }
4366 }
4367 }
4368 break;
4369
4370 default:
4371 break;
4372 }
4373 }
4374 }
4375 if (dynamic_pointee_type)
4376 *dynamic_pointee_type = NULL;
4377 return false;
4378}
4379
4380
4381bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004382ClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004383{
4384 if (clang_type == NULL)
4385 return false;
4386
4387 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00004388 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4389 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004390 {
Sean Callanana2424172010-10-25 00:29:48 +00004391 case clang::Type::Builtin:
4392 switch (cast<clang::BuiltinType>(qual_type)->getKind())
4393 {
4394 default:
4395 break;
4396 case clang::BuiltinType::ObjCId:
4397 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00004398 return true;
4399 }
4400 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00004401 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004402 if (target_type)
4403 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4404 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004405 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004406 if (target_type)
4407 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4408 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004409 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004410 if (target_type)
4411 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4412 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004413 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004414 if (target_type)
4415 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4416 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004417 case clang::Type::LValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004418 if (target_type)
4419 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
4420 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004421 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004422 if (target_type)
4423 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
4424 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004425 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00004426 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00004427 case clang::Type::Elaborated:
4428 return ClangASTContext::IsPointerOrReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004429 default:
4430 break;
4431 }
4432 return false;
4433}
4434
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004435bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004436ClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004437{
4438 if (!clang_type)
4439 return false;
4440
4441 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4442 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
4443
4444 if (builtin_type)
4445 {
4446 if (builtin_type->isInteger())
4447 is_signed = builtin_type->isSignedInteger();
4448
4449 return true;
4450 }
4451
4452 return false;
4453}
4454
4455bool
Greg Claytonaffb03b2011-07-08 18:27:39 +00004456ClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t *target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004457{
Greg Claytonaffb03b2011-07-08 18:27:39 +00004458 if (target_type)
4459 *target_type = NULL;
4460
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004461 if (clang_type)
4462 {
4463 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00004464 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4465 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004466 {
Sean Callanana2424172010-10-25 00:29:48 +00004467 case clang::Type::Builtin:
4468 switch (cast<clang::BuiltinType>(qual_type)->getKind())
4469 {
4470 default:
4471 break;
4472 case clang::BuiltinType::ObjCId:
4473 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00004474 return true;
4475 }
4476 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00004477 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004478 if (target_type)
4479 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4480 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004481 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004482 if (target_type)
4483 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4484 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004485 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004486 if (target_type)
4487 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4488 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004489 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004490 if (target_type)
4491 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4492 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00004493 case clang::Type::Typedef:
Greg Claytonaffb03b2011-07-08 18:27:39 +00004494 return ClangASTContext::IsPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
Sean Callanan912855f2011-08-11 23:56:13 +00004495 case clang::Type::Elaborated:
4496 return ClangASTContext::IsPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), target_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004497 default:
4498 break;
4499 }
4500 }
4501 return false;
4502}
4503
4504bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004505ClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004506{
4507 if (clang_type)
4508 {
4509 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4510
4511 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
4512 {
4513 clang::BuiltinType::Kind kind = BT->getKind();
4514 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
4515 {
4516 count = 1;
4517 is_complex = false;
4518 return true;
4519 }
4520 }
4521 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
4522 {
4523 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
4524 {
4525 count = 2;
4526 is_complex = true;
4527 return true;
4528 }
4529 }
4530 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
4531 {
4532 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
4533 {
4534 count = VT->getNumElements();
4535 is_complex = false;
4536 return true;
4537 }
4538 }
4539 }
4540 return false;
4541}
4542
Enrico Granata9fc19442011-07-06 02:13:41 +00004543bool
4544ClangASTContext::IsScalarType (lldb::clang_type_t clang_type)
4545{
4546 bool is_signed;
4547 if (ClangASTContext::IsIntegerType(clang_type, is_signed))
4548 return true;
4549
4550 uint32_t count;
4551 bool is_complex;
4552 return ClangASTContext::IsFloatingPointType(clang_type, count, is_complex) && !is_complex;
4553}
4554
4555bool
4556ClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type)
4557{
4558 if (!IsPointerType(clang_type))
4559 return false;
4560
4561 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4562 lldb::clang_type_t pointee_type = qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr();
4563 return IsScalarType(pointee_type);
4564}
4565
4566bool
4567ClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type)
4568{
4569 if (!IsArrayType(clang_type))
4570 return false;
4571
4572 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4573 lldb::clang_type_t item_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
4574 return IsScalarType(item_type);
4575}
4576
Greg Clayton8f92f0a2010-10-14 22:52:14 +00004577
4578bool
4579ClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
4580{
4581 if (clang_type)
4582 {
4583 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4584
4585 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4586 if (cxx_record_decl)
4587 {
4588 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
4589 return true;
4590 }
4591 }
4592 class_name.clear();
4593 return false;
4594}
4595
4596
Greg Clayton0fffff52010-09-24 05:15:53 +00004597bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004598ClangASTContext::IsCXXClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00004599{
4600 if (clang_type)
4601 {
4602 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4603 if (qual_type->getAsCXXRecordDecl() != NULL)
4604 return true;
4605 }
4606 return false;
4607}
4608
4609bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004610ClangASTContext::IsObjCClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00004611{
4612 if (clang_type)
4613 {
4614 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4615 if (qual_type->isObjCObjectOrInterfaceType())
4616 return true;
4617 }
4618 return false;
4619}
4620
4621
Greg Clayton73b472d2010-10-27 03:32:59 +00004622bool
4623ClangASTContext::IsCharType (clang_type_t clang_type)
4624{
4625 if (clang_type)
4626 return QualType::getFromOpaquePtr(clang_type)->isCharType();
4627 return false;
4628}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004629
4630bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004631ClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004632{
Greg Clayton73b472d2010-10-27 03:32:59 +00004633 clang_type_t pointee_or_element_clang_type = NULL;
4634 Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
4635
4636 if (pointee_or_element_clang_type == NULL)
4637 return false;
4638
4639 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004640 {
Greg Clayton73b472d2010-10-27 03:32:59 +00004641 QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
4642
4643 if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004644 {
Greg Clayton73b472d2010-10-27 03:32:59 +00004645 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4646 if (type_flags.Test (eTypeIsArray))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004647 {
Greg Clayton73b472d2010-10-27 03:32:59 +00004648 // We know the size of the array and it could be a C string
4649 // since it is an array of characters
4650 length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4651 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004652 }
Greg Clayton73b472d2010-10-27 03:32:59 +00004653 else
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004654 {
Greg Clayton73b472d2010-10-27 03:32:59 +00004655 length = 0;
4656 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004657 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004658
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004659 }
4660 }
4661 return false;
4662}
4663
4664bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004665ClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
Greg Clayton737b9322010-09-13 03:32:57 +00004666{
4667 if (clang_type)
4668 {
4669 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4670
4671 if (qual_type->isFunctionPointerType())
4672 return true;
4673
4674 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4675 switch (type_class)
4676 {
Sean Callananfb0b7582011-03-15 00:17:19 +00004677 default:
4678 break;
Greg Clayton737b9322010-09-13 03:32:57 +00004679 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00004680 return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00004681 case clang::Type::Elaborated:
4682 return ClangASTContext::IsFunctionPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00004683
4684 case clang::Type::LValueReference:
4685 case clang::Type::RValueReference:
4686 {
Sean Callanan78e37602011-01-27 04:42:51 +00004687 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00004688 if (reference_type)
4689 return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
4690 }
4691 break;
4692 }
4693 }
4694 return false;
4695}
4696
Greg Clayton73b472d2010-10-27 03:32:59 +00004697size_t
4698ClangASTContext::GetArraySize (clang_type_t clang_type)
4699{
4700 if (clang_type)
4701 {
Greg Claytonef37d68a2011-07-09 17:12:27 +00004702 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
4703 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4704 switch (type_class)
4705 {
4706 case clang::Type::ConstantArray:
4707 {
4708 const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
4709 if (array)
4710 return array->getSize().getLimitedValue();
4711 }
4712 break;
4713
4714 case clang::Type::Typedef:
4715 return ClangASTContext::GetArraySize(cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00004716
4717 case clang::Type::Elaborated:
4718 return ClangASTContext::GetArraySize(cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Enrico Granataf9fa6ee2011-07-12 00:18:11 +00004719
4720 default:
4721 break;
Greg Claytonef37d68a2011-07-09 17:12:27 +00004722 }
Greg Clayton73b472d2010-10-27 03:32:59 +00004723 }
4724 return 0;
4725}
Greg Clayton737b9322010-09-13 03:32:57 +00004726
4727bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004728ClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004729{
4730 if (!clang_type)
4731 return false;
4732
4733 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4734
Greg Clayton737b9322010-09-13 03:32:57 +00004735 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4736 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004737 {
Sean Callananfb0b7582011-03-15 00:17:19 +00004738 default:
4739 break;
Greg Claytonef37d68a2011-07-09 17:12:27 +00004740
Greg Claytone1a916a2010-07-21 22:12:05 +00004741 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004742 if (member_type)
4743 *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
4744 if (size)
Greg Claytonac4827f2011-04-01 18:14:08 +00004745 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004746 return true;
Greg Claytonef37d68a2011-07-09 17:12:27 +00004747
Greg Claytone1a916a2010-07-21 22:12:05 +00004748 case clang::Type::IncompleteArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004749 if (member_type)
4750 *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
4751 if (size)
4752 *size = 0;
4753 return true;
Greg Claytonef37d68a2011-07-09 17:12:27 +00004754
Greg Claytone1a916a2010-07-21 22:12:05 +00004755 case clang::Type::VariableArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004756 if (member_type)
4757 *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
4758 if (size)
4759 *size = 0;
Greg Clayton03dbf2e2011-02-02 00:52:14 +00004760 return true;
Greg Claytonef37d68a2011-07-09 17:12:27 +00004761
Greg Claytone1a916a2010-07-21 22:12:05 +00004762 case clang::Type::DependentSizedArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004763 if (member_type)
4764 *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
4765 if (size)
4766 *size = 0;
4767 return true;
Greg Claytonef37d68a2011-07-09 17:12:27 +00004768
4769 case clang::Type::Typedef:
4770 return ClangASTContext::IsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
4771 member_type,
4772 size);
Sean Callanan912855f2011-08-11 23:56:13 +00004773
4774 case clang::Type::Elaborated:
4775 return ClangASTContext::IsArrayType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
4776 member_type,
4777 size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004778 }
4779 return false;
4780}
4781
4782
4783#pragma mark Typedefs
4784
Greg Clayton1be10fc2010-09-29 01:12:09 +00004785clang_type_t
4786ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004787{
4788 if (clang_type)
4789 {
4790 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00004791 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004792 IdentifierTable *identifier_table = getIdentifierTable();
Greg Clayton6beaaa62011-01-17 03:46:26 +00004793 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004794 assert (identifier_table != NULL);
4795 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00004796 decl_ctx = ast->getTranslationUnitDecl();
4797 TypedefDecl *decl = TypedefDecl::Create (*ast,
4798 decl_ctx,
4799 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00004800 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00004801 name ? &identifier_table->get(name) : NULL, // Identifier
4802 ast->CreateTypeSourceInfo(qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00004803
4804 decl->setAccess(AS_public); // TODO respect proper access specifier
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004805
4806 // Get a uniqued QualType for the typedef decl type
Greg Clayton6beaaa62011-01-17 03:46:26 +00004807 return ast->getTypedefType (decl).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004808 }
4809 return NULL;
4810}
4811
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004812// Disable this for now since I can't seem to get a nicely formatted float
4813// out of the APFloat class without just getting the float, double or quad
4814// and then using a formatted print on it which defeats the purpose. We ideally
4815// would like to get perfect string values for any kind of float semantics
4816// so we can support remote targets. The code below also requires a patch to
4817// llvm::APInt.
4818//bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00004819//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 +00004820//{
4821// uint32_t count = 0;
4822// bool is_complex = false;
4823// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
4824// {
4825// unsigned num_bytes_per_float = byte_size / count;
4826// unsigned num_bits_per_float = num_bytes_per_float * 8;
4827//
4828// float_str.clear();
4829// uint32_t i;
4830// for (i=0; i<count; i++)
4831// {
4832// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
4833// bool is_ieee = false;
4834// APFloat ap_float(ap_int, is_ieee);
4835// char s[1024];
4836// unsigned int hex_digits = 0;
4837// bool upper_case = false;
4838//
4839// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
4840// {
4841// if (i > 0)
4842// float_str.append(", ");
4843// float_str.append(s);
4844// if (i == 1 && is_complex)
4845// float_str.append(1, 'i');
4846// }
4847// }
4848// return !float_str.empty();
4849// }
4850// return false;
4851//}
4852
4853size_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00004854ClangASTContext::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 +00004855{
4856 if (clang_type)
4857 {
4858 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4859 uint32_t count = 0;
4860 bool is_complex = false;
4861 if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
4862 {
4863 // TODO: handle complex and vector types
4864 if (count != 1)
4865 return false;
4866
4867 StringRef s_sref(s);
Greg Clayton6beaaa62011-01-17 03:46:26 +00004868 APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004869
Greg Clayton6beaaa62011-01-17 03:46:26 +00004870 const uint64_t bit_size = ast->getTypeSize (qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004871 const uint64_t byte_size = bit_size / 8;
4872 if (dst_size >= byte_size)
4873 {
4874 if (bit_size == sizeof(float)*8)
4875 {
4876 float float32 = ap_float.convertToFloat();
4877 ::memcpy (dst, &float32, byte_size);
4878 return byte_size;
4879 }
4880 else if (bit_size >= 64)
4881 {
4882 llvm::APInt ap_int(ap_float.bitcastToAPInt());
4883 ::memcpy (dst, ap_int.getRawData(), byte_size);
4884 return byte_size;
4885 }
4886 }
4887 }
4888 }
4889 return 0;
4890}
Sean Callanan6fe64b52010-09-17 02:24:29 +00004891
4892unsigned
Greg Clayton1be10fc2010-09-29 01:12:09 +00004893ClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
Sean Callanan6fe64b52010-09-17 02:24:29 +00004894{
4895 assert (clang_type);
4896
4897 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4898
4899 return qual_type.getQualifiers().getCVRQualifiers();
4900}
Greg Clayton6beaaa62011-01-17 03:46:26 +00004901
4902bool
4903ClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
4904{
4905 if (clang_type == NULL)
4906 return false;
4907
Greg Claytonc432c192011-01-20 04:18:48 +00004908 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00004909}
4910
4911
4912bool
4913ClangASTContext::GetCompleteType (clang_type_t clang_type)
4914{
4915 return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
4916}
4917
Greg Claytona2721472011-06-25 00:44:06 +00004918bool
4919ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
4920 clang::Decl *decl)
4921{
4922 if (!decl)
4923 return false;
4924
4925 ExternalASTSource *ast_source = ast->getExternalSource();
4926
4927 if (!ast_source)
4928 return false;
4929
4930 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
4931 {
4932 if (tag_decl->getDefinition())
4933 return true;
4934
4935 if (!tag_decl->hasExternalLexicalStorage())
4936 return false;
4937
4938 ast_source->CompleteType(tag_decl);
4939
4940 return !tag_decl->getTypeForDecl()->isIncompleteType();
4941 }
4942 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
4943 {
4944 if (!objc_interface_decl->isForwardDecl())
4945 return true;
4946
4947 if (!objc_interface_decl->hasExternalLexicalStorage())
4948 return false;
4949
4950 ast_source->CompleteType(objc_interface_decl);
4951
4952 return !objc_interface_decl->isForwardDecl();
4953 }
4954 else
4955 {
4956 return false;
4957 }
4958}
4959
Greg Clayton2c5f0e92011-08-04 21:02:57 +00004960clang::DeclContext *
4961ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
4962{
Sean Callanana87bee82011-08-19 06:19:25 +00004963 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00004964}
4965
4966clang::DeclContext *
4967ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
4968{
Sean Callanana87bee82011-08-19 06:19:25 +00004969 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00004970}
4971