blob: 0449902a193e834d99c100f5e35c87df8d290354 [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
Sean Callanan3b1d4f62011-10-26 17:46:51 +000028#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
Greg Clayton6beaaa62011-01-17 03:46:26 +000029#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"
Greg Claytonf0705c82011-10-22 03:33:13 +000039#include "clang/AST/DeclTemplate.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000040#include "clang/AST/RecordLayout.h"
41#include "clang/AST/Type.h"
42#include "clang/Basic/Builtins.h"
43#include "clang/Basic/FileManager.h"
Sean Callanan79439e82010-11-18 02:56:27 +000044#include "clang/Basic/FileSystemOptions.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045#include "clang/Basic/SourceManager.h"
46#include "clang/Basic/TargetInfo.h"
47#include "clang/Basic/TargetOptions.h"
48#include "clang/Frontend/FrontendOptions.h"
49#include "clang/Frontend/LangStandard.h"
Greg Clayton6beaaa62011-01-17 03:46:26 +000050
51#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000052#undef NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000053#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
54// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
55#include <assert.h>
56#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057
Greg Clayton514487e2011-02-15 21:59:32 +000058#include "lldb/Core/ArchSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059#include "lldb/Core/dwarf.h"
Greg Clayton73b472d2010-10-27 03:32:59 +000060#include "lldb/Core/Flags.h"
Sean Callananfb8b7092010-10-28 18:19:36 +000061#include "lldb/Core/Log.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000062#include "lldb/Core/RegularExpression.h"
63#include "lldb/Expression/ASTDumper.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000064#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Sean Callanan5e9e1992011-10-26 01:06:27 +000065#include "lldb/Symbol/VerifyDecl.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000066#include "lldb/Target/ExecutionContext.h"
67#include "lldb/Target/Process.h"
68#include "lldb/Target/ObjCLanguageRuntime.h"
69
Chris Lattner30fdc8d2010-06-08 16:52:24 +000070
Eli Friedman932197d2010-06-13 19:06:42 +000071#include <stdio.h>
72
Greg Claytonc86103d2010-08-05 01:57:25 +000073using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000074using namespace lldb_private;
75using namespace llvm;
76using namespace clang;
77
Greg Clayton6beaaa62011-01-17 03:46:26 +000078
79static bool
80GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type)
81{
82 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
83 switch (type_class)
84 {
85 case clang::Type::Record:
86 case clang::Type::Enum:
87 {
Sean Callanan78e37602011-01-27 04:42:51 +000088 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +000089 if (tag_type)
90 {
91 clang::TagDecl *tag_decl = tag_type->getDecl();
92 if (tag_decl)
93 {
94 if (tag_decl->getDefinition())
95 return true;
96
97 if (tag_decl->hasExternalLexicalStorage())
98 {
Greg Clayton007d5be2011-05-30 00:49:24 +000099 if (ast)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000100 {
Greg Clayton007d5be2011-05-30 00:49:24 +0000101 ExternalASTSource *external_ast_source = ast->getExternalSource();
102 if (external_ast_source)
103 {
104 external_ast_source->CompleteType(tag_decl);
105 return !tag_type->isIncompleteType();
106 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000107 }
108 }
109 return false;
110 }
111 }
112
113 }
114 break;
115
116 case clang::Type::ObjCObject:
117 case clang::Type::ObjCInterface:
118 {
Sean Callanan78e37602011-01-27 04:42:51 +0000119 const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000120 if (objc_class_type)
121 {
122 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
123 // We currently can't complete objective C types through the newly added ASTContext
124 // because it only supports TagDecl objects right now...
Enrico Granata9dd75c82011-07-15 23:30:15 +0000125 if (class_interface_decl)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000126 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000127 bool is_forward_decl = class_interface_decl->isForwardDecl();
128 if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage())
Greg Clayton6beaaa62011-01-17 03:46:26 +0000129 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000130 if (ast)
Greg Clayton007d5be2011-05-30 00:49:24 +0000131 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000132 ExternalASTSource *external_ast_source = ast->getExternalSource();
133 if (external_ast_source)
134 {
135 external_ast_source->CompleteType (class_interface_decl);
136 is_forward_decl = class_interface_decl->isForwardDecl();
137 }
Greg Clayton007d5be2011-05-30 00:49:24 +0000138 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000139 return is_forward_decl == false;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000140 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000141 return true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000142 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000143 else
144 return false;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000145 }
146 }
147 break;
148
149 case clang::Type::Typedef:
150 return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Sean Callanan912855f2011-08-11 23:56:13 +0000151
152 case clang::Type::Elaborated:
153 return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType());
Greg Clayton6beaaa62011-01-17 03:46:26 +0000154
155 default:
156 break;
157 }
158
159 return true;
160}
161
162
Greg Clayton8cf05932010-07-22 18:30:50 +0000163static AccessSpecifier
Greg Claytonc86103d2010-08-05 01:57:25 +0000164ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000165{
166 switch (access)
167 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000168 default: break;
169 case eAccessNone: return AS_none;
170 case eAccessPublic: return AS_public;
171 case eAccessPrivate: return AS_private;
172 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000173 }
174 return AS_none;
175}
176
177static ObjCIvarDecl::AccessControl
Greg Claytonc86103d2010-08-05 01:57:25 +0000178ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000179{
180 switch (access)
181 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000182 default: break;
183 case eAccessNone: return ObjCIvarDecl::None;
184 case eAccessPublic: return ObjCIvarDecl::Public;
185 case eAccessPrivate: return ObjCIvarDecl::Private;
186 case eAccessProtected: return ObjCIvarDecl::Protected;
187 case eAccessPackage: return ObjCIvarDecl::Package;
Greg Clayton8cf05932010-07-22 18:30:50 +0000188 }
189 return ObjCIvarDecl::None;
190}
191
192
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000193static void
194ParseLangArgs
195(
196 LangOptions &Opts,
Greg Clayton94e5d782010-06-13 17:34:29 +0000197 InputKind IK
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000198)
199{
200 // FIXME: Cleanup per-file based stuff.
201
202 // Set some properties which depend soley on the input kind; it would be nice
203 // to move these to the language standard, and have the driver resolve the
204 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000205 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000206 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000207 } else if (IK == IK_ObjC ||
208 IK == IK_ObjCXX ||
209 IK == IK_PreprocessedObjC ||
210 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000211 Opts.ObjC1 = Opts.ObjC2 = 1;
212 }
213
214 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
215
216 if (LangStd == LangStandard::lang_unspecified) {
217 // Based on the base language, pick one.
218 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000219 case IK_None:
220 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000221 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000222 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000223 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000224 LangStd = LangStandard::lang_opencl;
225 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000226 case IK_CUDA:
227 LangStd = LangStandard::lang_cuda;
228 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000229 case IK_Asm:
230 case IK_C:
231 case IK_PreprocessedC:
232 case IK_ObjC:
233 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000234 LangStd = LangStandard::lang_gnu99;
235 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000236 case IK_CXX:
237 case IK_PreprocessedCXX:
238 case IK_ObjCXX:
239 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000240 LangStd = LangStandard::lang_gnucxx98;
241 break;
242 }
243 }
244
245 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
246 Opts.BCPLComment = Std.hasBCPLComments();
247 Opts.C99 = Std.isC99();
248 Opts.CPlusPlus = Std.isCPlusPlus();
249 Opts.CPlusPlus0x = Std.isCPlusPlus0x();
250 Opts.Digraphs = Std.hasDigraphs();
251 Opts.GNUMode = Std.isGNUMode();
252 Opts.GNUInline = !Std.isC99();
253 Opts.HexFloats = Std.hasHexFloats();
254 Opts.ImplicitInt = Std.hasImplicitInt();
255
256 // OpenCL has some additional defaults.
257 if (LangStd == LangStandard::lang_opencl) {
258 Opts.OpenCL = 1;
259 Opts.AltiVec = 1;
260 Opts.CXXOperatorNames = 1;
261 Opts.LaxVectorConversions = 1;
262 }
263
264 // OpenCL and C++ both have bool, true, false keywords.
265 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
266
267// if (Opts.CPlusPlus)
268// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
269//
270// if (Args.hasArg(OPT_fobjc_gc_only))
271// Opts.setGCMode(LangOptions::GCOnly);
272// else if (Args.hasArg(OPT_fobjc_gc))
273// Opts.setGCMode(LangOptions::HybridGC);
274//
275// if (Args.hasArg(OPT_print_ivar_layout))
276// Opts.ObjCGCBitmapPrint = 1;
277//
278// if (Args.hasArg(OPT_faltivec))
279// Opts.AltiVec = 1;
280//
281// if (Args.hasArg(OPT_pthread))
282// Opts.POSIXThreads = 1;
283//
284// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
285// "default");
286// if (Vis == "default")
Sean Callanan31e851c2010-10-29 18:38:40 +0000287 Opts.setVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000288// else if (Vis == "hidden")
289// Opts.setVisibilityMode(LangOptions::Hidden);
290// else if (Vis == "protected")
291// Opts.setVisibilityMode(LangOptions::Protected);
292// else
293// Diags.Report(diag::err_drv_invalid_value)
294// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
295
296// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
297
298 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
299 // is specified, or -std is set to a conforming mode.
300 Opts.Trigraphs = !Opts.GNUMode;
301// if (Args.hasArg(OPT_trigraphs))
302// Opts.Trigraphs = 1;
303//
304// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
305// OPT_fno_dollars_in_identifiers,
306// !Opts.AsmPreprocessor);
307// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
308// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
309// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
310// if (Args.hasArg(OPT_fno_lax_vector_conversions))
311// Opts.LaxVectorConversions = 0;
312// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
313// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
314// Opts.Blocks = Args.hasArg(OPT_fblocks);
315// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
316// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
317// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
318// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
319// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
320// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
321// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
322// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
323// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
324// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
325// Diags);
326// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
327// Opts.ObjCConstantStringClass = getLastArgValue(Args,
328// OPT_fconstant_string_class);
329// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
330// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
331// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
332// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
333// Opts.Static = Args.hasArg(OPT_static_define);
334 Opts.OptimizeSize = 0;
335
336 // FIXME: Eliminate this dependency.
337// unsigned Opt =
338// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
339// Opts.Optimize = Opt != 0;
340 unsigned Opt = 0;
341
342 // This is the __NO_INLINE__ define, which just depends on things like the
343 // optimization level and -fno-inline, not actually whether the backend has
344 // inlining enabled.
345 //
346 // FIXME: This is affected by other options (-fno-inline).
347 Opts.NoInline = !Opt;
348
349// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
350// switch (SSP) {
351// default:
352// Diags.Report(diag::err_drv_invalid_value)
353// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
354// break;
355// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
356// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
357// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
358// }
359}
360
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000361
Greg Clayton6beaaa62011-01-17 03:46:26 +0000362ClangASTContext::ClangASTContext (const char *target_triple) :
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000363 m_target_triple(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000364 m_ast_ap(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000365 m_language_options_ap(),
366 m_source_manager_ap(),
Sean Callanan880e6802011-10-07 23:18:13 +0000367 m_diagnostics_engine_ap(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000368 m_target_options_ap(),
369 m_target_info_ap(),
370 m_identifier_table_ap(),
371 m_selector_table_ap(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000372 m_builtins_ap(),
373 m_callback_tag_decl (NULL),
374 m_callback_objc_decl (NULL),
375 m_callback_baton (NULL)
376
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377{
378 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000379 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000380}
381
382//----------------------------------------------------------------------
383// Destructor
384//----------------------------------------------------------------------
385ClangASTContext::~ClangASTContext()
386{
387 m_builtins_ap.reset();
388 m_selector_table_ap.reset();
389 m_identifier_table_ap.reset();
390 m_target_info_ap.reset();
391 m_target_options_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000392 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000393 m_source_manager_ap.reset();
394 m_language_options_ap.reset();
Greg Clayton6beaaa62011-01-17 03:46:26 +0000395 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000396}
397
398
399void
400ClangASTContext::Clear()
401{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000402 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000403 m_language_options_ap.reset();
404 m_source_manager_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000405 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000406 m_target_options_ap.reset();
407 m_target_info_ap.reset();
408 m_identifier_table_ap.reset();
409 m_selector_table_ap.reset();
410 m_builtins_ap.reset();
411}
412
413const char *
414ClangASTContext::GetTargetTriple ()
415{
416 return m_target_triple.c_str();
417}
418
419void
420ClangASTContext::SetTargetTriple (const char *target_triple)
421{
422 Clear();
423 m_target_triple.assign(target_triple);
424}
425
Greg Clayton514487e2011-02-15 21:59:32 +0000426void
427ClangASTContext::SetArchitecture (const ArchSpec &arch)
428{
Greg Clayton880cbb02011-07-30 01:26:02 +0000429 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000430}
431
Greg Clayton6beaaa62011-01-17 03:46:26 +0000432bool
433ClangASTContext::HasExternalSource ()
434{
435 ASTContext *ast = getASTContext();
436 if (ast)
437 return ast->getExternalSource () != NULL;
438 return false;
439}
440
441void
442ClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
443{
444 ASTContext *ast = getASTContext();
445 if (ast)
446 {
447 ast->setExternalSource (ast_source_ap);
448 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
449 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
450 }
451}
452
453void
454ClangASTContext::RemoveExternalSource ()
455{
456 ASTContext *ast = getASTContext();
457
458 if (ast)
459 {
460 llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
461 ast->setExternalSource (empty_ast_source_ap);
462 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
463 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
464 }
465}
466
467
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000468
469ASTContext *
470ClangASTContext::getASTContext()
471{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000472 if (m_ast_ap.get() == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000473 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000474 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
475 *getSourceManager(),
Sean Callanan880e6802011-10-07 23:18:13 +0000476 getTargetInfo(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000477 *getIdentifierTable(),
478 *getSelectorTable(),
479 *getBuiltinContext(),
480 0));
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000481
Greg Clayton6beaaa62011-01-17 03:46:26 +0000482 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
483 {
484 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
485 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
486 }
487
Sean Callanan880e6802011-10-07 23:18:13 +0000488 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000489 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000490 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000491}
492
493Builtin::Context *
494ClangASTContext::getBuiltinContext()
495{
496 if (m_builtins_ap.get() == NULL)
Sean Callanan880e6802011-10-07 23:18:13 +0000497 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000498 return m_builtins_ap.get();
499}
500
501IdentifierTable *
502ClangASTContext::getIdentifierTable()
503{
504 if (m_identifier_table_ap.get() == NULL)
505 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
506 return m_identifier_table_ap.get();
507}
508
509LangOptions *
510ClangASTContext::getLanguageOptions()
511{
512 if (m_language_options_ap.get() == NULL)
513 {
514 m_language_options_ap.reset(new LangOptions());
Greg Clayton94e5d782010-06-13 17:34:29 +0000515 ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
516// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000517 }
518 return m_language_options_ap.get();
519}
520
521SelectorTable *
522ClangASTContext::getSelectorTable()
523{
524 if (m_selector_table_ap.get() == NULL)
525 m_selector_table_ap.reset (new SelectorTable());
526 return m_selector_table_ap.get();
527}
528
Sean Callanan79439e82010-11-18 02:56:27 +0000529clang::FileManager *
530ClangASTContext::getFileManager()
531{
532 if (m_file_manager_ap.get() == NULL)
Greg Clayton38a61402010-12-02 23:20:03 +0000533 {
534 clang::FileSystemOptions file_system_options;
535 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
536 }
Sean Callanan79439e82010-11-18 02:56:27 +0000537 return m_file_manager_ap.get();
538}
539
Greg Claytone1a916a2010-07-21 22:12:05 +0000540clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000541ClangASTContext::getSourceManager()
542{
543 if (m_source_manager_ap.get() == NULL)
Sean Callanan880e6802011-10-07 23:18:13 +0000544 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000545 return m_source_manager_ap.get();
546}
547
Sean Callanan880e6802011-10-07 23:18:13 +0000548clang::DiagnosticsEngine *
549ClangASTContext::getDiagnosticsEngine()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000550{
Sean Callanan880e6802011-10-07 23:18:13 +0000551 if (m_diagnostics_engine_ap.get() == NULL)
Greg Claytona651b532010-11-19 21:46:54 +0000552 {
553 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callanan880e6802011-10-07 23:18:13 +0000554 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp));
Greg Claytona651b532010-11-19 21:46:54 +0000555 }
Sean Callanan880e6802011-10-07 23:18:13 +0000556 return m_diagnostics_engine_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000557}
558
Sean Callanan880e6802011-10-07 23:18:13 +0000559class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000560{
561public:
Sean Callanan880e6802011-10-07 23:18:13 +0000562 NullDiagnosticConsumer ()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000563 {
564 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
565 }
566
Sean Callanan880e6802011-10-07 23:18:13 +0000567 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000568 {
569 if (m_log)
570 {
571 llvm::SmallVectorImpl<char> diag_str(10);
572 info.FormatDiagnostic(diag_str);
573 diag_str.push_back('\0');
574 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
575 }
576 }
Sean Callanan880e6802011-10-07 23:18:13 +0000577
578 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
579 {
580 return new NullDiagnosticConsumer ();
581 }
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000582private:
583 LogSP m_log;
584};
585
Sean Callanan880e6802011-10-07 23:18:13 +0000586DiagnosticConsumer *
587ClangASTContext::getDiagnosticConsumer()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000588{
Sean Callanan880e6802011-10-07 23:18:13 +0000589 if (m_diagnostic_consumer_ap.get() == NULL)
590 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000591
Sean Callanan880e6802011-10-07 23:18:13 +0000592 return m_diagnostic_consumer_ap.get();
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000593}
594
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000595TargetOptions *
596ClangASTContext::getTargetOptions()
597{
598 if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
599 {
600 m_target_options_ap.reset (new TargetOptions());
601 if (m_target_options_ap.get())
602 m_target_options_ap->Triple = m_target_triple;
603 }
604 return m_target_options_ap.get();
605}
606
607
608TargetInfo *
609ClangASTContext::getTargetInfo()
610{
611 // target_triple should be something like "x86_64-apple-darwin10"
612 if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
Sean Callanan880e6802011-10-07 23:18:13 +0000613 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), *getTargetOptions()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000614 return m_target_info_ap.get();
615}
616
617#pragma mark Basic Types
618
619static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000620QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000621{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000622 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000623 if (qual_type_bit_size == bit_size)
624 return true;
625 return false;
626}
627
Greg Clayton1be10fc2010-09-29 01:12:09 +0000628clang_type_t
Greg Claytonc86103d2010-08-05 01:57:25 +0000629ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000630{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000631 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000632
Greg Clayton6beaaa62011-01-17 03:46:26 +0000633 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000634
Greg Clayton6beaaa62011-01-17 03:46:26 +0000635 return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000636}
637
Greg Clayton1be10fc2010-09-29 01:12:09 +0000638clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000639ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000640{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000641 if (!ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000642 return NULL;
643
644 switch (encoding)
645 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000646 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000647 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
648 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000649 break;
650
Greg Claytonc86103d2010-08-05 01:57:25 +0000651 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000652 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
653 return ast->UnsignedCharTy.getAsOpaquePtr();
654 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
655 return ast->UnsignedShortTy.getAsOpaquePtr();
656 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
657 return ast->UnsignedIntTy.getAsOpaquePtr();
658 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
659 return ast->UnsignedLongTy.getAsOpaquePtr();
660 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
661 return ast->UnsignedLongLongTy.getAsOpaquePtr();
662 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
663 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000664 break;
665
Greg Claytonc86103d2010-08-05 01:57:25 +0000666 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000667 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
668 return ast->CharTy.getAsOpaquePtr();
669 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
670 return ast->ShortTy.getAsOpaquePtr();
671 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
672 return ast->IntTy.getAsOpaquePtr();
673 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
674 return ast->LongTy.getAsOpaquePtr();
675 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
676 return ast->LongLongTy.getAsOpaquePtr();
677 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
678 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000679 break;
680
Greg Claytonc86103d2010-08-05 01:57:25 +0000681 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000682 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
683 return ast->FloatTy.getAsOpaquePtr();
684 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
685 return ast->DoubleTy.getAsOpaquePtr();
686 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
687 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000688 break;
689
Greg Claytonc86103d2010-08-05 01:57:25 +0000690 case eEncodingVector:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000691 default:
692 break;
693 }
694
695 return NULL;
696}
697
Greg Clayton1be10fc2010-09-29 01:12:09 +0000698clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000699ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
700{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000701 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000702
703 #define streq(a,b) strcmp(a,b) == 0
Greg Clayton6beaaa62011-01-17 03:46:26 +0000704 assert (ast != NULL);
705 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000706 {
707 switch (dw_ate)
708 {
709 default:
710 break;
711
712 case DW_ATE_address:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000713 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
714 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000715 break;
716
717 case DW_ATE_boolean:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000718 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
719 return ast->BoolTy.getAsOpaquePtr();
720 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
721 return ast->UnsignedCharTy.getAsOpaquePtr();
722 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
723 return ast->UnsignedShortTy.getAsOpaquePtr();
724 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
725 return ast->UnsignedIntTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000726 break;
727
Greg Clayton49462ea2011-01-15 02:52:14 +0000728 case DW_ATE_lo_user:
729 // This has been seen to mean DW_AT_complex_integer
Greg Clayton605684e2011-10-28 23:06:08 +0000730 if (type_name)
Greg Clayton49462ea2011-01-15 02:52:14 +0000731 {
Greg Clayton605684e2011-10-28 23:06:08 +0000732 if (::strstr(type_name, "complex"))
733 {
734 clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
735 return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
736 }
Greg Clayton49462ea2011-01-15 02:52:14 +0000737 }
738 break;
739
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000740 case DW_ATE_complex_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000741 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
742 return ast->FloatComplexTy.getAsOpaquePtr();
743 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
744 return ast->DoubleComplexTy.getAsOpaquePtr();
745 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
746 return ast->LongDoubleComplexTy.getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000747 else
748 {
749 clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000750 return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000751 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000752 break;
753
754 case DW_ATE_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000755 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
756 return ast->FloatTy.getAsOpaquePtr();
757 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
758 return ast->DoubleTy.getAsOpaquePtr();
759 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
760 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000761 break;
762
763 case DW_ATE_signed:
764 if (type_name)
765 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000766 if (strstr(type_name, "long long"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000767 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000768 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
769 return ast->LongLongTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000770 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000771 else if (strstr(type_name, "long"))
772 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000773 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
774 return ast->LongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000775 }
776 else if (strstr(type_name, "short"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000777 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000778 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
779 return ast->ShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000780 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000781 else if (strstr(type_name, "char"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000782 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000783 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
784 return ast->CharTy.getAsOpaquePtr();
785 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
786 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000787 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000788 else if (strstr(type_name, "int"))
789 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000790 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
791 return ast->IntTy.getAsOpaquePtr();
792 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
793 return ast->Int128Ty.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000794 }
795 else if (streq(type_name, "wchar_t"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000796 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000797 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
798 return ast->WCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000799 }
Greg Clayton7bd65b92011-02-09 23:39:34 +0000800 else if (streq(type_name, "void"))
801 {
802 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
803 return ast->VoidTy.getAsOpaquePtr();
804 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000805 }
806 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000807 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
808 return ast->CharTy.getAsOpaquePtr();
809 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
810 return ast->ShortTy.getAsOpaquePtr();
811 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
812 return ast->IntTy.getAsOpaquePtr();
813 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
814 return ast->LongTy.getAsOpaquePtr();
815 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
816 return ast->LongLongTy.getAsOpaquePtr();
817 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
818 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000819 break;
820
821 case DW_ATE_signed_char:
822 if (type_name)
823 {
824 if (streq(type_name, "signed char"))
825 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000826 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
827 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000828 }
829 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000830 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
831 return ast->CharTy.getAsOpaquePtr();
832 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
833 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000834 break;
835
836 case DW_ATE_unsigned:
837 if (type_name)
838 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000839 if (strstr(type_name, "long long"))
840 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000841 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
842 return ast->UnsignedLongLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000843 }
844 else if (strstr(type_name, "long"))
845 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000846 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
847 return ast->UnsignedLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000848 }
849 else if (strstr(type_name, "short"))
850 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000851 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
852 return ast->UnsignedShortTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000853 }
854 else if (strstr(type_name, "char"))
855 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000856 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
857 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000858 }
859 else if (strstr(type_name, "int"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000860 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000861 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
862 return ast->UnsignedIntTy.getAsOpaquePtr();
863 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
864 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000865 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000866 }
867 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000868 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
869 return ast->UnsignedCharTy.getAsOpaquePtr();
870 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
871 return ast->UnsignedShortTy.getAsOpaquePtr();
872 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
873 return ast->UnsignedIntTy.getAsOpaquePtr();
874 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
875 return ast->UnsignedLongTy.getAsOpaquePtr();
876 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
877 return ast->UnsignedLongLongTy.getAsOpaquePtr();
878 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
879 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000880 break;
881
882 case DW_ATE_unsigned_char:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000883 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
884 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton7bd65b92011-02-09 23:39:34 +0000885 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
886 return ast->UnsignedShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000887 break;
888
889 case DW_ATE_imaginary_float:
890 break;
Greg Clayton605684e2011-10-28 23:06:08 +0000891
892 case DW_ATE_UTF:
893 if (type_name)
894 {
895 if (streq(type_name, "char16_t"))
896 {
897 return ast->Char16Ty.getAsOpaquePtr();
898 }
899 else if (streq(type_name, "char32_t"))
900 {
901 return ast->Char32Ty.getAsOpaquePtr();
902 }
903 }
904 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000905 }
906 }
907 // This assert should fire for anything that we don't catch above so we know
908 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +0000909 if (type_name)
910 {
Greg Claytone38a5ed2012-01-05 03:57:59 +0000911 Host::SystemLog (Host::eSystemLogError, "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);
Greg Claytondc968d12011-05-17 18:15:05 +0000912 }
913 else
914 {
Greg Claytone38a5ed2012-01-05 03:57:59 +0000915 Host::SystemLog (Host::eSystemLogError, "error: need to add support for DW_TAG_base_type encoded with DW_ATE = 0x%x, bit_size = %u\n", dw_ate, bit_size);
Greg Claytondc968d12011-05-17 18:15:05 +0000916 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000917 return NULL;
918}
919
Greg Clayton1be10fc2010-09-29 01:12:09 +0000920clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000921ClangASTContext::GetBuiltInType_void(ASTContext *ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000922{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000923 return ast->VoidTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000924}
925
Greg Clayton1be10fc2010-09-29 01:12:09 +0000926clang_type_t
Sean Callananf7c3e272010-11-19 02:52:21 +0000927ClangASTContext::GetBuiltInType_bool()
928{
929 return getASTContext()->BoolTy.getAsOpaquePtr();
930}
931
932clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000933ClangASTContext::GetBuiltInType_objc_id()
934{
Sean Callanand5c17ed2011-11-15 02:11:17 +0000935 return getASTContext()->getObjCIdType().getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000936}
937
Greg Clayton1be10fc2010-09-29 01:12:09 +0000938clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000939ClangASTContext::GetBuiltInType_objc_Class()
940{
Sean Callanand5c17ed2011-11-15 02:11:17 +0000941 return getASTContext()->getObjCClassType().getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000942}
943
Greg Clayton1be10fc2010-09-29 01:12:09 +0000944clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000945ClangASTContext::GetBuiltInType_objc_selector()
946{
Sean Callanand5c17ed2011-11-15 02:11:17 +0000947 return getASTContext()->getObjCSelType().getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000948}
949
Greg Clayton1be10fc2010-09-29 01:12:09 +0000950clang_type_t
Sean Callanan77502262011-05-12 23:54:16 +0000951ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
952{
953 return ast->UnknownAnyTy.getAsOpaquePtr();
954}
955
956clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000957ClangASTContext::GetCStringType (bool is_const)
958{
959 QualType char_type(getASTContext()->CharTy);
960
961 if (is_const)
962 char_type.addConst();
963
964 return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
965}
966
Greg Clayton1be10fc2010-09-29 01:12:09 +0000967clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000968ClangASTContext::GetVoidPtrType (bool is_const)
969{
970 return GetVoidPtrType(getASTContext(), is_const);
971}
972
Greg Clayton1be10fc2010-09-29 01:12:09 +0000973clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000974ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000975{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000976 QualType void_ptr_type(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000977
978 if (is_const)
979 void_ptr_type.addConst();
980
981 return void_ptr_type.getAsOpaquePtr();
982}
983
Sean Callanan09ab4b72011-11-30 22:11:59 +0000984clang::DeclContext *
985ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
986{
987 return ast->getTranslationUnitDecl();
988}
989
Greg Clayton1be10fc2010-09-29 01:12:09 +0000990clang_type_t
Greg Clayton38a61402010-12-02 23:20:03 +0000991ClangASTContext::CopyType (ASTContext *dst_ast,
992 ASTContext *src_ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +0000993 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000994{
Sean Callanan79439e82010-11-18 02:56:27 +0000995 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +0000996 FileManager file_manager (file_system_options);
997 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +0000998 *src_ast, file_manager,
999 false);
Sean Callanan0617fcb2010-11-09 22:37:10 +00001000
Greg Clayton38a61402010-12-02 23:20:03 +00001001 QualType src (QualType::getFromOpaquePtr(clang_type));
1002 QualType dst (importer.Import(src));
Sean Callanan0617fcb2010-11-09 22:37:10 +00001003
1004 return dst.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001005}
1006
Greg Clayton526e5af2010-11-13 03:52:47 +00001007
1008clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001009ClangASTContext::CopyDecl (ASTContext *dst_ast,
1010 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001011 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001012{
Sean Callanan79439e82010-11-18 02:56:27 +00001013 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001014 FileManager file_manager (file_system_options);
1015 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001016 *src_ast, file_manager,
1017 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001018
1019 return importer.Import(source_decl);
1020}
1021
Sean Callanan23a30272010-07-16 00:00:27 +00001022bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00001023ClangASTContext::AreTypesSame(ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001024 clang_type_t type1,
1025 clang_type_t type2)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001026{
Greg Claytonf4ecaa52011-02-16 23:00:21 +00001027 return ast->hasSameType (QualType::getFromOpaquePtr(type1),
1028 QualType::getFromOpaquePtr(type2));
Sean Callanan4dcca2622010-07-15 22:30:52 +00001029}
1030
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001031#pragma mark CVR modifiers
1032
Greg Clayton1be10fc2010-09-29 01:12:09 +00001033clang_type_t
1034ClangASTContext::AddConstModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001035{
1036 if (clang_type)
1037 {
1038 QualType result(QualType::getFromOpaquePtr(clang_type));
1039 result.addConst();
1040 return result.getAsOpaquePtr();
1041 }
1042 return NULL;
1043}
1044
Greg Clayton1be10fc2010-09-29 01:12:09 +00001045clang_type_t
1046ClangASTContext::AddRestrictModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001047{
1048 if (clang_type)
1049 {
1050 QualType result(QualType::getFromOpaquePtr(clang_type));
1051 result.getQualifiers().setRestrict (true);
1052 return result.getAsOpaquePtr();
1053 }
1054 return NULL;
1055}
1056
Greg Clayton1be10fc2010-09-29 01:12:09 +00001057clang_type_t
1058ClangASTContext::AddVolatileModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001059{
1060 if (clang_type)
1061 {
1062 QualType result(QualType::getFromOpaquePtr(clang_type));
1063 result.getQualifiers().setVolatile (true);
1064 return result.getAsOpaquePtr();
1065 }
1066 return NULL;
1067}
1068
Greg Clayton6beaaa62011-01-17 03:46:26 +00001069
1070clang_type_t
1071ClangASTContext::GetTypeForDecl (TagDecl *decl)
1072{
1073 // No need to call the getASTContext() accessor (which can create the AST
1074 // if it isn't created yet, because we can't have created a decl in this
1075 // AST if our AST didn't already exist...
1076 if (m_ast_ap.get())
1077 return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1078 return NULL;
1079}
1080
1081clang_type_t
1082ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1083{
1084 // No need to call the getASTContext() accessor (which can create the AST
1085 // if it isn't created yet, because we can't have created a decl in this
1086 // AST if our AST didn't already exist...
1087 if (m_ast_ap.get())
1088 return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1089 return NULL;
1090}
1091
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001092#pragma mark Structure, Unions, Classes
1093
Greg Clayton1be10fc2010-09-29 01:12:09 +00001094clang_type_t
Greg Clayton55561e92011-10-26 03:31:36 +00001095ClangASTContext::CreateRecordType (DeclContext *decl_ctx, AccessType access_type, const char *name, int kind, LanguageType language)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001096{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001097 ASTContext *ast = getASTContext();
1098 assert (ast != NULL);
Sean Callanana2424172010-10-25 00:29:48 +00001099
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001100 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001101 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001102
Greg Clayton9e409562010-07-28 02:04:09 +00001103
Greg Claytone1be9962011-08-24 23:50:00 +00001104 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001105 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001106 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001107 bool isInternal = false;
1108 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
1109 }
1110
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001111 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1112 // we will need to update this code. I was told to currently always use
1113 // the CXXRecordDecl class since we often don't know from debug information
1114 // if something is struct or a class, so we default to always use the more
1115 // complete definition just in case.
Greg Claytonf0705c82011-10-22 03:33:13 +00001116 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1117 (TagDecl::TagKind)kind,
1118 decl_ctx,
1119 SourceLocation(),
1120 SourceLocation(),
1121 name && name[0] ? &ast->Idents.get(name) : NULL);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001122
1123 if (!name)
1124 decl->setAnonymousStructOrUnion(true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001125
Greg Clayton55561e92011-10-26 03:31:36 +00001126 if (decl_ctx)
1127 {
1128 if (access_type != eAccessNone)
1129 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
1130 decl_ctx->addDecl (decl);
1131 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001132 return ast->getTagDeclType(decl).getAsOpaquePtr();
1133}
1134
Greg Claytonf0705c82011-10-22 03:33:13 +00001135ClassTemplateDecl *
1136ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001137 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001138 const char *class_name,
1139 int kind,
1140 const TemplateParameterInfos &template_param_infos)
1141{
1142 ASTContext *ast = getASTContext();
1143
1144 ClassTemplateDecl *class_template_decl = NULL;
1145 if (decl_ctx == NULL)
1146 decl_ctx = ast->getTranslationUnitDecl();
1147
1148 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1149 DeclarationName decl_name (&identifier_info);
1150
1151 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
1152 for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos)
1153 {
1154 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(*pos);
1155 if (class_template_decl)
1156 return class_template_decl;
1157 }
1158
1159 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1160 const bool parameter_pack = false;
1161 const bool is_typename = false;
1162 const unsigned depth = 0;
1163 const size_t num_template_params = template_param_infos.GetSize();
1164 for (size_t i=0; i<num_template_params; ++i)
1165 {
1166 const char *name = template_param_infos.names[i];
1167 if (template_param_infos.args[i].getAsIntegral())
1168 {
1169 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1170 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1171 SourceLocation(),
1172 SourceLocation(),
1173 depth,
1174 i,
1175 &ast->Idents.get(name),
Greg Claytone04741d2011-12-02 02:09:28 +00001176 template_param_infos.args[i].getIntegralType(),
Greg Claytonf0705c82011-10-22 03:33:13 +00001177 parameter_pack,
1178 NULL));
1179
1180 }
1181 else
1182 {
1183 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1184 ast->getTranslationUnitDecl(), // Is this the right decl context?
1185 SourceLocation(),
1186 SourceLocation(),
1187 depth,
1188 i,
1189 &ast->Idents.get(name),
1190 is_typename,
1191 parameter_pack));
1192 }
1193 }
1194
1195 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1196 SourceLocation(),
1197 SourceLocation(),
1198 &template_param_decls.front(),
1199 template_param_decls.size(),
1200 SourceLocation());
1201
1202
1203 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1204 (TagDecl::TagKind)kind,
1205 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1206 SourceLocation(),
1207 SourceLocation(),
1208 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001209
1210 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1211 i < template_param_decl_count;
1212 ++i)
1213 {
1214 template_param_decls[i]->setDeclContext (template_cxx_decl);
1215 }
1216
Sean Callananb5c79622011-11-19 01:35:08 +00001217 // With templated classes, we say that a class is templated with
1218 // specializations, but that the bare class has no functions.
1219 template_cxx_decl->startDefinition();
1220 template_cxx_decl->completeDefinition();
1221
Greg Claytonf0705c82011-10-22 03:33:13 +00001222 class_template_decl = ClassTemplateDecl::Create (*ast,
1223 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1224 SourceLocation(),
1225 decl_name,
1226 template_param_list,
1227 template_cxx_decl,
1228 NULL);
1229
1230 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001231 {
Greg Clayton55561e92011-10-26 03:31:36 +00001232 if (access_type != eAccessNone)
1233 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Claytonf0705c82011-10-22 03:33:13 +00001234 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001235
1236#ifdef LLDB_CONFIGURATION_DEBUG
1237 VerifyDecl(class_template_decl);
1238#endif
1239 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001240
1241 return class_template_decl;
1242}
1243
1244
1245ClassTemplateSpecializationDecl *
1246ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1247 ClassTemplateDecl *class_template_decl,
1248 int kind,
1249 const TemplateParameterInfos &template_param_infos)
1250{
1251 ASTContext *ast = getASTContext();
1252 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1253 (TagDecl::TagKind)kind,
1254 decl_ctx,
1255 SourceLocation(),
1256 SourceLocation(),
1257 class_template_decl,
1258 &template_param_infos.args.front(),
1259 template_param_infos.args.size(),
1260 NULL);
1261
1262 return class_template_specialization_decl;
1263}
1264
1265lldb::clang_type_t
1266ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1267{
1268 if (class_template_specialization_decl)
1269 {
1270 ASTContext *ast = getASTContext();
1271 if (ast)
1272 return ast->getTagDeclType(class_template_specialization_decl).getAsOpaquePtr();
1273 }
1274 return NULL;
1275}
1276
Greg Clayton6beaaa62011-01-17 03:46:26 +00001277bool
1278ClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1279{
1280 if (clang_type == NULL)
1281 return false;
1282
1283 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1284
1285 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1286 switch (type_class)
1287 {
1288 case clang::Type::Record:
1289 {
1290 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1291 if (cxx_record_decl)
1292 {
1293 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001294 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001295 return true;
1296 }
1297 }
1298 break;
1299
1300 case clang::Type::Enum:
1301 {
1302 EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1303 if (enum_decl)
1304 {
1305 enum_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001306 enum_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001307 return true;
1308 }
1309 }
1310 break;
1311
1312 case clang::Type::ObjCObject:
1313 case clang::Type::ObjCInterface:
1314 {
Sean Callanan78e37602011-01-27 04:42:51 +00001315 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00001316 assert (objc_class_type);
1317 if (objc_class_type)
1318 {
1319 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1320
1321 if (class_interface_decl)
1322 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001323 class_interface_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001324 class_interface_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001325 return true;
1326 }
1327 }
1328 }
1329 break;
1330
1331 case clang::Type::Typedef:
1332 return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Sean Callanan912855f2011-08-11 23:56:13 +00001333
1334 case clang::Type::Elaborated:
1335 return ClangASTContext::SetHasExternalStorage (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001336
1337 default:
1338 break;
1339 }
1340 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001341}
1342
Greg Claytona3c444a2010-10-01 23:13:49 +00001343static bool
1344IsOperator (const char *name, OverloadedOperatorKind &op_kind)
1345{
1346 if (name == NULL || name[0] == '\0')
1347 return false;
1348
Sean Callanana43f20d2010-12-10 19:51:54 +00001349#define OPERATOR_PREFIX "operator"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001350#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
Sean Callananbfeff8c2010-12-10 02:15:55 +00001351
1352 const char *post_op_name = NULL;
1353
Sean Callanana43f20d2010-12-10 19:51:54 +00001354 bool no_space = true;
Sean Callananbfeff8c2010-12-10 02:15:55 +00001355
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001356 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
Greg Claytona3c444a2010-10-01 23:13:49 +00001357 return false;
1358
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001359 post_op_name = name + OPERATOR_PREFIX_LENGTH;
1360
Sean Callanana43f20d2010-12-10 19:51:54 +00001361 if (post_op_name[0] == ' ')
1362 {
1363 post_op_name++;
1364 no_space = false;
1365 }
1366
1367#undef OPERATOR_PREFIX
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001368#undef OPERATOR_PREFIX_LENGTH
Sean Callanana43f20d2010-12-10 19:51:54 +00001369
Greg Claytona3c444a2010-10-01 23:13:49 +00001370 // This is an operator, set the overloaded operator kind to invalid
1371 // in case this is a conversion operator...
1372 op_kind = NUM_OVERLOADED_OPERATORS;
1373
1374 switch (post_op_name[0])
1375 {
Sean Callananbfeff8c2010-12-10 02:15:55 +00001376 default:
1377 if (no_space)
1378 return false;
1379 break;
Greg Claytona3c444a2010-10-01 23:13:49 +00001380 case 'n':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001381 if (no_space)
1382 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001383 if (strcmp (post_op_name, "new") == 0)
1384 op_kind = OO_New;
1385 else if (strcmp (post_op_name, "new[]") == 0)
1386 op_kind = OO_Array_New;
1387 break;
1388
1389 case 'd':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001390 if (no_space)
1391 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001392 if (strcmp (post_op_name, "delete") == 0)
1393 op_kind = OO_Delete;
1394 else if (strcmp (post_op_name, "delete[]") == 0)
1395 op_kind = OO_Array_Delete;
1396 break;
1397
1398 case '+':
1399 if (post_op_name[1] == '\0')
1400 op_kind = OO_Plus;
1401 else if (post_op_name[2] == '\0')
1402 {
1403 if (post_op_name[1] == '=')
1404 op_kind = OO_PlusEqual;
1405 else if (post_op_name[1] == '+')
1406 op_kind = OO_PlusPlus;
1407 }
1408 break;
1409
1410 case '-':
1411 if (post_op_name[1] == '\0')
1412 op_kind = OO_Minus;
1413 else if (post_op_name[2] == '\0')
1414 {
1415 switch (post_op_name[1])
1416 {
1417 case '=': op_kind = OO_MinusEqual; break;
1418 case '-': op_kind = OO_MinusMinus; break;
1419 case '>': op_kind = OO_Arrow; break;
1420 }
1421 }
1422 else if (post_op_name[3] == '\0')
1423 {
1424 if (post_op_name[2] == '*')
1425 op_kind = OO_ArrowStar; break;
1426 }
1427 break;
1428
1429 case '*':
1430 if (post_op_name[1] == '\0')
1431 op_kind = OO_Star;
1432 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1433 op_kind = OO_StarEqual;
1434 break;
1435
1436 case '/':
1437 if (post_op_name[1] == '\0')
1438 op_kind = OO_Slash;
1439 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1440 op_kind = OO_SlashEqual;
1441 break;
1442
1443 case '%':
1444 if (post_op_name[1] == '\0')
1445 op_kind = OO_Percent;
1446 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1447 op_kind = OO_PercentEqual;
1448 break;
1449
1450
1451 case '^':
1452 if (post_op_name[1] == '\0')
1453 op_kind = OO_Caret;
1454 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1455 op_kind = OO_CaretEqual;
1456 break;
1457
1458 case '&':
1459 if (post_op_name[1] == '\0')
1460 op_kind = OO_Amp;
1461 else if (post_op_name[2] == '\0')
1462 {
1463 switch (post_op_name[1])
1464 {
1465 case '=': op_kind = OO_AmpEqual; break;
1466 case '&': op_kind = OO_AmpAmp; break;
1467 }
1468 }
1469 break;
1470
1471 case '|':
1472 if (post_op_name[1] == '\0')
1473 op_kind = OO_Pipe;
1474 else if (post_op_name[2] == '\0')
1475 {
1476 switch (post_op_name[1])
1477 {
1478 case '=': op_kind = OO_PipeEqual; break;
1479 case '|': op_kind = OO_PipePipe; break;
1480 }
1481 }
1482 break;
1483
1484 case '~':
1485 if (post_op_name[1] == '\0')
1486 op_kind = OO_Tilde;
1487 break;
1488
1489 case '!':
1490 if (post_op_name[1] == '\0')
1491 op_kind = OO_Exclaim;
1492 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1493 op_kind = OO_ExclaimEqual;
1494 break;
1495
1496 case '=':
1497 if (post_op_name[1] == '\0')
1498 op_kind = OO_Equal;
1499 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1500 op_kind = OO_EqualEqual;
1501 break;
1502
1503 case '<':
1504 if (post_op_name[1] == '\0')
1505 op_kind = OO_Less;
1506 else if (post_op_name[2] == '\0')
1507 {
1508 switch (post_op_name[1])
1509 {
1510 case '<': op_kind = OO_LessLess; break;
1511 case '=': op_kind = OO_LessEqual; break;
1512 }
1513 }
1514 else if (post_op_name[3] == '\0')
1515 {
1516 if (post_op_name[2] == '=')
1517 op_kind = OO_LessLessEqual;
1518 }
1519 break;
1520
1521 case '>':
1522 if (post_op_name[1] == '\0')
1523 op_kind = OO_Greater;
1524 else if (post_op_name[2] == '\0')
1525 {
1526 switch (post_op_name[1])
1527 {
1528 case '>': op_kind = OO_GreaterGreater; break;
1529 case '=': op_kind = OO_GreaterEqual; break;
1530 }
1531 }
1532 else if (post_op_name[1] == '>' &&
1533 post_op_name[2] == '=' &&
1534 post_op_name[3] == '\0')
1535 {
1536 op_kind = OO_GreaterGreaterEqual;
1537 }
1538 break;
1539
1540 case ',':
1541 if (post_op_name[1] == '\0')
1542 op_kind = OO_Comma;
1543 break;
1544
1545 case '(':
1546 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1547 op_kind = OO_Call;
1548 break;
1549
1550 case '[':
1551 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1552 op_kind = OO_Subscript;
1553 break;
1554 }
1555
1556 return true;
1557}
Greg Clayton6beaaa62011-01-17 03:46:26 +00001558
Greg Clayton090d0982011-06-19 03:43:27 +00001559static inline bool
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001560check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001561{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001562 // Special-case call since it can take any number of operands
1563 if(op_kind == OO_Call)
1564 return true;
1565
Greg Clayton090d0982011-06-19 03:43:27 +00001566 // The parameter count doens't include "this"
1567 if (num_params == 0)
1568 return unary;
1569 if (num_params == 1)
1570 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001571 else
Greg Clayton090d0982011-06-19 03:43:27 +00001572 return false;
1573}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001574
Greg Clayton090d0982011-06-19 03:43:27 +00001575bool
1576ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1577{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001578#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (op_kind, Unary, Binary, num_params);
Greg Clayton090d0982011-06-19 03:43:27 +00001579 switch (op_kind)
1580 {
1581#include "clang/Basic/OperatorKinds.def"
1582 default: break;
1583 }
1584 return false;
1585}
1586
Greg Claytona51ed9b2010-09-23 01:09:21 +00001587CXXMethodDecl *
Sean Callanan61da09b2010-09-17 02:58:26 +00001588ClangASTContext::AddMethodToCXXRecordType
1589(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001590 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001591 clang_type_t record_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001592 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001593 clang_type_t method_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001594 lldb::AccessType access,
Greg Clayton0fffff52010-09-24 05:15:53 +00001595 bool is_virtual,
1596 bool is_static,
Greg Claytonf51de672010-10-01 02:31:07 +00001597 bool is_inline,
Sean Callananc1b732d2011-11-01 18:07:13 +00001598 bool is_explicit,
Sean Callanandbb58392011-11-02 01:38:59 +00001599 bool is_attr_used,
1600 bool is_artificial
Greg Claytona51ed9b2010-09-23 01:09:21 +00001601)
Sean Callanan61da09b2010-09-17 02:58:26 +00001602{
Sean Callananfc55f5d2010-09-21 00:44:12 +00001603 if (!record_opaque_type || !method_opaque_type || !name)
Johnny Chend440bcc2010-09-28 16:10:54 +00001604 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001605
Greg Clayton6beaaa62011-01-17 03:46:26 +00001606 assert(ast);
Sean Callanan61da09b2010-09-17 02:58:26 +00001607
Greg Clayton6beaaa62011-01-17 03:46:26 +00001608 IdentifierTable *identifier_table = &ast->Idents;
Sean Callanan61da09b2010-09-17 02:58:26 +00001609
1610 assert(identifier_table);
1611
Sean Callananfc55f5d2010-09-21 00:44:12 +00001612 QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00001613
Greg Clayton6beaaa62011-01-17 03:46:26 +00001614 CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
Sean Callanan61da09b2010-09-17 02:58:26 +00001615
Greg Clayton0fffff52010-09-24 05:15:53 +00001616 if (cxx_record_decl == NULL)
Greg Claytona51ed9b2010-09-23 01:09:21 +00001617 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001618
Greg Clayton0fffff52010-09-24 05:15:53 +00001619 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001620
Greg Claytonf51de672010-10-01 02:31:07 +00001621 CXXMethodDecl *cxx_method_decl = NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001622
Greg Claytonf51de672010-10-01 02:31:07 +00001623 DeclarationName decl_name (&identifier_table->get(name));
Greg Clayton878eaf12010-10-01 03:45:20 +00001624
Sean Callanan78e37602011-01-27 04:42:51 +00001625 const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
Greg Clayton878eaf12010-10-01 03:45:20 +00001626
Greg Clayton90a2acd2010-10-02 01:40:05 +00001627 if (function_Type == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001628 return NULL;
1629
Sean Callanan78e37602011-01-27 04:42:51 +00001630 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
Greg Clayton878eaf12010-10-01 03:45:20 +00001631
1632 if (!method_function_prototype)
1633 return NULL;
1634
1635 unsigned int num_params = method_function_prototype->getNumArgs();
1636
Sean Callanandbb58392011-11-02 01:38:59 +00001637 CXXDestructorDecl *cxx_dtor_decl(NULL);
1638 CXXConstructorDecl *cxx_ctor_decl(NULL);
1639
Greg Clayton878eaf12010-10-01 03:45:20 +00001640 if (name[0] == '~')
Greg Claytonf51de672010-10-01 02:31:07 +00001641 {
Sean Callanandbb58392011-11-02 01:38:59 +00001642 cxx_dtor_decl = CXXDestructorDecl::Create (*ast,
1643 cxx_record_decl,
1644 SourceLocation(),
1645 DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1646 method_qual_type,
1647 NULL,
1648 is_inline,
1649 is_artificial);
1650 cxx_method_decl = cxx_dtor_decl;
Greg Clayton878eaf12010-10-01 03:45:20 +00001651 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001652 else if (decl_name == cxx_record_decl->getDeclName())
Greg Clayton878eaf12010-10-01 03:45:20 +00001653 {
Sean Callanandbb58392011-11-02 01:38:59 +00001654 cxx_ctor_decl = CXXConstructorDecl::Create (*ast,
1655 cxx_record_decl,
1656 SourceLocation(),
1657 DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1658 method_qual_type,
1659 NULL, // TypeSourceInfo *
1660 is_explicit,
1661 is_inline,
1662 is_artificial,
1663 false /*is_constexpr*/);
1664 cxx_method_decl = cxx_ctor_decl;
Greg Claytonf51de672010-10-01 02:31:07 +00001665 }
1666 else
Greg Clayton878eaf12010-10-01 03:45:20 +00001667 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001668
1669 OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1670 if (IsOperator (name, op_kind))
Greg Clayton878eaf12010-10-01 03:45:20 +00001671 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001672 if (op_kind != NUM_OVERLOADED_OPERATORS)
1673 {
Greg Clayton090d0982011-06-19 03:43:27 +00001674 // Check the number of operator parameters. Sometimes we have
1675 // seen bad DWARF that doesn't correctly describe operators and
1676 // if we try to create a methed and add it to the class, clang
1677 // will assert and crash, so we need to make sure things are
1678 // acceptable.
1679 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
1680 return NULL;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001681 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001682 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001683 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001684 DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001685 method_qual_type,
1686 NULL, // TypeSourceInfo *
Greg Claytona3c444a2010-10-01 23:13:49 +00001687 is_static,
1688 SC_None,
Sean Callananfb0b7582011-03-15 00:17:19 +00001689 is_inline,
Sean Callanan880e6802011-10-07 23:18:13 +00001690 false /*is_constexpr*/,
Sean Callananfb0b7582011-03-15 00:17:19 +00001691 SourceLocation());
Greg Claytona3c444a2010-10-01 23:13:49 +00001692 }
1693 else if (num_params == 0)
1694 {
1695 // Conversion operators don't take params...
Greg Clayton6beaaa62011-01-17 03:46:26 +00001696 cxx_method_decl = CXXConversionDecl::Create (*ast,
Greg Claytona3c444a2010-10-01 23:13:49 +00001697 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001698 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001699 DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
Greg Claytona3c444a2010-10-01 23:13:49 +00001700 method_qual_type,
1701 NULL, // TypeSourceInfo *
1702 is_inline,
Sean Callananfb0b7582011-03-15 00:17:19 +00001703 is_explicit,
Sean Callanan880e6802011-10-07 23:18:13 +00001704 false /*is_constexpr*/,
Sean Callananfb0b7582011-03-15 00:17:19 +00001705 SourceLocation());
Greg Claytona3c444a2010-10-01 23:13:49 +00001706 }
Greg Clayton878eaf12010-10-01 03:45:20 +00001707 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001708
1709 if (cxx_method_decl == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001710 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001711 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001712 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001713 SourceLocation(),
Greg Claytona3c444a2010-10-01 23:13:49 +00001714 DeclarationNameInfo (decl_name, SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001715 method_qual_type,
1716 NULL, // TypeSourceInfo *
1717 is_static,
1718 SC_None,
Sean Callananfb0b7582011-03-15 00:17:19 +00001719 is_inline,
Sean Callanan880e6802011-10-07 23:18:13 +00001720 false /*is_constexpr*/,
Sean Callananfb0b7582011-03-15 00:17:19 +00001721 SourceLocation());
Greg Clayton878eaf12010-10-01 03:45:20 +00001722 }
Greg Claytonf51de672010-10-01 02:31:07 +00001723 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001724
Greg Clayton1be10fc2010-09-29 01:12:09 +00001725 AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
Greg Clayton0fffff52010-09-24 05:15:53 +00001726
1727 cxx_method_decl->setAccess (access_specifier);
1728 cxx_method_decl->setVirtualAsWritten (is_virtual);
Sean Callanane2ef6e32010-09-23 03:01:22 +00001729
Sean Callananc1b732d2011-11-01 18:07:13 +00001730 if (is_attr_used)
1731 cxx_method_decl->addAttr(::new (*ast) UsedAttr(SourceRange(), *ast));
1732
Sean Callananfc55f5d2010-09-21 00:44:12 +00001733 // Populate the method decl with parameter decls
Sean Callananfc55f5d2010-09-21 00:44:12 +00001734
Charles Davis8c444c42011-05-19 23:33:46 +00001735 llvm::SmallVector<ParmVarDecl *, 12> params;
Sean Callananfc55f5d2010-09-21 00:44:12 +00001736
1737 for (int param_index = 0;
1738 param_index < num_params;
1739 ++param_index)
1740 {
Charles Davis8c444c42011-05-19 23:33:46 +00001741 params.push_back (ParmVarDecl::Create (*ast,
1742 cxx_method_decl,
1743 SourceLocation(),
1744 SourceLocation(),
1745 NULL, // anonymous
1746 method_function_prototype->getArgType(param_index),
1747 NULL,
1748 SC_None,
1749 SC_None,
1750 NULL));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001751 }
1752
Sean Callanan880e6802011-10-07 23:18:13 +00001753 cxx_method_decl->setParams (ArrayRef<ParmVarDecl*>(params));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001754
Greg Clayton0fffff52010-09-24 05:15:53 +00001755 cxx_record_decl->addDecl (cxx_method_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001756
Greg Clayton8b867b42011-11-02 02:06:20 +00001757 // Sometimes the debug info will mention a constructor (default/copy/move),
1758 // destructor, or assignment operator (copy/move) but there won't be any
1759 // version of this in the code. So we check if the function was artificially
1760 // generated and if it is trivial and this lets the compiler/backend know
1761 // that it can inline the IR for these when it needs to and we can avoid a
1762 // "missing function" error when running expressions.
1763
Sean Callanandbb58392011-11-02 01:38:59 +00001764 if (is_artificial)
1765 {
Greg Clayton8b867b42011-11-02 02:06:20 +00001766 if (cxx_ctor_decl &&
1767 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
1768 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
1769 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
Sean Callanandbb58392011-11-02 01:38:59 +00001770 {
1771 cxx_ctor_decl->setDefaulted();
1772 cxx_ctor_decl->setTrivial(true);
1773 }
Greg Clayton8b867b42011-11-02 02:06:20 +00001774 else if (cxx_dtor_decl)
Sean Callanandbb58392011-11-02 01:38:59 +00001775 {
Greg Clayton8b867b42011-11-02 02:06:20 +00001776 if (cxx_record_decl->hasTrivialDestructor())
1777 {
1778 cxx_dtor_decl->setDefaulted();
1779 cxx_dtor_decl->setTrivial(true);
1780 }
1781 }
1782 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
1783 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
1784 {
1785 cxx_method_decl->setDefaulted();
1786 cxx_method_decl->setTrivial(true);
Sean Callanandbb58392011-11-02 01:38:59 +00001787 }
1788 }
1789
Sean Callanan5e9e1992011-10-26 01:06:27 +00001790#ifdef LLDB_CONFIGURATION_DEBUG
1791 VerifyDecl(cxx_method_decl);
1792#endif
Greg Claytonc432c192011-01-20 04:18:48 +00001793
1794// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
1795// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
1796// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
1797// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
1798// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
1799// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
1800// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
1801// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
1802// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
Greg Claytona51ed9b2010-09-23 01:09:21 +00001803 return cxx_method_decl;
Sean Callanan61da09b2010-09-17 02:58:26 +00001804}
1805
Jim Inghame3ae82a2011-11-12 01:36:43 +00001806clang::FieldDecl *
Greg Clayton8cf05932010-07-22 18:30:50 +00001807ClangASTContext::AddFieldToRecordType
1808(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001809 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001810 clang_type_t record_clang_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001811 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001812 clang_type_t field_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001813 AccessType access,
1814 uint32_t bitfield_bit_size
1815)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001816{
1817 if (record_clang_type == NULL || field_type == NULL)
Jim Inghame3ae82a2011-11-12 01:36:43 +00001818 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001819
Jim Inghame3ae82a2011-11-12 01:36:43 +00001820 FieldDecl *field = NULL;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001821 IdentifierTable *identifier_table = &ast->Idents;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001822
Greg Clayton6beaaa62011-01-17 03:46:26 +00001823 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001824 assert (identifier_table != NULL);
1825
1826 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
1827
Sean Callanan78e37602011-01-27 04:42:51 +00001828 const clang::Type *clang_type = record_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001829 if (clang_type)
1830 {
1831 const RecordType *record_type = dyn_cast<RecordType>(clang_type);
1832
1833 if (record_type)
1834 {
1835 RecordDecl *record_decl = record_type->getDecl();
1836
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001837 clang::Expr *bit_width = NULL;
1838 if (bitfield_bit_size != 0)
1839 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001840 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1841 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001842 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00001843 field = FieldDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001844 record_decl,
1845 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00001846 SourceLocation(),
Greg Clayton8cf05932010-07-22 18:30:50 +00001847 name ? &identifier_table->get(name) : NULL, // Identifier
1848 QualType::getFromOpaquePtr(field_type), // Field type
Sean Callanancc427fa2011-07-30 02:42:06 +00001849 NULL, // TInfo *
Greg Clayton8cf05932010-07-22 18:30:50 +00001850 bit_width, // BitWidth
Sean Callanancc427fa2011-07-30 02:42:06 +00001851 false, // Mutable
1852 false); // HasInit
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001853
Greg Clayton8cf05932010-07-22 18:30:50 +00001854 field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001855
1856 if (field)
1857 {
1858 record_decl->addDecl(field);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001859
1860#ifdef LLDB_CONFIGURATION_DEBUG
1861 VerifyDecl(field);
1862#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001863 }
1864 }
Greg Clayton9e409562010-07-28 02:04:09 +00001865 else
1866 {
Sean Callanan78e37602011-01-27 04:42:51 +00001867 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
Greg Clayton9e409562010-07-28 02:04:09 +00001868 if (objc_class_type)
1869 {
Greg Clayton0fffff52010-09-24 05:15:53 +00001870 bool is_synthesized = false;
Jim Inghame3ae82a2011-11-12 01:36:43 +00001871 field = ClangASTContext::AddObjCClassIVar (ast,
Sean Callanan6e6a7c72010-09-16 20:01:08 +00001872 record_clang_type,
Greg Clayton9e409562010-07-28 02:04:09 +00001873 name,
1874 field_type,
1875 access,
1876 bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00001877 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00001878 }
1879 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001880 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00001881 return field;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001882}
1883
1884bool
1885ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1886{
1887 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1888}
1889
1890bool
1891ClangASTContext::FieldIsBitfield
1892(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001893 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001894 FieldDecl* field,
1895 uint32_t& bitfield_bit_size
1896)
1897{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001898 if (ast == NULL || field == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001899 return false;
1900
1901 if (field->isBitField())
1902 {
1903 Expr* bit_width_expr = field->getBitWidth();
1904 if (bit_width_expr)
1905 {
1906 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001907 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001908 {
1909 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1910 return true;
1911 }
1912 }
1913 }
1914 return false;
1915}
1916
1917bool
1918ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1919{
1920 if (record_decl == NULL)
1921 return false;
1922
1923 if (!record_decl->field_empty())
1924 return true;
1925
1926 // No fields, lets check this is a CXX record and check the base classes
1927 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1928 if (cxx_record_decl)
1929 {
1930 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1931 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1932 base_class != base_class_end;
1933 ++base_class)
1934 {
1935 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1936 if (RecordHasFields(base_class_decl))
1937 return true;
1938 }
1939 }
1940 return false;
1941}
1942
1943void
Greg Clayton6beaaa62011-01-17 03:46:26 +00001944ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001945{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001946 if (clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001947 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001948 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1949
Sean Callanan78e37602011-01-27 04:42:51 +00001950 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00001951 if (record_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001952 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001953 RecordDecl *record_decl = record_type->getDecl();
1954 if (record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001955 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001956 uint32_t field_idx;
1957 RecordDecl::field_iterator field, field_end;
1958 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
1959 field != field_end;
1960 ++field, ++field_idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001961 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001962 // If no accessibility was assigned, assign the correct one
1963 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
1964 field->setAccess ((AccessSpecifier)default_accessibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001965 }
1966 }
1967 }
1968 }
1969}
1970
1971#pragma mark C++ Base Classes
1972
1973CXXBaseSpecifier *
Greg Clayton1be10fc2010-09-29 01:12:09 +00001974ClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001975{
1976 if (base_class_type)
Greg Claytone6371122010-07-30 20:30:44 +00001977 return new CXXBaseSpecifier (SourceRange(),
1978 is_virtual,
1979 base_of_class,
1980 ConvertAccessTypeToAccessSpecifier (access),
Sean Callanan2c777c42011-01-18 23:32:05 +00001981 getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
1982 SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001983 return NULL;
1984}
1985
Greg Clayton0b42ac32010-07-02 01:29:13 +00001986void
1987ClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1988{
1989 for (unsigned i=0; i<num_base_classes; ++i)
1990 {
1991 delete base_classes[i];
1992 base_classes[i] = NULL;
1993 }
1994}
1995
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001996bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00001997ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001998{
1999 if (class_clang_type)
2000 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002001 CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
2002 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002003 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002004 cxx_record_decl->setBases(base_classes, num_base_classes);
2005 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002006 }
2007 }
2008 return false;
2009}
Greg Clayton8cf05932010-07-22 18:30:50 +00002010#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002011
Greg Clayton1be10fc2010-09-29 01:12:09 +00002012clang_type_t
Greg Clayton8cf05932010-07-22 18:30:50 +00002013ClangASTContext::CreateObjCClass
2014(
2015 const char *name,
2016 DeclContext *decl_ctx,
2017 bool isForwardDecl,
2018 bool isInternal
2019)
2020{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002021 ASTContext *ast = getASTContext();
2022 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00002023 assert (name && name[0]);
2024 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00002025 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00002026
2027 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
2028 // we will need to update this code. I was told to currently always use
2029 // the CXXRecordDecl class since we often don't know from debug information
2030 // if something is struct or a class, so we default to always use the more
2031 // complete definition just in case.
Greg Clayton6beaaa62011-01-17 03:46:26 +00002032 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00002033 decl_ctx,
2034 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00002035 &ast->Idents.get(name),
Greg Clayton8cf05932010-07-22 18:30:50 +00002036 SourceLocation(),
2037 isForwardDecl,
2038 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00002039
Greg Clayton6beaaa62011-01-17 03:46:26 +00002040 return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00002041}
2042
2043bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002044ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
Greg Clayton8cf05932010-07-22 18:30:50 +00002045{
2046 if (class_opaque_type && super_opaque_type)
2047 {
2048 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2049 QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
Sean Callanan78e37602011-01-27 04:42:51 +00002050 const clang::Type *class_type = class_qual_type.getTypePtr();
2051 const clang::Type *super_type = super_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00002052 if (class_type && super_type)
2053 {
Sean Callanan78e37602011-01-27 04:42:51 +00002054 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2055 const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00002056 if (objc_class_type && objc_super_type)
2057 {
2058 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2059 ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
2060 if (class_interface_decl && super_interface_decl)
2061 {
2062 class_interface_decl->setSuperClass(super_interface_decl);
2063 return true;
2064 }
2065 }
2066 }
2067 }
2068 return false;
2069}
2070
2071
Jim Inghame3ae82a2011-11-12 01:36:43 +00002072FieldDecl *
Greg Clayton8cf05932010-07-22 18:30:50 +00002073ClangASTContext::AddObjCClassIVar
2074(
Greg Clayton6beaaa62011-01-17 03:46:26 +00002075 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002076 clang_type_t class_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00002077 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002078 clang_type_t ivar_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00002079 AccessType access,
2080 uint32_t bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00002081 bool is_synthesized
Greg Clayton8cf05932010-07-22 18:30:50 +00002082)
2083{
2084 if (class_opaque_type == NULL || ivar_opaque_type == NULL)
Jim Inghame3ae82a2011-11-12 01:36:43 +00002085 return NULL;
Greg Clayton8cf05932010-07-22 18:30:50 +00002086
Jim Inghame3ae82a2011-11-12 01:36:43 +00002087 ObjCIvarDecl *field = NULL;
2088
Greg Clayton6beaaa62011-01-17 03:46:26 +00002089 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton8cf05932010-07-22 18:30:50 +00002090
Greg Clayton6beaaa62011-01-17 03:46:26 +00002091 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00002092 assert (identifier_table != NULL);
2093
2094 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2095
Sean Callanan78e37602011-01-27 04:42:51 +00002096 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00002097 if (class_type)
2098 {
Sean Callanan78e37602011-01-27 04:42:51 +00002099 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00002100
2101 if (objc_class_type)
2102 {
2103 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2104
2105 if (class_interface_decl)
2106 {
2107 clang::Expr *bit_width = NULL;
2108 if (bitfield_bit_size != 0)
2109 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002110 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
2111 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Greg Clayton8cf05932010-07-22 18:30:50 +00002112 }
2113
Jim Inghame3ae82a2011-11-12 01:36:43 +00002114 field = ObjCIvarDecl::Create (*ast,
2115 class_interface_decl,
2116 SourceLocation(),
2117 SourceLocation(),
2118 &identifier_table->get(name), // Identifier
2119 QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
2120 NULL, // TypeSourceInfo *
2121 ConvertAccessTypeToObjCIvarAccessControl (access),
2122 bit_width,
2123 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00002124
2125 if (field)
2126 {
2127 class_interface_decl->addDecl(field);
Sean Callanan5e9e1992011-10-26 01:06:27 +00002128
2129#ifdef LLDB_CONFIGURATION_DEBUG
2130 VerifyDecl(field);
2131#endif
2132
Jim Inghame3ae82a2011-11-12 01:36:43 +00002133 return field;
Greg Clayton9e409562010-07-28 02:04:09 +00002134 }
Greg Clayton8cf05932010-07-22 18:30:50 +00002135 }
2136 }
2137 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002138 return NULL;
2139}
2140
2141bool
2142ClangASTContext::AddObjCClassProperty
2143(
2144 ASTContext *ast,
2145 clang_type_t class_opaque_type,
2146 const char *property_name,
2147 clang_type_t property_opaque_type,
2148 ObjCIvarDecl *ivar_decl,
2149 const char *property_setter_name,
2150 const char *property_getter_name,
2151 uint32_t property_attributes
2152)
2153{
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002154 if (class_opaque_type == NULL || property_name == NULL || property_name[0] == '\0')
Jim Inghame3ae82a2011-11-12 01:36:43 +00002155 return false;
2156
2157 IdentifierTable *identifier_table = &ast->Idents;
2158
2159 assert (ast != NULL);
2160 assert (identifier_table != NULL);
2161
2162 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2163 const clang::Type *class_type = class_qual_type.getTypePtr();
2164 if (class_type)
2165 {
2166 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2167
2168 if (objc_class_type)
2169 {
2170 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2171
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002172 clang_type_t property_opaque_type_to_access;
2173
2174 if (property_opaque_type)
2175 property_opaque_type_to_access = property_opaque_type;
2176 else if (ivar_decl)
2177 property_opaque_type_to_access = ivar_decl->getType().getAsOpaquePtr();
2178
Jim Inghame3ae82a2011-11-12 01:36:43 +00002179 // FIXME: For now, we don't know how to add properties if we don't have their associated ivar.
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002180 if (class_interface_decl && property_opaque_type_to_access)
Jim Inghame3ae82a2011-11-12 01:36:43 +00002181 {
2182 clang::TypeSourceInfo *prop_type_source;
2183 if (ivar_decl)
2184 prop_type_source = ast->CreateTypeSourceInfo (ivar_decl->getType());
2185 else
2186 prop_type_source = ast->CreateTypeSourceInfo (QualType::getFromOpaquePtr(property_opaque_type));
2187
2188 ObjCPropertyDecl *property_decl = ObjCPropertyDecl::Create(*ast,
2189 class_interface_decl,
2190 SourceLocation(), // Source Location
2191 &identifier_table->get(property_name),
2192 SourceLocation(), //Source Location for AT
2193 prop_type_source
2194 );
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002195 if (property_decl)
2196 {
Jim Inghame3ae82a2011-11-12 01:36:43 +00002197 class_interface_decl->addDecl (property_decl);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002198
2199 Selector setter_sel, getter_sel;
2200
Jim Inghame3ae82a2011-11-12 01:36:43 +00002201 if (property_setter_name != NULL)
2202 {
2203 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
2204 clang::IdentifierInfo *setter_ident = &identifier_table->get(property_setter_no_colon.c_str());
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002205 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
Jim Inghame3ae82a2011-11-12 01:36:43 +00002206 property_decl->setSetterName(setter_sel);
2207 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
2208 }
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002209 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
2210 {
2211 std::string setter_sel_string("set");
2212 setter_sel_string.push_back(::toupper(property_name[0]));
2213 setter_sel_string.append(&property_name[1]);
2214 clang::IdentifierInfo *setter_ident = &identifier_table->get(setter_sel_string.c_str());
2215 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
2216 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002217
2218 if (property_getter_name != NULL)
2219 {
2220 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_getter_name);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002221 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Jim Inghame3ae82a2011-11-12 01:36:43 +00002222 property_decl->setGetterName(getter_sel);
2223 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002224 }
2225 else
2226 {
2227 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_name);
2228 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Jim Inghame3ae82a2011-11-12 01:36:43 +00002229 }
2230
2231 if (ivar_decl)
2232 property_decl->setPropertyIvarDecl (ivar_decl);
2233
2234 if (property_attributes & DW_APPLE_PROPERTY_readonly)
2235 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
2236 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
2237 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
2238 if (property_attributes & DW_APPLE_PROPERTY_assign)
2239 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
2240 if (property_attributes & DW_APPLE_PROPERTY_retain)
2241 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
2242 if (property_attributes & DW_APPLE_PROPERTY_copy)
2243 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
2244 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
2245 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002246
2247 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
2248 {
2249 QualType result_type = QualType::getFromOpaquePtr(property_opaque_type_to_access);
2250
2251 const bool isInstance = true;
2252 const bool isVariadic = false;
2253 const bool isSynthesized = false;
2254 const bool isImplicitlyDeclared = true;
2255 const bool isDefined = false;
2256 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2257 const bool HasRelatedResultType = false;
2258
2259 ObjCMethodDecl *getter = ObjCMethodDecl::Create(*ast,
2260 SourceLocation(),
2261 SourceLocation(),
2262 getter_sel,
2263 result_type,
2264 NULL,
2265 class_interface_decl,
2266 isInstance,
2267 isVariadic,
2268 isSynthesized,
2269 isImplicitlyDeclared,
2270 isDefined,
2271 impControl,
2272 HasRelatedResultType);
2273
2274 getter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(), ArrayRef<SourceLocation>());
2275
2276 class_interface_decl->addDecl(getter);
2277 }
2278
2279 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
2280 {
2281 QualType result_type = ast->VoidTy;
2282
2283 const bool isInstance = true;
2284 const bool isVariadic = false;
2285 const bool isSynthesized = false;
2286 const bool isImplicitlyDeclared = true;
2287 const bool isDefined = false;
2288 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2289 const bool HasRelatedResultType = false;
2290
2291 ObjCMethodDecl *setter = ObjCMethodDecl::Create(*ast,
2292 SourceLocation(),
2293 SourceLocation(),
2294 setter_sel,
2295 result_type,
2296 NULL,
2297 class_interface_decl,
2298 isInstance,
2299 isVariadic,
2300 isSynthesized,
2301 isImplicitlyDeclared,
2302 isDefined,
2303 impControl,
2304 HasRelatedResultType);
2305
2306 llvm::SmallVector<ParmVarDecl *, 1> params;
2307
2308 params.push_back (ParmVarDecl::Create (*ast,
2309 setter,
2310 SourceLocation(),
2311 SourceLocation(),
2312 NULL, // anonymous
2313 QualType::getFromOpaquePtr(property_opaque_type_to_access),
2314 NULL,
2315 SC_Auto,
2316 SC_Auto,
2317 NULL));
2318
2319 setter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
2320
2321 class_interface_decl->addDecl(setter);
2322 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002323
2324 return true;
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002325 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002326 }
2327 }
2328 }
Greg Clayton8cf05932010-07-22 18:30:50 +00002329 return false;
2330}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002331
Greg Clayton9e409562010-07-28 02:04:09 +00002332bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002333ClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
Greg Clayton9e409562010-07-28 02:04:09 +00002334{
2335 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2336
Sean Callanan78e37602011-01-27 04:42:51 +00002337 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton9e409562010-07-28 02:04:09 +00002338 if (class_type)
2339 {
Sean Callanan78e37602011-01-27 04:42:51 +00002340 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton9e409562010-07-28 02:04:09 +00002341
2342 if (objc_class_type)
2343 return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
2344 }
2345 return false;
2346}
2347
2348bool
2349ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
2350{
2351 while (class_interface_decl)
2352 {
2353 if (class_interface_decl->ivar_size() > 0)
2354 return true;
2355
2356 if (check_superclass)
2357 class_interface_decl = class_interface_decl->getSuperClass();
2358 else
2359 break;
2360 }
2361 return false;
2362}
Greg Clayton0fffff52010-09-24 05:15:53 +00002363
Greg Clayton1be10fc2010-09-29 01:12:09 +00002364ObjCMethodDecl *
Greg Clayton0fffff52010-09-24 05:15:53 +00002365ClangASTContext::AddMethodToObjCObjectType
2366(
Greg Clayton6beaaa62011-01-17 03:46:26 +00002367 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002368 clang_type_t class_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00002369 const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
Greg Clayton1be10fc2010-09-29 01:12:09 +00002370 clang_type_t method_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00002371 lldb::AccessType access
2372)
2373{
2374 if (class_opaque_type == NULL || method_opaque_type == NULL)
2375 return NULL;
2376
Greg Clayton6beaaa62011-01-17 03:46:26 +00002377 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton0fffff52010-09-24 05:15:53 +00002378
Greg Clayton6beaaa62011-01-17 03:46:26 +00002379 assert (ast != NULL);
Greg Clayton0fffff52010-09-24 05:15:53 +00002380 assert (identifier_table != NULL);
2381
2382 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2383
Sean Callanan78e37602011-01-27 04:42:51 +00002384 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton0fffff52010-09-24 05:15:53 +00002385 if (class_type == NULL)
2386 return NULL;
2387
Sean Callanan78e37602011-01-27 04:42:51 +00002388 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton0fffff52010-09-24 05:15:53 +00002389
2390 if (objc_class_type == NULL)
2391 return NULL;
2392
2393 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2394
2395 if (class_interface_decl == NULL)
2396 return NULL;
Greg Clayton9e409562010-07-28 02:04:09 +00002397
Greg Clayton0fffff52010-09-24 05:15:53 +00002398 const char *selector_start = ::strchr (name, ' ');
2399 if (selector_start == NULL)
2400 return NULL;
2401
2402 selector_start++;
2403 if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
2404 return NULL;
2405 llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
2406
Greg Clayton450e3f32010-10-12 02:24:53 +00002407 size_t len = 0;
Greg Clayton0fffff52010-09-24 05:15:53 +00002408 const char *start;
Greg Clayton450e3f32010-10-12 02:24:53 +00002409 //printf ("name = '%s'\n", name);
2410
2411 unsigned num_selectors_with_args = 0;
2412 for (start = selector_start;
Greg Clayton0fffff52010-09-24 05:15:53 +00002413 start && *start != '\0' && *start != ']';
Greg Clayton450e3f32010-10-12 02:24:53 +00002414 start += len)
Greg Clayton0fffff52010-09-24 05:15:53 +00002415 {
Greg Clayton450e3f32010-10-12 02:24:53 +00002416 len = ::strcspn(start, ":]");
Greg Clayton90f90cd2010-10-27 04:01:14 +00002417 bool has_arg = (start[len] == ':');
2418 if (has_arg)
Greg Clayton450e3f32010-10-12 02:24:53 +00002419 ++num_selectors_with_args;
Greg Clayton0fffff52010-09-24 05:15:53 +00002420 selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
Greg Clayton90f90cd2010-10-27 04:01:14 +00002421 if (has_arg)
2422 len += 1;
Greg Clayton0fffff52010-09-24 05:15:53 +00002423 }
2424
2425
2426 if (selector_idents.size() == 0)
2427 return 0;
2428
Greg Clayton6beaaa62011-01-17 03:46:26 +00002429 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
Greg Clayton0fffff52010-09-24 05:15:53 +00002430 selector_idents.data());
2431
2432 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
2433
2434 // Populate the method decl with parameter decls
Sean Callanan78e37602011-01-27 04:42:51 +00002435 const clang::Type *method_type(method_qual_type.getTypePtr());
Greg Clayton0fffff52010-09-24 05:15:53 +00002436
2437 if (method_type == NULL)
2438 return NULL;
2439
Sean Callanan78e37602011-01-27 04:42:51 +00002440 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00002441
2442 if (!method_function_prototype)
2443 return NULL;
2444
2445
2446 bool is_variadic = false;
2447 bool is_synthesized = false;
2448 bool is_defined = false;
2449 ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
2450
2451 const unsigned num_args = method_function_prototype->getNumArgs();
2452
Greg Clayton6beaaa62011-01-17 03:46:26 +00002453 ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00002454 SourceLocation(), // beginLoc,
2455 SourceLocation(), // endLoc,
2456 method_selector,
2457 method_function_prototype->getResultType(),
2458 NULL, // TypeSourceInfo *ResultTInfo,
2459 GetDeclContextForType (class_opaque_type),
2460 name[0] == '-',
2461 is_variadic,
2462 is_synthesized,
Sean Callanan880e6802011-10-07 23:18:13 +00002463 true, // is_implicitly_declared
Greg Clayton0fffff52010-09-24 05:15:53 +00002464 is_defined,
2465 imp_control,
Sean Callanan880e6802011-10-07 23:18:13 +00002466 false /*has_related_result_type*/);
Greg Clayton0fffff52010-09-24 05:15:53 +00002467
2468
2469 if (objc_method_decl == NULL)
2470 return NULL;
2471
2472 if (num_args > 0)
2473 {
2474 llvm::SmallVector<ParmVarDecl *, 12> params;
2475
2476 for (int param_index = 0; param_index < num_args; ++param_index)
2477 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002478 params.push_back (ParmVarDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00002479 objc_method_decl,
2480 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00002481 SourceLocation(),
Greg Clayton0fffff52010-09-24 05:15:53 +00002482 NULL, // anonymous
2483 method_function_prototype->getArgType(param_index),
2484 NULL,
2485 SC_Auto,
2486 SC_Auto,
2487 NULL));
2488 }
2489
Sean Callanan880e6802011-10-07 23:18:13 +00002490 objc_method_decl->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
Greg Clayton0fffff52010-09-24 05:15:53 +00002491 }
2492
2493 class_interface_decl->addDecl (objc_method_decl);
2494
Sean Callanan5e9e1992011-10-26 01:06:27 +00002495#ifdef LLDB_CONFIGURATION_DEBUG
2496 VerifyDecl(objc_method_decl);
2497#endif
Greg Clayton0fffff52010-09-24 05:15:53 +00002498
2499 return objc_method_decl;
2500}
2501
Greg Clayton402230e2012-02-03 01:30:30 +00002502size_t
2503ClangASTContext::GetNumTemplateArguments (clang::ASTContext *ast, clang_type_t clang_type)
2504{
2505 if (clang_type)
2506 {
2507 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2508
2509 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2510 switch (type_class)
2511 {
2512 case clang::Type::Record:
2513 if (GetCompleteQualType (ast, qual_type))
2514 {
2515 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2516 if (cxx_record_decl)
2517 {
2518 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
2519 if (template_decl)
2520 return template_decl->getTemplateArgs().size();
2521 }
2522 }
2523 break;
2524
2525 case clang::Type::Typedef:
2526 return ClangASTContext::GetNumTemplateArguments (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2527 default:
2528 break;
2529 }
2530 }
2531 return 0;
2532}
2533
2534clang_type_t
2535ClangASTContext::GetTemplateArgument (clang::ASTContext *ast, clang_type_t clang_type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
2536{
2537 if (clang_type)
2538 {
2539 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2540
2541 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2542 switch (type_class)
2543 {
2544 case clang::Type::Record:
2545 if (GetCompleteQualType (ast, qual_type))
2546 {
2547 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2548 if (cxx_record_decl)
2549 {
2550 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
2551 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
2552 {
2553 const TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
2554 switch (template_arg.getKind())
2555 {
2556 case clang::TemplateArgument::Null:
2557 kind = eTemplateArgumentKindNull;
2558 return NULL;
2559
2560 case clang::TemplateArgument::Type:
2561 kind = eTemplateArgumentKindType;
2562 return template_arg.getAsType().getAsOpaquePtr();
2563
2564 case clang::TemplateArgument::Declaration:
2565 kind = eTemplateArgumentKindDeclaration;
2566 return NULL;
2567
2568 case clang::TemplateArgument::Integral:
2569 kind = eTemplateArgumentKindIntegral;
2570 return template_arg.getIntegralType().getAsOpaquePtr();
2571
2572 case clang::TemplateArgument::Template:
2573 kind = eTemplateArgumentKindTemplate;
2574 return NULL;
2575
2576 case clang::TemplateArgument::TemplateExpansion:
2577 kind = eTemplateArgumentKindTemplateExpansion;
2578 return NULL;
2579
2580 case clang::TemplateArgument::Expression:
2581 kind = eTemplateArgumentKindExpression;
2582 return NULL;
2583
2584 case clang::TemplateArgument::Pack:
2585 kind = eTemplateArgumentKindPack;
2586 return NULL;
2587
2588 default:
2589 assert (!"Unhandled TemplateArgument::ArgKind");
2590 kind = eTemplateArgumentKindNull;
2591 return NULL;
2592 }
2593 }
2594 }
2595 }
2596 break;
2597
2598 case clang::Type::Typedef:
2599 return ClangASTContext::GetTemplateArgument (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), arg_idx, kind);
2600 default:
2601 break;
2602 }
2603 }
2604 kind = eTemplateArgumentKindNull;
2605 return NULL;
2606}
Greg Clayton0fffff52010-09-24 05:15:53 +00002607
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002608uint32_t
Greg Clayton73b472d2010-10-27 03:32:59 +00002609ClangASTContext::GetTypeInfo
2610(
2611 clang_type_t clang_type,
Greg Clayton6beaaa62011-01-17 03:46:26 +00002612 clang::ASTContext *ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002613 clang_type_t *pointee_or_element_clang_type
2614)
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002615{
2616 if (clang_type == NULL)
Greg Clayton73b472d2010-10-27 03:32:59 +00002617 return 0;
2618
2619 if (pointee_or_element_clang_type)
2620 *pointee_or_element_clang_type = NULL;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002621
2622 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2623
2624 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2625 switch (type_class)
2626 {
Sean Callanana2424172010-10-25 00:29:48 +00002627 case clang::Type::Builtin:
2628 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2629 {
Sean Callanana2424172010-10-25 00:29:48 +00002630 case clang::BuiltinType::ObjCId:
2631 case clang::BuiltinType::ObjCClass:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002632 if (ast && pointee_or_element_clang_type)
2633 *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Sean Callanana2424172010-10-25 00:29:48 +00002634 return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
Enrico Granataf9fa6ee2011-07-12 00:18:11 +00002635 break;
2636 case clang::BuiltinType::Bool:
2637 case clang::BuiltinType::Char_U:
2638 case clang::BuiltinType::UChar:
2639 case clang::BuiltinType::WChar_U:
2640 case clang::BuiltinType::Char16:
2641 case clang::BuiltinType::Char32:
2642 case clang::BuiltinType::UShort:
2643 case clang::BuiltinType::UInt:
2644 case clang::BuiltinType::ULong:
2645 case clang::BuiltinType::ULongLong:
2646 case clang::BuiltinType::UInt128:
2647 case clang::BuiltinType::Char_S:
2648 case clang::BuiltinType::SChar:
2649 case clang::BuiltinType::WChar_S:
2650 case clang::BuiltinType::Short:
2651 case clang::BuiltinType::Int:
2652 case clang::BuiltinType::Long:
2653 case clang::BuiltinType::LongLong:
2654 case clang::BuiltinType::Int128:
2655 case clang::BuiltinType::Float:
2656 case clang::BuiltinType::Double:
2657 case clang::BuiltinType::LongDouble:
2658 return eTypeIsBuiltIn | eTypeHasValue | eTypeIsScalar;
Greg Clayton73b472d2010-10-27 03:32:59 +00002659 default:
2660 break;
Sean Callanana2424172010-10-25 00:29:48 +00002661 }
2662 return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002663
2664 case clang::Type::BlockPointer:
2665 if (pointee_or_element_clang_type)
2666 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2667 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2668
Greg Clayton49462ea2011-01-15 02:52:14 +00002669 case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002670
2671 case clang::Type::ConstantArray:
2672 case clang::Type::DependentSizedArray:
2673 case clang::Type::IncompleteArray:
2674 case clang::Type::VariableArray:
2675 if (pointee_or_element_clang_type)
2676 *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2677 return eTypeHasChildren | eTypeIsArray;
2678
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002679 case clang::Type::DependentName: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002680 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
2681 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
2682 case clang::Type::Decltype: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002683
2684 case clang::Type::Enum:
2685 if (pointee_or_element_clang_type)
2686 *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2687 return eTypeIsEnumeration | eTypeHasValue;
2688
Sean Callanan912855f2011-08-11 23:56:13 +00002689 case clang::Type::Elaborated:
2690 return ClangASTContext::GetTypeInfo (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2691 ast,
2692 pointee_or_element_clang_type);
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002693 case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector;
2694 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
2695 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002696 case clang::Type::InjectedClassName: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002697
2698 case clang::Type::LValueReference:
2699 case clang::Type::RValueReference:
2700 if (pointee_or_element_clang_type)
2701 *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2702 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2703
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002704 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002705
2706 case clang::Type::ObjCObjectPointer:
2707 if (pointee_or_element_clang_type)
2708 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2709 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2710
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002711 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2712 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
Greg Clayton73b472d2010-10-27 03:32:59 +00002713
2714 case clang::Type::Pointer:
2715 if (pointee_or_element_clang_type)
2716 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2717 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2718
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002719 case clang::Type::Record:
2720 if (qual_type->getAsCXXRecordDecl())
2721 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2722 else
2723 return eTypeHasChildren | eTypeIsStructUnion;
2724 break;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002725 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
2726 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
2727 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
Greg Clayton73b472d2010-10-27 03:32:59 +00002728
2729 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002730 return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00002731 ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002732 pointee_or_element_clang_type);
2733
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002734 case clang::Type::TypeOfExpr: return 0;
2735 case clang::Type::TypeOf: return 0;
2736 case clang::Type::UnresolvedUsing: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002737 case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector;
2738 default: return 0;
2739 }
2740 return 0;
2741}
2742
Greg Clayton9e409562010-07-28 02:04:09 +00002743
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002744#pragma mark Aggregate Types
2745
2746bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002747ClangASTContext::IsAggregateType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002748{
2749 if (clang_type == NULL)
2750 return false;
2751
2752 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2753
Greg Clayton737b9322010-09-13 03:32:57 +00002754 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2755 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002756 {
Greg Claytone1a916a2010-07-21 22:12:05 +00002757 case clang::Type::IncompleteArray:
2758 case clang::Type::VariableArray:
2759 case clang::Type::ConstantArray:
2760 case clang::Type::ExtVector:
2761 case clang::Type::Vector:
2762 case clang::Type::Record:
Greg Clayton9e409562010-07-28 02:04:09 +00002763 case clang::Type::ObjCObject:
2764 case clang::Type::ObjCInterface:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002765 return true;
Sean Callanan912855f2011-08-11 23:56:13 +00002766 case clang::Type::Elaborated:
2767 return ClangASTContext::IsAggregateType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Claytone1a916a2010-07-21 22:12:05 +00002768 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002769 return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002770
2771 default:
2772 break;
2773 }
2774 // The clang type does have a value
2775 return false;
2776}
2777
2778uint32_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00002779ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002780{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002781 if (clang_type == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002782 return 0;
2783
2784 uint32_t num_children = 0;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002785 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00002786 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2787 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002788 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002789 case clang::Type::Builtin:
2790 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2791 {
Greg Clayton73b472d2010-10-27 03:32:59 +00002792 case clang::BuiltinType::ObjCId: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002793 case clang::BuiltinType::ObjCClass: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002794 num_children = 1;
Greg Clayton73b472d2010-10-27 03:32:59 +00002795 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002796
2797 default:
2798 break;
2799 }
2800 break;
Greg Clayton54979cd2010-12-15 05:08:08 +00002801
Greg Clayton49462ea2011-01-15 02:52:14 +00002802 case clang::Type::Complex: return 0;
Greg Clayton54979cd2010-12-15 05:08:08 +00002803
Greg Claytone1a916a2010-07-21 22:12:05 +00002804 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00002805 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002806 {
2807 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
2808 const RecordDecl *record_decl = record_type->getDecl();
2809 assert(record_decl);
2810 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2811 if (cxx_record_decl)
2812 {
2813 if (omit_empty_base_classes)
2814 {
2815 // Check each base classes to see if it or any of its
2816 // base classes contain any fields. This can help
2817 // limit the noise in variable views by not having to
2818 // show base classes that contain no members.
2819 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2820 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2821 base_class != base_class_end;
2822 ++base_class)
2823 {
2824 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2825
2826 // Skip empty base classes
2827 if (RecordHasFields(base_class_decl) == false)
2828 continue;
2829
2830 num_children++;
2831 }
2832 }
2833 else
2834 {
2835 // Include all base classes
2836 num_children += cxx_record_decl->getNumBases();
2837 }
2838
2839 }
2840 RecordDecl::field_iterator field, field_end;
2841 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
2842 ++num_children;
2843 }
2844 break;
2845
Greg Clayton9e409562010-07-28 02:04:09 +00002846 case clang::Type::ObjCObject:
2847 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00002848 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00002849 {
Sean Callanan78e37602011-01-27 04:42:51 +00002850 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002851 assert (objc_class_type);
2852 if (objc_class_type)
2853 {
2854 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2855
2856 if (class_interface_decl)
2857 {
2858
2859 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
2860 if (superclass_interface_decl)
2861 {
2862 if (omit_empty_base_classes)
2863 {
2864 if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
2865 ++num_children;
2866 }
2867 else
2868 ++num_children;
2869 }
2870
2871 num_children += class_interface_decl->ivar_size();
2872 }
2873 }
2874 }
2875 break;
2876
2877 case clang::Type::ObjCObjectPointer:
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002878 {
Sean Callanan78e37602011-01-27 04:42:51 +00002879 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002880 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00002881 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2882 pointee_type.getAsOpaquePtr(),
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002883 omit_empty_base_classes);
2884 // If this type points to a simple type, then it has 1 child
2885 if (num_pointee_children == 0)
2886 num_children = 1;
2887 else
2888 num_children = num_pointee_children;
2889 }
2890 break;
Greg Clayton9e409562010-07-28 02:04:09 +00002891
Greg Claytone1a916a2010-07-21 22:12:05 +00002892 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002893 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
2894 break;
2895
Greg Claytone1a916a2010-07-21 22:12:05 +00002896 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002897 {
Sean Callanan78e37602011-01-27 04:42:51 +00002898 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Greg Clayton54979cd2010-12-15 05:08:08 +00002899 QualType pointee_type (pointer_type->getPointeeType());
Greg Clayton6beaaa62011-01-17 03:46:26 +00002900 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2901 pointee_type.getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00002902 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002903 if (num_pointee_children == 0)
Greg Clayton54979cd2010-12-15 05:08:08 +00002904 {
2905 // We have a pointer to a pointee type that claims it has no children.
2906 // We will want to look at
2907 num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
2908 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002909 else
2910 num_children = num_pointee_children;
2911 }
2912 break;
2913
Greg Clayton73b472d2010-10-27 03:32:59 +00002914 case clang::Type::LValueReference:
2915 case clang::Type::RValueReference:
2916 {
Sean Callanan78e37602011-01-27 04:42:51 +00002917 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00002918 QualType pointee_type = reference_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00002919 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2920 pointee_type.getAsOpaquePtr(),
Greg Clayton73b472d2010-10-27 03:32:59 +00002921 omit_empty_base_classes);
2922 // If this type points to a simple type, then it has 1 child
2923 if (num_pointee_children == 0)
2924 num_children = 1;
2925 else
2926 num_children = num_pointee_children;
2927 }
2928 break;
2929
2930
Greg Claytone1a916a2010-07-21 22:12:05 +00002931 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002932 num_children = ClangASTContext::GetNumChildren (ast,
2933 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2934 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002935 break;
Sean Callanan912855f2011-08-11 23:56:13 +00002936
2937 case clang::Type::Elaborated:
2938 num_children = ClangASTContext::GetNumChildren (ast,
2939 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2940 omit_empty_base_classes);
2941 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002942
2943 default:
2944 break;
2945 }
2946 return num_children;
2947}
2948
Greg Claytonbf2331c2011-09-09 23:04:00 +00002949uint32_t
2950ClangASTContext::GetNumDirectBaseClasses (clang::ASTContext *ast, clang_type_t clang_type)
2951{
2952 if (clang_type == NULL)
2953 return 0;
2954
2955 uint32_t count = 0;
2956 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2957 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2958 switch (type_class)
2959 {
2960 case clang::Type::Record:
2961 if (GetCompleteQualType (ast, qual_type))
2962 {
2963 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2964 if (cxx_record_decl)
2965 count = cxx_record_decl->getNumBases();
2966 }
2967 break;
2968
2969 case clang::Type::ObjCObject:
2970 case clang::Type::ObjCInterface:
2971 if (GetCompleteQualType (ast, qual_type))
2972 {
2973 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
2974 if (objc_class_type)
2975 {
2976 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2977
2978 if (class_interface_decl && class_interface_decl->getSuperClass())
2979 count = 1;
2980 }
2981 }
2982 break;
2983
2984
2985 case clang::Type::Typedef:
2986 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2987 break;
2988
2989 case clang::Type::Elaborated:
2990 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2991 break;
2992
2993 default:
2994 break;
2995 }
2996 return count;
2997}
2998
2999uint32_t
3000ClangASTContext::GetNumVirtualBaseClasses (clang::ASTContext *ast,
3001 clang_type_t clang_type)
3002{
3003 if (clang_type == NULL)
3004 return 0;
3005
3006 uint32_t count = 0;
3007 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3008 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3009 switch (type_class)
3010 {
3011 case clang::Type::Record:
3012 if (GetCompleteQualType (ast, qual_type))
3013 {
3014 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3015 if (cxx_record_decl)
3016 count = cxx_record_decl->getNumVBases();
3017 }
3018 break;
3019
3020 case clang::Type::Typedef:
3021 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3022 break;
3023
3024 case clang::Type::Elaborated:
3025 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3026 break;
3027
3028 default:
3029 break;
3030 }
3031 return count;
3032}
3033
3034uint32_t
3035ClangASTContext::GetNumFields (clang::ASTContext *ast, clang_type_t clang_type)
3036{
3037 if (clang_type == NULL)
3038 return 0;
3039
3040 uint32_t count = 0;
3041 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3042 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3043 switch (type_class)
3044 {
3045 case clang::Type::Record:
3046 if (GetCompleteQualType (ast, qual_type))
3047 {
3048 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
3049 if (record_type)
3050 {
3051 RecordDecl *record_decl = record_type->getDecl();
3052 if (record_decl)
3053 {
3054 uint32_t field_idx = 0;
3055 RecordDecl::field_iterator field, field_end;
3056 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
3057 ++field_idx;
3058 count = field_idx;
3059 }
3060 }
3061 }
3062 break;
3063
3064 case clang::Type::Typedef:
3065 count = ClangASTContext::GetNumFields (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3066 break;
3067
3068 case clang::Type::Elaborated:
3069 count = ClangASTContext::GetNumFields (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3070 break;
3071
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003072 case clang::Type::ObjCObject:
3073 case clang::Type::ObjCInterface:
3074 if (GetCompleteQualType (ast, qual_type))
3075 {
3076 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3077 if (objc_class_type)
3078 {
3079 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3080
3081 if (class_interface_decl)
3082 count = class_interface_decl->ivar_size();
3083 }
3084 }
3085 break;
3086
Greg Claytonbf2331c2011-09-09 23:04:00 +00003087 default:
3088 break;
3089 }
3090 return count;
3091}
3092
3093clang_type_t
3094ClangASTContext::GetDirectBaseClassAtIndex (clang::ASTContext *ast,
3095 clang_type_t clang_type,
3096 uint32_t idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003097 uint32_t *bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003098{
3099 if (clang_type == NULL)
3100 return 0;
3101
3102 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3103 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3104 switch (type_class)
3105 {
3106 case clang::Type::Record:
3107 if (GetCompleteQualType (ast, qual_type))
3108 {
3109 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3110 if (cxx_record_decl)
3111 {
3112 uint32_t curr_idx = 0;
3113 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3114 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3115 base_class != base_class_end;
3116 ++base_class, ++curr_idx)
3117 {
3118 if (curr_idx == idx)
3119 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003120 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003121 {
3122 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3123 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3124// if (base_class->isVirtual())
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003125// *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003126// else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003127 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003128 }
3129 return base_class->getType().getAsOpaquePtr();
3130 }
3131 }
3132 }
3133 }
3134 break;
3135
3136 case clang::Type::ObjCObject:
3137 case clang::Type::ObjCInterface:
3138 if (idx == 0 && GetCompleteQualType (ast, qual_type))
3139 {
3140 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
3141 if (objc_class_type)
3142 {
3143 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3144
3145 if (class_interface_decl)
3146 {
3147 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3148 if (superclass_interface_decl)
3149 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003150 if (bit_offset_ptr)
3151 *bit_offset_ptr = 0;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003152 return ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr();
3153 }
3154 }
3155 }
3156 }
3157 break;
3158
3159
3160 case clang::Type::Typedef:
3161 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3162 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3163 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003164 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003165
3166 case clang::Type::Elaborated:
3167 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3168 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3169 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003170 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003171
3172 default:
3173 break;
3174 }
3175 return NULL;
3176}
3177
3178clang_type_t
3179ClangASTContext::GetVirtualBaseClassAtIndex (clang::ASTContext *ast,
3180 clang_type_t clang_type,
3181 uint32_t idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003182 uint32_t *bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003183{
3184 if (clang_type == NULL)
3185 return 0;
3186
3187 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3188 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3189 switch (type_class)
3190 {
3191 case clang::Type::Record:
3192 if (GetCompleteQualType (ast, qual_type))
3193 {
3194 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3195 if (cxx_record_decl)
3196 {
3197 uint32_t curr_idx = 0;
3198 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3199 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
3200 base_class != base_class_end;
3201 ++base_class, ++curr_idx)
3202 {
3203 if (curr_idx == idx)
3204 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003205 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003206 {
3207 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3208 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003209 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003210
3211 }
3212 return base_class->getType().getAsOpaquePtr();
3213 }
3214 }
3215 }
3216 }
3217 break;
3218
3219 case clang::Type::Typedef:
3220 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3221 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3222 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003223 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003224
3225 case clang::Type::Elaborated:
3226 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3227 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3228 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003229 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003230
3231 default:
3232 break;
3233 }
3234 return NULL;
3235}
3236
3237clang_type_t
3238ClangASTContext::GetFieldAtIndex (clang::ASTContext *ast,
3239 clang_type_t clang_type,
3240 uint32_t idx,
3241 std::string& name,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003242 uint32_t *bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003243{
3244 if (clang_type == NULL)
3245 return 0;
3246
3247 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3248 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3249 switch (type_class)
3250 {
3251 case clang::Type::Record:
3252 if (GetCompleteQualType (ast, qual_type))
3253 {
3254 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3255 const RecordDecl *record_decl = record_type->getDecl();
3256 uint32_t field_idx = 0;
3257 RecordDecl::field_iterator field, field_end;
3258 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
3259 {
3260 if (idx == field_idx)
3261 {
3262 // Print the member type if requested
3263 // Print the member name and equal sign
3264 name.assign(field->getNameAsString());
3265
3266 // Figure out the type byte size (field_type_info.first) and
3267 // alignment (field_type_info.second) from the AST context.
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003268 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003269 {
3270 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003271 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003272 }
3273
3274 return field->getType().getAsOpaquePtr();
3275 }
3276 }
3277 }
3278 break;
3279
3280 case clang::Type::ObjCObject:
3281 case clang::Type::ObjCInterface:
3282 if (GetCompleteQualType (ast, qual_type))
3283 {
3284 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3285 assert (objc_class_type);
3286 if (objc_class_type)
3287 {
3288 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3289
3290 if (class_interface_decl)
3291 {
3292 if (idx < (class_interface_decl->ivar_size()))
3293 {
3294 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3295 uint32_t ivar_idx = 0;
3296
3297 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
3298 {
3299 if (ivar_idx == idx)
3300 {
3301 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3302
3303 QualType ivar_qual_type(ivar_decl->getType());
3304
3305 name.assign(ivar_decl->getNameAsString());
3306
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003307 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003308 {
3309 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003310 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003311 }
3312
3313 return ivar_qual_type.getAsOpaquePtr();
3314 }
3315 }
3316 }
3317 }
3318 }
3319 }
3320 break;
3321
3322
3323 case clang::Type::Typedef:
3324 return ClangASTContext::GetFieldAtIndex (ast,
3325 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3326 idx,
3327 name,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003328 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003329
3330 case clang::Type::Elaborated:
3331 return ClangASTContext::GetFieldAtIndex (ast,
3332 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3333 idx,
3334 name,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003335 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003336
3337 default:
3338 break;
3339 }
3340 return NULL;
3341}
3342
3343
Greg Clayton54979cd2010-12-15 05:08:08 +00003344// If a pointer to a pointee type (the clang_type arg) says that it has no
3345// children, then we either need to trust it, or override it and return a
3346// different result. For example, an "int *" has one child that is an integer,
3347// but a function pointer doesn't have any children. Likewise if a Record type
3348// claims it has no children, then there really is nothing to show.
3349uint32_t
3350ClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
3351{
3352 if (clang_type == NULL)
3353 return 0;
3354
3355 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3356 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3357 switch (type_class)
3358 {
Greg Clayton97a43712011-01-08 22:26:47 +00003359 case clang::Type::Builtin:
3360 switch (cast<clang::BuiltinType>(qual_type)->getKind())
3361 {
Greg Clayton7260f622011-04-18 08:33:37 +00003362 case clang::BuiltinType::UnknownAny:
Greg Clayton97a43712011-01-08 22:26:47 +00003363 case clang::BuiltinType::Void:
3364 case clang::BuiltinType::NullPtr:
3365 return 0;
3366 case clang::BuiltinType::Bool:
3367 case clang::BuiltinType::Char_U:
3368 case clang::BuiltinType::UChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00003369 case clang::BuiltinType::WChar_U:
Greg Clayton97a43712011-01-08 22:26:47 +00003370 case clang::BuiltinType::Char16:
3371 case clang::BuiltinType::Char32:
3372 case clang::BuiltinType::UShort:
3373 case clang::BuiltinType::UInt:
3374 case clang::BuiltinType::ULong:
3375 case clang::BuiltinType::ULongLong:
3376 case clang::BuiltinType::UInt128:
3377 case clang::BuiltinType::Char_S:
3378 case clang::BuiltinType::SChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00003379 case clang::BuiltinType::WChar_S:
Greg Clayton97a43712011-01-08 22:26:47 +00003380 case clang::BuiltinType::Short:
3381 case clang::BuiltinType::Int:
3382 case clang::BuiltinType::Long:
3383 case clang::BuiltinType::LongLong:
3384 case clang::BuiltinType::Int128:
3385 case clang::BuiltinType::Float:
3386 case clang::BuiltinType::Double:
3387 case clang::BuiltinType::LongDouble:
3388 case clang::BuiltinType::Dependent:
3389 case clang::BuiltinType::Overload:
Greg Clayton97a43712011-01-08 22:26:47 +00003390 case clang::BuiltinType::ObjCId:
3391 case clang::BuiltinType::ObjCClass:
3392 case clang::BuiltinType::ObjCSel:
Sean Callanand12cf8bb2011-05-15 22:34:38 +00003393 case clang::BuiltinType::BoundMember:
Greg Claytonf0705c82011-10-22 03:33:13 +00003394 case clang::BuiltinType::Half:
3395 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytoned3ae702011-11-09 19:04:58 +00003396 case clang::BuiltinType::PseudoObject:
Greg Clayton97a43712011-01-08 22:26:47 +00003397 return 1;
3398 }
3399 break;
3400
Greg Clayton49462ea2011-01-15 02:52:14 +00003401 case clang::Type::Complex: return 1;
Greg Clayton54979cd2010-12-15 05:08:08 +00003402 case clang::Type::Pointer: return 1;
3403 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
3404 case clang::Type::LValueReference: return 1;
3405 case clang::Type::RValueReference: return 1;
3406 case clang::Type::MemberPointer: return 0;
3407 case clang::Type::ConstantArray: return 0;
3408 case clang::Type::IncompleteArray: return 0;
3409 case clang::Type::VariableArray: return 0;
3410 case clang::Type::DependentSizedArray: return 0;
3411 case clang::Type::DependentSizedExtVector: return 0;
3412 case clang::Type::Vector: return 0;
3413 case clang::Type::ExtVector: return 0;
3414 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
3415 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
3416 case clang::Type::UnresolvedUsing: return 0;
3417 case clang::Type::Paren: return 0;
3418 case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00003419 case clang::Type::Elaborated: return ClangASTContext::GetNumPointeeChildren (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton54979cd2010-12-15 05:08:08 +00003420 case clang::Type::TypeOfExpr: return 0;
3421 case clang::Type::TypeOf: return 0;
3422 case clang::Type::Decltype: return 0;
3423 case clang::Type::Record: return 0;
3424 case clang::Type::Enum: return 1;
Greg Clayton54979cd2010-12-15 05:08:08 +00003425 case clang::Type::TemplateTypeParm: return 1;
3426 case clang::Type::SubstTemplateTypeParm: return 1;
3427 case clang::Type::TemplateSpecialization: return 1;
3428 case clang::Type::InjectedClassName: return 0;
3429 case clang::Type::DependentName: return 1;
3430 case clang::Type::DependentTemplateSpecialization: return 1;
3431 case clang::Type::ObjCObject: return 0;
3432 case clang::Type::ObjCInterface: return 0;
3433 case clang::Type::ObjCObjectPointer: return 1;
3434 default:
3435 break;
3436 }
3437 return 0;
3438}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003439
Greg Clayton1be10fc2010-09-29 01:12:09 +00003440clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003441ClangASTContext::GetChildClangTypeAtIndex
3442(
Jim Inghamd555bac2011-06-24 22:03:24 +00003443 ExecutionContext *exe_ctx,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003444 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003445 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003446 uint32_t idx,
3447 bool transparent_pointers,
3448 bool omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003449 bool ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003450 std::string& child_name,
3451 uint32_t &child_byte_size,
3452 int32_t &child_byte_offset,
3453 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003454 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003455 bool &child_is_base_class,
3456 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003457)
3458{
3459 if (parent_clang_type)
3460
Jim Inghamd555bac2011-06-24 22:03:24 +00003461 return GetChildClangTypeAtIndex (exe_ctx,
3462 getASTContext(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003463 parent_name,
3464 parent_clang_type,
3465 idx,
3466 transparent_pointers,
3467 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003468 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003469 child_name,
3470 child_byte_size,
3471 child_byte_offset,
3472 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003473 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003474 child_is_base_class,
3475 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003476 return NULL;
3477}
3478
Greg Clayton1be10fc2010-09-29 01:12:09 +00003479clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003480ClangASTContext::GetChildClangTypeAtIndex
3481(
Jim Inghamd555bac2011-06-24 22:03:24 +00003482 ExecutionContext *exe_ctx,
Greg Clayton6beaaa62011-01-17 03:46:26 +00003483 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003484 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003485 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003486 uint32_t idx,
3487 bool transparent_pointers,
3488 bool omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003489 bool ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003490 std::string& child_name,
3491 uint32_t &child_byte_size,
3492 int32_t &child_byte_offset,
3493 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003494 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003495 bool &child_is_base_class,
3496 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003497)
3498{
3499 if (parent_clang_type == NULL)
3500 return NULL;
3501
Greg Clayton6beaaa62011-01-17 03:46:26 +00003502 if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003503 {
3504 uint32_t bit_offset;
3505 child_bitfield_bit_size = 0;
3506 child_bitfield_bit_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003507 child_is_base_class = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003508 QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00003509 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
3510 switch (parent_type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003511 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003512 case clang::Type::Builtin:
3513 switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
3514 {
3515 case clang::BuiltinType::ObjCId:
3516 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00003517 child_name = "isa";
Greg Clayton6beaaa62011-01-17 03:46:26 +00003518 child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
3519 return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003520
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003521 default:
3522 break;
3523 }
3524 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003525
Greg Claytone1a916a2010-07-21 22:12:05 +00003526 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00003527 if (GetCompleteQualType (ast, parent_qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003528 {
3529 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
3530 const RecordDecl *record_decl = record_type->getDecl();
3531 assert(record_decl);
Greg Clayton6beaaa62011-01-17 03:46:26 +00003532 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003533 uint32_t child_idx = 0;
3534
3535 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3536 if (cxx_record_decl)
3537 {
3538 // We might have base classes to print out first
3539 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3540 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3541 base_class != base_class_end;
3542 ++base_class)
3543 {
3544 const CXXRecordDecl *base_class_decl = NULL;
3545
3546 // Skip empty base classes
3547 if (omit_empty_base_classes)
3548 {
3549 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3550 if (RecordHasFields(base_class_decl) == false)
3551 continue;
3552 }
3553
3554 if (idx == child_idx)
3555 {
3556 if (base_class_decl == NULL)
3557 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3558
3559
3560 if (base_class->isVirtual())
Greg Clayton6ed95942011-01-22 07:12:45 +00003561 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003562 else
Greg Clayton6ed95942011-01-22 07:12:45 +00003563 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003564
3565 // Base classes should be a multiple of 8 bits in size
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003566 child_byte_offset = bit_offset/8;
Greg Claytone3055942011-06-30 02:28:26 +00003567
3568 child_name = ClangASTType::GetTypeNameForQualType(base_class->getType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003569
Greg Clayton6beaaa62011-01-17 03:46:26 +00003570 uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003571
Jim Inghamf46b3382011-04-15 23:42:06 +00003572 // Base classes bit sizes should be a multiple of 8 bits in size
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003573 assert (clang_type_info_bit_size % 8 == 0);
3574 child_byte_size = clang_type_info_bit_size / 8;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003575 child_is_base_class = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003576 return base_class->getType().getAsOpaquePtr();
3577 }
3578 // We don't increment the child index in the for loop since we might
3579 // be skipping empty base classes
3580 ++child_idx;
3581 }
3582 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003583 // Make sure index is in range...
3584 uint32_t field_idx = 0;
3585 RecordDecl::field_iterator field, field_end;
3586 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
3587 {
3588 if (idx == child_idx)
3589 {
3590 // Print the member type if requested
3591 // Print the member name and equal sign
3592 child_name.assign(field->getNameAsString().c_str());
3593
3594 // Figure out the type byte size (field_type_info.first) and
3595 // alignment (field_type_info.second) from the AST context.
Greg Clayton6beaaa62011-01-17 03:46:26 +00003596 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
Greg Claytonc982c762010-07-09 20:39:50 +00003597 assert(field_idx < record_layout.getFieldCount());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003598
3599 child_byte_size = field_type_info.first / 8;
3600
3601 // Figure out the field offset within the current struct/union/class type
3602 bit_offset = record_layout.getFieldOffset (field_idx);
3603 child_byte_offset = bit_offset / 8;
Greg Clayton6beaaa62011-01-17 03:46:26 +00003604 if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003605 child_bitfield_bit_offset = bit_offset % 8;
3606
3607 return field->getType().getAsOpaquePtr();
3608 }
3609 }
3610 }
3611 break;
3612
Greg Clayton9e409562010-07-28 02:04:09 +00003613 case clang::Type::ObjCObject:
3614 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00003615 if (GetCompleteQualType (ast, parent_qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00003616 {
Sean Callanan78e37602011-01-27 04:42:51 +00003617 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003618 assert (objc_class_type);
3619 if (objc_class_type)
3620 {
3621 uint32_t child_idx = 0;
3622 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3623
3624 if (class_interface_decl)
3625 {
3626
Greg Clayton6beaaa62011-01-17 03:46:26 +00003627 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Clayton9e409562010-07-28 02:04:09 +00003628 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3629 if (superclass_interface_decl)
3630 {
3631 if (omit_empty_base_classes)
3632 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003633 if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
Greg Clayton9e409562010-07-28 02:04:09 +00003634 {
3635 if (idx == 0)
3636 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003637 QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
Greg Clayton9e409562010-07-28 02:04:09 +00003638
3639
3640 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
3641
Greg Clayton6beaaa62011-01-17 03:46:26 +00003642 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003643
3644 child_byte_size = ivar_type_info.first / 8;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003645 child_byte_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003646 child_is_base_class = true;
Greg Clayton9e409562010-07-28 02:04:09 +00003647
3648 return ivar_qual_type.getAsOpaquePtr();
3649 }
3650
3651 ++child_idx;
3652 }
3653 }
3654 else
3655 ++child_idx;
3656 }
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003657
3658 const uint32_t superclass_idx = child_idx;
Greg Clayton9e409562010-07-28 02:04:09 +00003659
3660 if (idx < (child_idx + class_interface_decl->ivar_size()))
3661 {
3662 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3663
3664 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
3665 {
3666 if (child_idx == idx)
3667 {
Jim Inghamf80bc3f2011-12-08 02:53:10 +00003668 ObjCIvarDecl* ivar_decl = *ivar_pos;
Greg Clayton9e409562010-07-28 02:04:09 +00003669
3670 QualType ivar_qual_type(ivar_decl->getType());
3671
3672 child_name.assign(ivar_decl->getNameAsString().c_str());
3673
Greg Clayton6beaaa62011-01-17 03:46:26 +00003674 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003675
3676 child_byte_size = ivar_type_info.first / 8;
3677
3678 // Figure out the field offset within the current struct/union/class type
Jim Inghamd555bac2011-06-24 22:03:24 +00003679 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
3680 // that doesn't account for the space taken up by unbacked properties, or from
3681 // the changing size of base classes that are newer than this class.
3682 // So if we have a process around that we can ask about this object, do so.
3683 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
Greg Claytonc14ee322011-09-22 04:58:26 +00003684 Process *process = NULL;
3685 if (exe_ctx)
3686 process = exe_ctx->GetProcessPtr();
3687 if (process)
Jim Inghamd555bac2011-06-24 22:03:24 +00003688 {
Greg Claytonc14ee322011-09-22 04:58:26 +00003689 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
Jim Inghamd555bac2011-06-24 22:03:24 +00003690 if (objc_runtime != NULL)
3691 {
Enrico Granata6f3533f2011-07-29 19:53:35 +00003692 ClangASTType parent_ast_type (ast, parent_qual_type.getAsOpaquePtr());
Jim Inghamd555bac2011-06-24 22:03:24 +00003693 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
3694 }
3695 }
3696
Jim Inghamf80bc3f2011-12-08 02:53:10 +00003697 // Setting this to UINT32_MAX to make sure we don't compute it twice...
3698 bit_offset = UINT32_MAX;
3699
Jim Inghamd555bac2011-06-24 22:03:24 +00003700 if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
3701 {
3702 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
3703 child_byte_offset = bit_offset / 8;
3704 }
Jim Inghamf80bc3f2011-12-08 02:53:10 +00003705
3706 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
3707 // of a bitfield within its containing object. So regardless of where we get the byte
3708 // offset from, we still need to get the bit offset for bitfields from the layout.
3709
3710 if (ClangASTContext::FieldIsBitfield (ast, ivar_decl, child_bitfield_bit_size))
3711 {
3712 if (bit_offset == UINT32_MAX)
3713 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
3714
3715 child_bitfield_bit_offset = bit_offset % 8;
3716 }
Greg Clayton9e409562010-07-28 02:04:09 +00003717 return ivar_qual_type.getAsOpaquePtr();
3718 }
3719 ++child_idx;
3720 }
3721 }
3722 }
3723 }
3724 }
3725 break;
3726
3727 case clang::Type::ObjCObjectPointer:
3728 {
Sean Callanan78e37602011-01-27 04:42:51 +00003729 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003730 QualType pointee_type = pointer_type->getPointeeType();
3731
3732 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3733 {
Greg Claytone221f822011-01-21 01:59:00 +00003734 child_is_deref_of_parent = false;
3735 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00003736 return GetChildClangTypeAtIndex (exe_ctx,
3737 ast,
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003738 parent_name,
3739 pointer_type->getPointeeType().getAsOpaquePtr(),
3740 idx,
3741 transparent_pointers,
3742 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003743 ignore_array_bounds,
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003744 child_name,
3745 child_byte_size,
3746 child_byte_offset,
3747 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003748 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003749 child_is_base_class,
3750 tmp_child_is_deref_of_parent);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003751 }
3752 else
3753 {
Greg Claytone221f822011-01-21 01:59:00 +00003754 child_is_deref_of_parent = true;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003755 if (parent_name)
3756 {
3757 child_name.assign(1, '*');
3758 child_name += parent_name;
3759 }
3760
3761 // We have a pointer to an simple type
3762 if (idx == 0)
3763 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003764 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003765 assert(clang_type_info.first % 8 == 0);
3766 child_byte_size = clang_type_info.first / 8;
3767 child_byte_offset = 0;
3768 return pointee_type.getAsOpaquePtr();
3769 }
3770 }
Greg Clayton9e409562010-07-28 02:04:09 +00003771 }
3772 break;
3773
Greg Claytone1a916a2010-07-21 22:12:05 +00003774 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003775 {
3776 const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
3777 const uint64_t element_count = array->getSize().getLimitedValue();
3778
Greg Claytondaf515f2011-07-09 20:12:33 +00003779 if (ignore_array_bounds || idx < element_count)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003780 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003781 if (GetCompleteQualType (ast, array->getElementType()))
3782 {
3783 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003784
Greg Clayton6beaaa62011-01-17 03:46:26 +00003785 char element_name[64];
3786 ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003787
Greg Clayton6beaaa62011-01-17 03:46:26 +00003788 child_name.assign(element_name);
3789 assert(field_type_info.first % 8 == 0);
3790 child_byte_size = field_type_info.first / 8;
Greg Claytondaf515f2011-07-09 20:12:33 +00003791 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
Greg Clayton6beaaa62011-01-17 03:46:26 +00003792 return array->getElementType().getAsOpaquePtr();
3793 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003794 }
3795 }
3796 break;
3797
Greg Claytone1a916a2010-07-21 22:12:05 +00003798 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003799 {
Sean Callanan78e37602011-01-27 04:42:51 +00003800 const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003801 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton97a43712011-01-08 22:26:47 +00003802
3803 // Don't dereference "void *" pointers
3804 if (pointee_type->isVoidType())
3805 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003806
3807 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3808 {
Greg Claytone221f822011-01-21 01:59:00 +00003809 child_is_deref_of_parent = false;
3810 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00003811 return GetChildClangTypeAtIndex (exe_ctx,
3812 ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003813 parent_name,
3814 pointer_type->getPointeeType().getAsOpaquePtr(),
3815 idx,
3816 transparent_pointers,
3817 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003818 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003819 child_name,
3820 child_byte_size,
3821 child_byte_offset,
3822 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003823 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003824 child_is_base_class,
3825 tmp_child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003826 }
3827 else
3828 {
Greg Claytone221f822011-01-21 01:59:00 +00003829 child_is_deref_of_parent = true;
3830
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003831 if (parent_name)
3832 {
3833 child_name.assign(1, '*');
3834 child_name += parent_name;
3835 }
3836
3837 // We have a pointer to an simple type
3838 if (idx == 0)
3839 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003840 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003841 assert(clang_type_info.first % 8 == 0);
3842 child_byte_size = clang_type_info.first / 8;
3843 child_byte_offset = 0;
3844 return pointee_type.getAsOpaquePtr();
3845 }
3846 }
3847 }
3848 break;
3849
Greg Clayton73b472d2010-10-27 03:32:59 +00003850 case clang::Type::LValueReference:
3851 case clang::Type::RValueReference:
3852 {
Sean Callanan78e37602011-01-27 04:42:51 +00003853 const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00003854 QualType pointee_type(reference_type->getPointeeType());
3855 clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
3856 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
3857 {
Greg Claytone221f822011-01-21 01:59:00 +00003858 child_is_deref_of_parent = false;
3859 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00003860 return GetChildClangTypeAtIndex (exe_ctx,
3861 ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00003862 parent_name,
3863 pointee_clang_type,
3864 idx,
3865 transparent_pointers,
3866 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003867 ignore_array_bounds,
Greg Clayton73b472d2010-10-27 03:32:59 +00003868 child_name,
3869 child_byte_size,
3870 child_byte_offset,
3871 child_bitfield_bit_size,
3872 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003873 child_is_base_class,
3874 tmp_child_is_deref_of_parent);
Greg Clayton73b472d2010-10-27 03:32:59 +00003875 }
3876 else
3877 {
3878 if (parent_name)
3879 {
3880 child_name.assign(1, '&');
3881 child_name += parent_name;
3882 }
3883
3884 // We have a pointer to an simple type
3885 if (idx == 0)
3886 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003887 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Clayton73b472d2010-10-27 03:32:59 +00003888 assert(clang_type_info.first % 8 == 0);
3889 child_byte_size = clang_type_info.first / 8;
3890 child_byte_offset = 0;
3891 return pointee_type.getAsOpaquePtr();
3892 }
3893 }
3894 }
3895 break;
3896
Greg Claytone1a916a2010-07-21 22:12:05 +00003897 case clang::Type::Typedef:
Jim Inghamd555bac2011-06-24 22:03:24 +00003898 return GetChildClangTypeAtIndex (exe_ctx,
3899 ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003900 parent_name,
Sean Callanan48114472010-12-13 01:26:27 +00003901 cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003902 idx,
3903 transparent_pointers,
3904 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003905 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003906 child_name,
3907 child_byte_size,
3908 child_byte_offset,
3909 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003910 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003911 child_is_base_class,
3912 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003913 break;
Sean Callanan912855f2011-08-11 23:56:13 +00003914
3915 case clang::Type::Elaborated:
3916 return GetChildClangTypeAtIndex (exe_ctx,
3917 ast,
3918 parent_name,
3919 cast<ElaboratedType>(parent_qual_type)->getNamedType().getAsOpaquePtr(),
3920 idx,
3921 transparent_pointers,
3922 omit_empty_base_classes,
3923 ignore_array_bounds,
3924 child_name,
3925 child_byte_size,
3926 child_byte_offset,
3927 child_bitfield_bit_size,
3928 child_bitfield_bit_offset,
3929 child_is_base_class,
3930 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003931
3932 default:
3933 break;
3934 }
3935 }
Greg Clayton19503a22010-07-23 15:37:46 +00003936 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003937}
3938
3939static inline bool
3940BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
3941{
Greg Clayton6beaaa62011-01-17 03:46:26 +00003942 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003943}
3944
3945static uint32_t
3946GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
3947{
3948 uint32_t num_bases = 0;
3949 if (cxx_record_decl)
3950 {
3951 if (omit_empty_base_classes)
3952 {
3953 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3954 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3955 base_class != base_class_end;
3956 ++base_class)
3957 {
3958 // Skip empty base classes
3959 if (omit_empty_base_classes)
3960 {
3961 if (BaseSpecifierIsEmpty (base_class))
3962 continue;
3963 }
3964 ++num_bases;
3965 }
3966 }
3967 else
3968 num_bases = cxx_record_decl->getNumBases();
3969 }
3970 return num_bases;
3971}
3972
3973
3974static uint32_t
3975GetIndexForRecordBase
3976(
3977 const RecordDecl *record_decl,
3978 const CXXBaseSpecifier *base_spec,
3979 bool omit_empty_base_classes
3980)
3981{
3982 uint32_t child_idx = 0;
3983
3984 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3985
3986// const char *super_name = record_decl->getNameAsCString();
3987// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
3988// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
3989//
3990 if (cxx_record_decl)
3991 {
3992 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3993 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3994 base_class != base_class_end;
3995 ++base_class)
3996 {
3997 if (omit_empty_base_classes)
3998 {
3999 if (BaseSpecifierIsEmpty (base_class))
4000 continue;
4001 }
4002
4003// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
4004// child_idx,
4005// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
4006//
4007//
4008 if (base_class == base_spec)
4009 return child_idx;
4010 ++child_idx;
4011 }
4012 }
4013
4014 return UINT32_MAX;
4015}
4016
4017
4018static uint32_t
4019GetIndexForRecordChild
4020(
4021 const RecordDecl *record_decl,
4022 NamedDecl *canonical_decl,
4023 bool omit_empty_base_classes
4024)
4025{
4026 uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
4027
4028// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4029//
4030//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
4031// if (cxx_record_decl)
4032// {
4033// CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4034// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4035// base_class != base_class_end;
4036// ++base_class)
4037// {
4038// if (omit_empty_base_classes)
4039// {
4040// if (BaseSpecifierIsEmpty (base_class))
4041// continue;
4042// }
4043//
4044//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
4045//// record_decl->getNameAsCString(),
4046//// canonical_decl->getNameAsCString(),
4047//// child_idx,
4048//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
4049//
4050//
4051// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4052// if (curr_base_class_decl == canonical_decl)
4053// {
4054// return child_idx;
4055// }
4056// ++child_idx;
4057// }
4058// }
4059//
4060// const uint32_t num_bases = child_idx;
4061 RecordDecl::field_iterator field, field_end;
4062 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4063 field != field_end;
4064 ++field, ++child_idx)
4065 {
4066// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
4067// record_decl->getNameAsCString(),
4068// canonical_decl->getNameAsCString(),
4069// child_idx - num_bases,
4070// field->getNameAsCString());
4071
4072 if (field->getCanonicalDecl() == canonical_decl)
4073 return child_idx;
4074 }
4075
4076 return UINT32_MAX;
4077}
4078
4079// Look for a child member (doesn't include base classes, but it does include
4080// their members) in the type hierarchy. Returns an index path into "clang_type"
4081// on how to reach the appropriate member.
4082//
4083// class A
4084// {
4085// public:
4086// int m_a;
4087// int m_b;
4088// };
4089//
4090// class B
4091// {
4092// };
4093//
4094// class C :
4095// public B,
4096// public A
4097// {
4098// };
4099//
4100// If we have a clang type that describes "class C", and we wanted to looked
4101// "m_b" in it:
4102//
4103// With omit_empty_base_classes == false we would get an integer array back with:
4104// { 1, 1 }
4105// The first index 1 is the child index for "class A" within class C
4106// The second index 1 is the child index for "m_b" within class A
4107//
4108// With omit_empty_base_classes == true we would get an integer array back with:
4109// { 0, 1 }
4110// 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)
4111// The second index 1 is the child index for "m_b" within class A
4112
4113size_t
4114ClangASTContext::GetIndexOfChildMemberWithName
4115(
Greg Clayton6beaaa62011-01-17 03:46:26 +00004116 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00004117 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004118 const char *name,
4119 bool omit_empty_base_classes,
4120 std::vector<uint32_t>& child_indexes
4121)
4122{
4123 if (clang_type && name && name[0])
4124 {
4125 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00004126 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4127 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004128 {
Greg Claytone1a916a2010-07-21 22:12:05 +00004129 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00004130 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004131 {
4132 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4133 const RecordDecl *record_decl = record_type->getDecl();
4134
4135 assert(record_decl);
4136 uint32_t child_idx = 0;
4137
4138 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4139
4140 // Try and find a field that matches NAME
4141 RecordDecl::field_iterator field, field_end;
4142 StringRef name_sref(name);
4143 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4144 field != field_end;
4145 ++field, ++child_idx)
4146 {
4147 if (field->getName().equals (name_sref))
4148 {
4149 // We have to add on the number of base classes to this index!
4150 child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
4151 return child_indexes.size();
4152 }
4153 }
4154
4155 if (cxx_record_decl)
4156 {
4157 const RecordDecl *parent_record_decl = cxx_record_decl;
4158
4159 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
4160
4161 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
4162 // Didn't find things easily, lets let clang do its thang...
Sean Callanancc427fa2011-07-30 02:42:06 +00004163 IdentifierInfo & ident_ref = ast->Idents.get(name_sref);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004164 DeclarationName decl_name(&ident_ref);
4165
4166 CXXBasePaths paths;
4167 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
4168 decl_name.getAsOpaquePtr(),
4169 paths))
4170 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004171 CXXBasePaths::const_paths_iterator path, path_end = paths.end();
4172 for (path = paths.begin(); path != path_end; ++path)
4173 {
4174 const size_t num_path_elements = path->size();
4175 for (size_t e=0; e<num_path_elements; ++e)
4176 {
4177 CXXBasePathElement elem = (*path)[e];
4178
4179 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
4180 if (child_idx == UINT32_MAX)
4181 {
4182 child_indexes.clear();
4183 return 0;
4184 }
4185 else
4186 {
4187 child_indexes.push_back (child_idx);
4188 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
4189 }
4190 }
4191 DeclContext::lookup_iterator named_decl_pos;
4192 for (named_decl_pos = path->Decls.first;
4193 named_decl_pos != path->Decls.second && parent_record_decl;
4194 ++named_decl_pos)
4195 {
4196 //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
4197
4198 child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
4199 if (child_idx == UINT32_MAX)
4200 {
4201 child_indexes.clear();
4202 return 0;
4203 }
4204 else
4205 {
4206 child_indexes.push_back (child_idx);
4207 }
4208 }
4209 }
4210 return child_indexes.size();
4211 }
4212 }
4213
4214 }
4215 break;
4216
Greg Clayton9e409562010-07-28 02:04:09 +00004217 case clang::Type::ObjCObject:
4218 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00004219 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00004220 {
4221 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00004222 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00004223 assert (objc_class_type);
4224 if (objc_class_type)
4225 {
4226 uint32_t child_idx = 0;
4227 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4228
4229 if (class_interface_decl)
4230 {
4231 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4232 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4233
Greg Clayton6ba78152010-09-18 02:11:07 +00004234 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
Greg Clayton9e409562010-07-28 02:04:09 +00004235 {
4236 const ObjCIvarDecl* ivar_decl = *ivar_pos;
4237
4238 if (ivar_decl->getName().equals (name_sref))
4239 {
4240 if ((!omit_empty_base_classes && superclass_interface_decl) ||
4241 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
4242 ++child_idx;
4243
4244 child_indexes.push_back (child_idx);
4245 return child_indexes.size();
4246 }
4247 }
4248
4249 if (superclass_interface_decl)
4250 {
4251 // The super class index is always zero for ObjC classes,
4252 // so we push it onto the child indexes in case we find
4253 // an ivar in our superclass...
4254 child_indexes.push_back (0);
4255
Greg Clayton6beaaa62011-01-17 03:46:26 +00004256 if (GetIndexOfChildMemberWithName (ast,
4257 ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00004258 name,
4259 omit_empty_base_classes,
4260 child_indexes))
4261 {
4262 // We did find an ivar in a superclass so just
4263 // return the results!
4264 return child_indexes.size();
4265 }
4266
4267 // We didn't find an ivar matching "name" in our
4268 // superclass, pop the superclass zero index that
4269 // we pushed on above.
4270 child_indexes.pop_back();
4271 }
4272 }
4273 }
4274 }
4275 break;
4276
4277 case clang::Type::ObjCObjectPointer:
4278 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004279 return GetIndexOfChildMemberWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00004280 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
4281 name,
4282 omit_empty_base_classes,
4283 child_indexes);
4284 }
4285 break;
4286
4287
Greg Claytone1a916a2010-07-21 22:12:05 +00004288 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004289 {
4290// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4291// const uint64_t element_count = array->getSize().getLimitedValue();
4292//
4293// if (idx < element_count)
4294// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004295// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004296//
4297// char element_name[32];
4298// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
4299//
4300// child_name.assign(element_name);
4301// assert(field_type_info.first % 8 == 0);
4302// child_byte_size = field_type_info.first / 8;
4303// child_byte_offset = idx * child_byte_size;
4304// return array->getElementType().getAsOpaquePtr();
4305// }
4306 }
4307 break;
4308
Greg Claytone1a916a2010-07-21 22:12:05 +00004309// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004310// {
4311// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
4312// QualType pointee_type = mem_ptr_type->getPointeeType();
4313//
4314// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4315// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004316// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004317// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
4318// name);
4319// }
4320// }
4321// break;
4322//
Greg Claytone1a916a2010-07-21 22:12:05 +00004323 case clang::Type::LValueReference:
4324 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004325 {
Sean Callanan78e37602011-01-27 04:42:51 +00004326 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004327 QualType pointee_type = reference_type->getPointeeType();
4328
4329 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4330 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004331 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004332 reference_type->getPointeeType().getAsOpaquePtr(),
4333 name,
4334 omit_empty_base_classes,
4335 child_indexes);
4336 }
4337 }
4338 break;
4339
Greg Claytone1a916a2010-07-21 22:12:05 +00004340 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004341 {
Sean Callanan78e37602011-01-27 04:42:51 +00004342 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004343 QualType pointee_type = pointer_type->getPointeeType();
4344
4345 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4346 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004347 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004348 pointer_type->getPointeeType().getAsOpaquePtr(),
4349 name,
4350 omit_empty_base_classes,
4351 child_indexes);
4352 }
4353 else
4354 {
4355// if (parent_name)
4356// {
4357// child_name.assign(1, '*');
4358// child_name += parent_name;
4359// }
4360//
4361// // We have a pointer to an simple type
4362// if (idx == 0)
4363// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004364// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004365// assert(clang_type_info.first % 8 == 0);
4366// child_byte_size = clang_type_info.first / 8;
4367// child_byte_offset = 0;
4368// return pointee_type.getAsOpaquePtr();
4369// }
4370 }
4371 }
4372 break;
4373
Greg Claytone1a916a2010-07-21 22:12:05 +00004374 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00004375 return GetIndexOfChildMemberWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00004376 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004377 name,
4378 omit_empty_base_classes,
4379 child_indexes);
4380
4381 default:
4382 break;
4383 }
4384 }
4385 return 0;
4386}
4387
4388
4389// Get the index of the child of "clang_type" whose name matches. This function
4390// doesn't descend into the children, but only looks one level deep and name
4391// matches can include base class names.
4392
4393uint32_t
4394ClangASTContext::GetIndexOfChildWithName
4395(
Greg Clayton6beaaa62011-01-17 03:46:26 +00004396 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00004397 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004398 const char *name,
4399 bool omit_empty_base_classes
4400)
4401{
4402 if (clang_type && name && name[0])
4403 {
4404 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00004405
Greg Clayton737b9322010-09-13 03:32:57 +00004406 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
Greg Clayton9e409562010-07-28 02:04:09 +00004407
Greg Clayton737b9322010-09-13 03:32:57 +00004408 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004409 {
Greg Claytone1a916a2010-07-21 22:12:05 +00004410 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00004411 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004412 {
4413 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4414 const RecordDecl *record_decl = record_type->getDecl();
4415
4416 assert(record_decl);
4417 uint32_t child_idx = 0;
4418
4419 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4420
4421 if (cxx_record_decl)
4422 {
4423 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4424 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4425 base_class != base_class_end;
4426 ++base_class)
4427 {
4428 // Skip empty base classes
4429 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4430 if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
4431 continue;
4432
Greg Claytone3055942011-06-30 02:28:26 +00004433 std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType()));
4434 if (base_class_type_name.compare (name) == 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004435 return child_idx;
4436 ++child_idx;
4437 }
4438 }
4439
4440 // Try and find a field that matches NAME
4441 RecordDecl::field_iterator field, field_end;
4442 StringRef name_sref(name);
4443 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4444 field != field_end;
4445 ++field, ++child_idx)
4446 {
4447 if (field->getName().equals (name_sref))
4448 return child_idx;
4449 }
4450
4451 }
4452 break;
4453
Greg Clayton9e409562010-07-28 02:04:09 +00004454 case clang::Type::ObjCObject:
4455 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00004456 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00004457 {
4458 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00004459 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00004460 assert (objc_class_type);
4461 if (objc_class_type)
4462 {
4463 uint32_t child_idx = 0;
4464 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4465
4466 if (class_interface_decl)
4467 {
4468 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4469 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4470
4471 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
4472 {
4473 const ObjCIvarDecl* ivar_decl = *ivar_pos;
4474
4475 if (ivar_decl->getName().equals (name_sref))
4476 {
4477 if ((!omit_empty_base_classes && superclass_interface_decl) ||
4478 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
4479 ++child_idx;
4480
4481 return child_idx;
4482 }
4483 }
4484
4485 if (superclass_interface_decl)
4486 {
4487 if (superclass_interface_decl->getName().equals (name_sref))
4488 return 0;
4489 }
4490 }
4491 }
4492 }
4493 break;
4494
4495 case clang::Type::ObjCObjectPointer:
4496 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004497 return GetIndexOfChildWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00004498 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
4499 name,
4500 omit_empty_base_classes);
4501 }
4502 break;
4503
Greg Claytone1a916a2010-07-21 22:12:05 +00004504 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004505 {
4506// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4507// const uint64_t element_count = array->getSize().getLimitedValue();
4508//
4509// if (idx < element_count)
4510// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004511// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004512//
4513// char element_name[32];
4514// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
4515//
4516// child_name.assign(element_name);
4517// assert(field_type_info.first % 8 == 0);
4518// child_byte_size = field_type_info.first / 8;
4519// child_byte_offset = idx * child_byte_size;
4520// return array->getElementType().getAsOpaquePtr();
4521// }
4522 }
4523 break;
4524
Greg Claytone1a916a2010-07-21 22:12:05 +00004525// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004526// {
4527// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
4528// QualType pointee_type = mem_ptr_type->getPointeeType();
4529//
4530// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4531// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004532// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004533// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
4534// name);
4535// }
4536// }
4537// break;
4538//
Greg Claytone1a916a2010-07-21 22:12:05 +00004539 case clang::Type::LValueReference:
4540 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004541 {
Sean Callanan78e37602011-01-27 04:42:51 +00004542 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004543 QualType pointee_type = reference_type->getPointeeType();
4544
4545 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4546 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004547 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004548 reference_type->getPointeeType().getAsOpaquePtr(),
4549 name,
4550 omit_empty_base_classes);
4551 }
4552 }
4553 break;
4554
Greg Claytone1a916a2010-07-21 22:12:05 +00004555 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004556 {
Sean Callanan78e37602011-01-27 04:42:51 +00004557 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004558 QualType pointee_type = pointer_type->getPointeeType();
4559
4560 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4561 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004562 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004563 pointer_type->getPointeeType().getAsOpaquePtr(),
4564 name,
4565 omit_empty_base_classes);
4566 }
4567 else
4568 {
4569// if (parent_name)
4570// {
4571// child_name.assign(1, '*');
4572// child_name += parent_name;
4573// }
4574//
4575// // We have a pointer to an simple type
4576// if (idx == 0)
4577// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004578// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004579// assert(clang_type_info.first % 8 == 0);
4580// child_byte_size = clang_type_info.first / 8;
4581// child_byte_offset = 0;
4582// return pointee_type.getAsOpaquePtr();
4583// }
4584 }
4585 }
4586 break;
4587
Greg Claytone1a916a2010-07-21 22:12:05 +00004588 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00004589 return GetIndexOfChildWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00004590 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004591 name,
4592 omit_empty_base_classes);
4593
4594 default:
4595 break;
4596 }
4597 }
4598 return UINT32_MAX;
4599}
4600
4601#pragma mark TagType
4602
4603bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004604ClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004605{
4606 if (tag_clang_type)
4607 {
4608 QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00004609 const clang::Type *clang_type = tag_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004610 if (clang_type)
4611 {
Sean Callanan78e37602011-01-27 04:42:51 +00004612 const TagType *tag_type = dyn_cast<TagType>(clang_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004613 if (tag_type)
4614 {
4615 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
4616 if (tag_decl)
4617 {
4618 tag_decl->setTagKind ((TagDecl::TagKind)kind);
4619 return true;
4620 }
4621 }
4622 }
4623 }
4624 return false;
4625}
4626
4627
4628#pragma mark DeclContext Functions
4629
4630DeclContext *
Greg Clayton1be10fc2010-09-29 01:12:09 +00004631ClangASTContext::GetDeclContextForType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004632{
4633 if (clang_type == NULL)
4634 return NULL;
4635
4636 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00004637 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4638 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004639 {
Sean Callanancc427fa2011-07-30 02:42:06 +00004640 case clang::Type::UnaryTransform: break;
Greg Clayton9e409562010-07-28 02:04:09 +00004641 case clang::Type::FunctionNoProto: break;
4642 case clang::Type::FunctionProto: break;
4643 case clang::Type::IncompleteArray: break;
4644 case clang::Type::VariableArray: break;
4645 case clang::Type::ConstantArray: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004646 case clang::Type::DependentSizedArray: break;
Greg Clayton9e409562010-07-28 02:04:09 +00004647 case clang::Type::ExtVector: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004648 case clang::Type::DependentSizedExtVector: break;
Greg Clayton9e409562010-07-28 02:04:09 +00004649 case clang::Type::Vector: break;
4650 case clang::Type::Builtin: break;
4651 case clang::Type::BlockPointer: break;
4652 case clang::Type::Pointer: break;
4653 case clang::Type::LValueReference: break;
4654 case clang::Type::RValueReference: break;
4655 case clang::Type::MemberPointer: break;
4656 case clang::Type::Complex: break;
4657 case clang::Type::ObjCObject: break;
4658 case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
4659 case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
4660 case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl();
4661 case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl();
Sean Callanan48114472010-12-13 01:26:27 +00004662 case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00004663 case clang::Type::Elaborated: return ClangASTContext::GetDeclContextForType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00004664 case clang::Type::TypeOfExpr: break;
4665 case clang::Type::TypeOf: break;
4666 case clang::Type::Decltype: break;
4667 //case clang::Type::QualifiedName: break;
4668 case clang::Type::TemplateSpecialization: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004669 case clang::Type::DependentTemplateSpecialization: break;
4670 case clang::Type::TemplateTypeParm: break;
4671 case clang::Type::SubstTemplateTypeParm: break;
4672 case clang::Type::SubstTemplateTypeParmPack:break;
4673 case clang::Type::PackExpansion: break;
4674 case clang::Type::UnresolvedUsing: break;
4675 case clang::Type::Paren: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004676 case clang::Type::Attributed: break;
4677 case clang::Type::Auto: break;
4678 case clang::Type::InjectedClassName: break;
4679 case clang::Type::DependentName: break;
Greg Claytonea3e7d52011-10-08 00:49:15 +00004680 case clang::Type::Atomic: break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004681 }
4682 // No DeclContext in this type...
4683 return NULL;
4684}
4685
4686#pragma mark Namespace Declarations
4687
4688NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00004689ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004690{
Greg Clayton030a2042011-10-14 21:34:45 +00004691 NamespaceDecl *namespace_decl = NULL;
Greg Clayton9d3d6882011-10-31 23:51:19 +00004692 ASTContext *ast = getASTContext();
4693 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
4694 if (decl_ctx == NULL)
4695 decl_ctx = translation_unit_decl;
4696
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004697 if (name)
4698 {
Greg Clayton030a2042011-10-14 21:34:45 +00004699 IdentifierInfo &identifier_info = ast->Idents.get(name);
4700 DeclarationName decl_name (&identifier_info);
4701 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
4702 for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos)
4703 {
4704 namespace_decl = dyn_cast<clang::NamespaceDecl>(*pos);
4705 if (namespace_decl)
4706 return namespace_decl;
4707 }
4708
4709 namespace_decl = NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), &identifier_info);
4710
Greg Clayton9d3d6882011-10-31 23:51:19 +00004711 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004712 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00004713 else
4714 {
4715 if (decl_ctx == translation_unit_decl)
4716 {
4717 namespace_decl = translation_unit_decl->getAnonymousNamespace();
4718 if (namespace_decl)
4719 return namespace_decl;
4720
4721 namespace_decl = NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), NULL);
4722 translation_unit_decl->setAnonymousNamespace (namespace_decl);
4723 translation_unit_decl->addDecl (namespace_decl);
4724 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
4725 }
4726 else
4727 {
4728 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
4729 if (parent_namespace_decl)
4730 {
4731 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
4732 if (namespace_decl)
4733 return namespace_decl;
4734 namespace_decl = NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), NULL);
4735 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
4736 parent_namespace_decl->addDecl (namespace_decl);
4737 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
4738 }
4739 else
4740 {
4741 // BAD!!!
4742 }
4743 }
4744
4745
4746 if (namespace_decl)
4747 {
4748 // If we make it here, we are creating the anonymous namespace decl
4749 // for the first time, so we need to do the using directive magic
4750 // like SEMA does
4751 UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast,
4752 decl_ctx,
4753 SourceLocation(),
4754 SourceLocation(),
4755 NestedNameSpecifierLoc(),
4756 SourceLocation(),
4757 namespace_decl,
4758 decl_ctx);
4759 using_directive_decl->setImplicit();
4760 decl_ctx->addDecl(using_directive_decl);
4761 }
4762 }
4763#ifdef LLDB_CONFIGURATION_DEBUG
4764 VerifyDecl(namespace_decl);
4765#endif
Greg Clayton030a2042011-10-14 21:34:45 +00004766 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004767}
4768
4769
4770#pragma mark Function Types
4771
4772FunctionDecl *
Greg Clayton147e1fa2011-10-14 22:47:18 +00004773ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx, const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004774{
Greg Clayton147e1fa2011-10-14 22:47:18 +00004775 FunctionDecl *func_decl = NULL;
4776 ASTContext *ast = getASTContext();
4777 if (decl_ctx == NULL)
4778 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004779
Greg Clayton147e1fa2011-10-14 22:47:18 +00004780 if (name && name[0])
4781 {
4782 func_decl = FunctionDecl::Create (*ast,
4783 decl_ctx,
4784 SourceLocation(),
4785 SourceLocation(),
4786 DeclarationName (&ast->Idents.get(name)),
4787 QualType::getFromOpaquePtr(function_clang_type),
4788 NULL,
4789 (FunctionDecl::StorageClass)storage,
4790 (FunctionDecl::StorageClass)storage,
4791 is_inline);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004792 }
Greg Clayton147e1fa2011-10-14 22:47:18 +00004793 else
4794 {
4795 func_decl = FunctionDecl::Create (*ast,
4796 decl_ctx,
4797 SourceLocation(),
4798 SourceLocation(),
4799 DeclarationName (),
4800 QualType::getFromOpaquePtr(function_clang_type),
4801 NULL,
4802 (FunctionDecl::StorageClass)storage,
4803 (FunctionDecl::StorageClass)storage,
4804 is_inline);
4805 }
4806 if (func_decl)
4807 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00004808
4809#ifdef LLDB_CONFIGURATION_DEBUG
4810 VerifyDecl(func_decl);
4811#endif
4812
Greg Clayton147e1fa2011-10-14 22:47:18 +00004813 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004814}
4815
Greg Clayton1be10fc2010-09-29 01:12:09 +00004816clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00004817ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00004818 clang_type_t result_type,
4819 clang_type_t *args,
Sean Callananc81256a2010-09-16 20:40:25 +00004820 unsigned num_args,
4821 bool is_variadic,
4822 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004823{
Greg Clayton6beaaa62011-01-17 03:46:26 +00004824 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004825 std::vector<QualType> qual_type_args;
4826 for (unsigned i=0; i<num_args; ++i)
4827 qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
4828
4829 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00004830 FunctionProtoType::ExtProtoInfo proto_info;
4831 proto_info.Variadic = is_variadic;
Sean Callananfb0b7582011-03-15 00:17:19 +00004832 proto_info.ExceptionSpecType = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00004833 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00004834 proto_info.RefQualifier = RQ_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00004835 proto_info.NumExceptions = 0;
4836 proto_info.Exceptions = NULL;
4837
Greg Clayton147e1fa2011-10-14 22:47:18 +00004838 return ast->getFunctionType (QualType::getFromOpaquePtr(result_type),
4839 qual_type_args.empty() ? NULL : &qual_type_args.front(),
4840 qual_type_args.size(),
4841 proto_info).getAsOpaquePtr(); // NoReturn);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004842}
4843
4844ParmVarDecl *
Greg Clayton1be10fc2010-09-29 01:12:09 +00004845ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004846{
Greg Clayton6beaaa62011-01-17 03:46:26 +00004847 ASTContext *ast = getASTContext();
4848 assert (ast != NULL);
4849 return ParmVarDecl::Create(*ast,
4850 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004851 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00004852 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00004853 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callananc81256a2010-09-16 20:40:25 +00004854 QualType::getFromOpaquePtr(param_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004855 NULL,
4856 (VarDecl::StorageClass)storage,
4857 (VarDecl::StorageClass)storage,
4858 0);
4859}
4860
4861void
4862ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
4863{
4864 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00004865 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004866}
4867
4868
4869#pragma mark Array Types
4870
Greg Clayton1be10fc2010-09-29 01:12:09 +00004871clang_type_t
4872ClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004873{
4874 if (element_type)
4875 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004876 ASTContext *ast = getASTContext();
4877 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004878 llvm::APInt ap_element_count (64, element_count);
Greg Clayton6beaaa62011-01-17 03:46:26 +00004879 return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004880 ap_element_count,
4881 ArrayType::Normal,
4882 0).getAsOpaquePtr(); // ElemQuals
4883 }
4884 return NULL;
4885}
4886
4887
4888#pragma mark TagDecl
4889
4890bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004891ClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004892{
4893 if (clang_type)
4894 {
4895 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00004896 const clang::Type *t = qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004897 if (t)
4898 {
Sean Callanan78e37602011-01-27 04:42:51 +00004899 const TagType *tag_type = dyn_cast<TagType>(t);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004900 if (tag_type)
4901 {
4902 TagDecl *tag_decl = tag_type->getDecl();
4903 if (tag_decl)
4904 {
4905 tag_decl->startDefinition();
4906 return true;
4907 }
4908 }
4909 }
4910 }
4911 return false;
4912}
4913
4914bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004915ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004916{
4917 if (clang_type)
4918 {
4919 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton14372242010-09-29 03:44:17 +00004920
4921 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4922
4923 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004924 {
Greg Clayton14372242010-09-29 03:44:17 +00004925 cxx_record_decl->completeDefinition();
4926
4927 return true;
4928 }
4929
Sean Callanan78e37602011-01-27 04:42:51 +00004930 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
Sean Callanana2424172010-10-25 00:29:48 +00004931
4932 if (objc_class_type)
4933 {
4934 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4935
Sean Callanand5c17ed2011-11-15 02:11:17 +00004936 class_interface_decl->completedForwardDecl();
Sean Callanana2424172010-10-25 00:29:48 +00004937 }
4938
Greg Clayton14372242010-09-29 03:44:17 +00004939 const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
4940
4941 if (enum_type)
4942 {
4943 EnumDecl *enum_decl = enum_type->getDecl();
4944
4945 if (enum_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004946 {
Greg Clayton14372242010-09-29 03:44:17 +00004947 /// TODO This really needs to be fixed.
4948
4949 unsigned NumPositiveBits = 1;
4950 unsigned NumNegativeBits = 0;
4951
Greg Clayton6beaaa62011-01-17 03:46:26 +00004952 ASTContext *ast = getASTContext();
Greg Claytone02b8502010-10-12 04:29:14 +00004953
4954 QualType promotion_qual_type;
4955 // If the enum integer type is less than an integer in bit width,
4956 // then we must promote it to an integer size.
Greg Clayton6beaaa62011-01-17 03:46:26 +00004957 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
Greg Claytone02b8502010-10-12 04:29:14 +00004958 {
4959 if (enum_decl->getIntegerType()->isSignedIntegerType())
Greg Clayton6beaaa62011-01-17 03:46:26 +00004960 promotion_qual_type = ast->IntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00004961 else
Greg Clayton6beaaa62011-01-17 03:46:26 +00004962 promotion_qual_type = ast->UnsignedIntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00004963 }
4964 else
4965 promotion_qual_type = enum_decl->getIntegerType();
4966
4967 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Clayton14372242010-09-29 03:44:17 +00004968 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004969 }
4970 }
4971 }
4972 return false;
4973}
4974
4975
4976#pragma mark Enumeration Types
4977
Greg Clayton1be10fc2010-09-29 01:12:09 +00004978clang_type_t
Greg Claytonca512b32011-01-14 04:54:56 +00004979ClangASTContext::CreateEnumerationType
4980(
4981 const char *name,
4982 DeclContext *decl_ctx,
4983 const Declaration &decl,
4984 clang_type_t integer_qual_type
4985)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004986{
4987 // TODO: Do something intelligent with the Declaration object passed in
4988 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00004989 ASTContext *ast = getASTContext();
4990 assert (ast != NULL);
Greg Claytone02b8502010-10-12 04:29:14 +00004991
4992 // TODO: ask about these...
4993// const bool IsScoped = false;
4994// const bool IsFixed = false;
4995
Greg Clayton6beaaa62011-01-17 03:46:26 +00004996 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00004997 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00004998 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00004999 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00005000 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callanan48114472010-12-13 01:26:27 +00005001 NULL,
5002 false, // IsScoped
5003 false, // IsScopedUsingClassTag
5004 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00005005
5006
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005007 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00005008 {
5009 // TODO: check if we should be setting the promotion type too?
5010 enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00005011
5012 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
5013
Greg Clayton6beaaa62011-01-17 03:46:26 +00005014 return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
Greg Clayton83ff3892010-09-12 23:17:56 +00005015 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005016 return NULL;
5017}
5018
Greg Clayton1be10fc2010-09-29 01:12:09 +00005019clang_type_t
5020ClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
5021{
5022 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
5023
Sean Callanan78e37602011-01-27 04:42:51 +00005024 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Greg Clayton1be10fc2010-09-29 01:12:09 +00005025 if (clang_type)
5026 {
5027 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5028 if (enum_type)
5029 {
5030 EnumDecl *enum_decl = enum_type->getDecl();
5031 if (enum_decl)
5032 return enum_decl->getIntegerType().getAsOpaquePtr();
5033 }
5034 }
5035 return NULL;
5036}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005037bool
5038ClangASTContext::AddEnumerationValueToEnumerationType
5039(
Greg Clayton1be10fc2010-09-29 01:12:09 +00005040 clang_type_t enum_clang_type,
5041 clang_type_t enumerator_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005042 const Declaration &decl,
5043 const char *name,
5044 int64_t enum_value,
5045 uint32_t enum_value_bit_size
5046)
5047{
5048 if (enum_clang_type && enumerator_clang_type && name)
5049 {
5050 // TODO: Do something intelligent with the Declaration object passed in
5051 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00005052 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005053 IdentifierTable *identifier_table = getIdentifierTable();
5054
Greg Clayton6beaaa62011-01-17 03:46:26 +00005055 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005056 assert (identifier_table != NULL);
5057 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
5058
Sean Callanan78e37602011-01-27 04:42:51 +00005059 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005060 if (clang_type)
5061 {
5062 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5063
5064 if (enum_type)
5065 {
5066 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
5067 enum_llvm_apsint = enum_value;
5068 EnumConstantDecl *enumerator_decl =
Greg Clayton6beaaa62011-01-17 03:46:26 +00005069 EnumConstantDecl::Create (*ast,
5070 enum_type->getDecl(),
5071 SourceLocation(),
5072 name ? &identifier_table->get(name) : NULL, // Identifier
5073 QualType::getFromOpaquePtr(enumerator_clang_type),
5074 NULL,
5075 enum_llvm_apsint);
5076
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005077 if (enumerator_decl)
5078 {
5079 enum_type->getDecl()->addDecl(enumerator_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00005080
5081#ifdef LLDB_CONFIGURATION_DEBUG
5082 VerifyDecl(enumerator_decl);
5083#endif
5084
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005085 return true;
5086 }
5087 }
5088 }
5089 }
5090 return false;
5091}
5092
5093#pragma mark Pointers & References
5094
Greg Clayton1be10fc2010-09-29 01:12:09 +00005095clang_type_t
5096ClangASTContext::CreatePointerType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005097{
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00005098 return CreatePointerType (getASTContext(), clang_type);
5099}
5100
5101clang_type_t
5102ClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
5103{
5104 if (ast && clang_type)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005105 {
5106 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5107
Greg Clayton737b9322010-09-13 03:32:57 +00005108 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5109 switch (type_class)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005110 {
5111 case clang::Type::ObjCObject:
5112 case clang::Type::ObjCInterface:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00005113 return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005114
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005115 default:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00005116 return ast->getPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005117 }
5118 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005119 return NULL;
5120}
5121
Greg Clayton1be10fc2010-09-29 01:12:09 +00005122clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00005123ClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
5124 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005125{
5126 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00005127 return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005128 return NULL;
5129}
5130
Greg Clayton1be10fc2010-09-29 01:12:09 +00005131clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00005132ClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
5133 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005134{
5135 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00005136 return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005137 return NULL;
5138}
5139
Greg Clayton1be10fc2010-09-29 01:12:09 +00005140clang_type_t
5141ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
Greg Clayton9b81a312010-06-12 01:20:30 +00005142{
5143 if (clang_pointee_type && clang_pointee_type)
5144 return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
5145 QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
5146 return NULL;
5147}
5148
Greg Clayton1a65ae12011-01-25 23:55:37 +00005149uint32_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005150ClangASTContext::GetPointerBitSize ()
5151{
Greg Clayton6beaaa62011-01-17 03:46:26 +00005152 ASTContext *ast = getASTContext();
5153 return ast->getTypeSize(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005154}
5155
5156bool
Greg Claytondea8cb42011-06-29 22:09:02 +00005157ClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
5158{
5159 QualType pointee_qual_type;
5160 if (clang_type)
5161 {
5162 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5163 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5164 bool success = false;
5165 switch (type_class)
5166 {
5167 case clang::Type::Builtin:
5168 if (cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
5169 {
5170 if (dynamic_pointee_type)
5171 *dynamic_pointee_type = clang_type;
5172 return true;
5173 }
5174 break;
5175
5176 case clang::Type::ObjCObjectPointer:
5177 if (dynamic_pointee_type)
5178 *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5179 return true;
5180
5181 case clang::Type::Pointer:
5182 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
5183 success = true;
5184 break;
5185
5186 case clang::Type::LValueReference:
5187 case clang::Type::RValueReference:
5188 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
5189 success = true;
5190 break;
5191
5192 case clang::Type::Typedef:
Greg Claytonaffb03b2011-07-08 18:27:39 +00005193 return ClangASTContext::IsPossibleDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
Sean Callanan912855f2011-08-11 23:56:13 +00005194
5195 case clang::Type::Elaborated:
5196 return ClangASTContext::IsPossibleDynamicType (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), dynamic_pointee_type);
5197
Greg Claytondea8cb42011-06-29 22:09:02 +00005198 default:
5199 break;
5200 }
5201
5202 if (success)
5203 {
5204 // Check to make sure what we are pointing too is a possible dynamic C++ type
5205 // We currently accept any "void *" (in case we have a class that has been
5206 // watered down to an opaque pointer) and virtual C++ classes.
5207 const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
5208 switch (pointee_type_class)
5209 {
5210 case clang::Type::Builtin:
5211 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
5212 {
5213 case clang::BuiltinType::UnknownAny:
5214 case clang::BuiltinType::Void:
5215 if (dynamic_pointee_type)
5216 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5217 return true;
5218
5219 case clang::BuiltinType::NullPtr:
5220 case clang::BuiltinType::Bool:
5221 case clang::BuiltinType::Char_U:
5222 case clang::BuiltinType::UChar:
5223 case clang::BuiltinType::WChar_U:
5224 case clang::BuiltinType::Char16:
5225 case clang::BuiltinType::Char32:
5226 case clang::BuiltinType::UShort:
5227 case clang::BuiltinType::UInt:
5228 case clang::BuiltinType::ULong:
5229 case clang::BuiltinType::ULongLong:
5230 case clang::BuiltinType::UInt128:
5231 case clang::BuiltinType::Char_S:
5232 case clang::BuiltinType::SChar:
5233 case clang::BuiltinType::WChar_S:
5234 case clang::BuiltinType::Short:
5235 case clang::BuiltinType::Int:
5236 case clang::BuiltinType::Long:
5237 case clang::BuiltinType::LongLong:
5238 case clang::BuiltinType::Int128:
5239 case clang::BuiltinType::Float:
5240 case clang::BuiltinType::Double:
5241 case clang::BuiltinType::LongDouble:
5242 case clang::BuiltinType::Dependent:
5243 case clang::BuiltinType::Overload:
5244 case clang::BuiltinType::ObjCId:
5245 case clang::BuiltinType::ObjCClass:
5246 case clang::BuiltinType::ObjCSel:
5247 case clang::BuiltinType::BoundMember:
Greg Claytonf0705c82011-10-22 03:33:13 +00005248 case clang::BuiltinType::Half:
5249 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytoned3ae702011-11-09 19:04:58 +00005250 case clang::BuiltinType::PseudoObject:
Greg Claytondea8cb42011-06-29 22:09:02 +00005251 break;
5252 }
5253 break;
5254
5255 case clang::Type::Record:
5256 {
5257 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
5258 if (cxx_record_decl)
5259 {
5260 if (GetCompleteQualType (ast, pointee_qual_type))
5261 {
5262 success = cxx_record_decl->isDynamicClass();
5263 }
5264 else
5265 {
5266 // We failed to get the complete type, so we have to
5267 // treat this as a void * which we might possibly be
5268 // able to complete
5269 success = true;
5270 }
5271 if (success)
5272 {
5273 if (dynamic_pointee_type)
5274 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5275 return true;
5276 }
5277 }
5278 }
5279 break;
5280
5281 case clang::Type::ObjCObject:
5282 case clang::Type::ObjCInterface:
5283 {
5284 const clang::ObjCObjectType *objc_class_type = pointee_qual_type->getAsObjCQualifiedInterfaceType();
5285 if (objc_class_type)
5286 {
5287 GetCompleteQualType (ast, pointee_qual_type);
5288 if (dynamic_pointee_type)
5289 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5290 return true;
5291 }
5292 }
5293 break;
5294
5295 default:
5296 break;
5297 }
5298 }
5299 }
5300 if (dynamic_pointee_type)
5301 *dynamic_pointee_type = NULL;
5302 return false;
5303}
5304
5305
5306bool
Greg Clayton007d5be2011-05-30 00:49:24 +00005307ClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
5308{
5309 QualType pointee_qual_type;
5310 if (clang_type)
5311 {
5312 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5313 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5314 bool success = false;
5315 switch (type_class)
5316 {
5317 case clang::Type::Pointer:
5318 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
5319 success = true;
5320 break;
5321
5322 case clang::Type::LValueReference:
5323 case clang::Type::RValueReference:
5324 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
5325 success = true;
5326 break;
5327
5328 case clang::Type::Typedef:
5329 return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
5330
Sean Callanan912855f2011-08-11 23:56:13 +00005331 case clang::Type::Elaborated:
5332 return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5333
Greg Clayton007d5be2011-05-30 00:49:24 +00005334 default:
5335 break;
5336 }
5337
5338 if (success)
5339 {
5340 // Check to make sure what we are pointing too is a possible dynamic C++ type
5341 // We currently accept any "void *" (in case we have a class that has been
5342 // watered down to an opaque pointer) and virtual C++ classes.
5343 const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
5344 switch (pointee_type_class)
5345 {
5346 case clang::Type::Builtin:
5347 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
5348 {
5349 case clang::BuiltinType::UnknownAny:
5350 case clang::BuiltinType::Void:
5351 if (dynamic_pointee_type)
5352 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5353 return true;
5354
5355 case clang::BuiltinType::NullPtr:
5356 case clang::BuiltinType::Bool:
5357 case clang::BuiltinType::Char_U:
5358 case clang::BuiltinType::UChar:
5359 case clang::BuiltinType::WChar_U:
5360 case clang::BuiltinType::Char16:
5361 case clang::BuiltinType::Char32:
5362 case clang::BuiltinType::UShort:
5363 case clang::BuiltinType::UInt:
5364 case clang::BuiltinType::ULong:
5365 case clang::BuiltinType::ULongLong:
5366 case clang::BuiltinType::UInt128:
5367 case clang::BuiltinType::Char_S:
5368 case clang::BuiltinType::SChar:
5369 case clang::BuiltinType::WChar_S:
5370 case clang::BuiltinType::Short:
5371 case clang::BuiltinType::Int:
5372 case clang::BuiltinType::Long:
5373 case clang::BuiltinType::LongLong:
5374 case clang::BuiltinType::Int128:
5375 case clang::BuiltinType::Float:
5376 case clang::BuiltinType::Double:
5377 case clang::BuiltinType::LongDouble:
5378 case clang::BuiltinType::Dependent:
5379 case clang::BuiltinType::Overload:
5380 case clang::BuiltinType::ObjCId:
5381 case clang::BuiltinType::ObjCClass:
5382 case clang::BuiltinType::ObjCSel:
5383 case clang::BuiltinType::BoundMember:
Greg Claytonf0705c82011-10-22 03:33:13 +00005384 case clang::BuiltinType::Half:
5385 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytoned3ae702011-11-09 19:04:58 +00005386 case clang::BuiltinType::PseudoObject:
Greg Clayton007d5be2011-05-30 00:49:24 +00005387 break;
5388 }
5389 break;
5390 case clang::Type::Record:
5391 {
5392 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
5393 if (cxx_record_decl)
5394 {
5395 if (GetCompleteQualType (ast, pointee_qual_type))
5396 {
Greg Claytona13ad2ad2011-06-02 01:26:44 +00005397 success = cxx_record_decl->isDynamicClass();
Greg Clayton007d5be2011-05-30 00:49:24 +00005398 }
5399 else
5400 {
5401 // We failed to get the complete type, so we have to
5402 // treat this as a void * which we might possibly be
5403 // able to complete
5404 success = true;
5405 }
5406 if (success)
5407 {
5408 if (dynamic_pointee_type)
5409 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5410 return true;
5411 }
5412 }
5413 }
5414 break;
5415
5416 default:
5417 break;
5418 }
5419 }
5420 }
5421 if (dynamic_pointee_type)
5422 *dynamic_pointee_type = NULL;
5423 return false;
5424}
5425
Sean Callanan98298012011-10-27 19:41:13 +00005426bool
5427ClangASTContext::IsReferenceType (clang_type_t clang_type, clang_type_t *target_type)
5428{
5429 if (clang_type == NULL)
5430 return false;
5431
5432 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5433 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5434
5435 switch (type_class)
5436 {
5437 case clang::Type::LValueReference:
5438 if (target_type)
5439 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5440 return true;
5441 case clang::Type::RValueReference:
5442 if (target_type)
5443 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5444 return true;
5445 case clang::Type::Typedef:
5446 return ClangASTContext::IsReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5447 case clang::Type::Elaborated:
5448 return ClangASTContext::IsReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5449 default:
5450 break;
5451 }
5452
5453 return false;
5454}
Greg Clayton007d5be2011-05-30 00:49:24 +00005455
5456bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005457ClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005458{
5459 if (clang_type == NULL)
5460 return false;
5461
5462 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00005463 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5464 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005465 {
Sean Callanana2424172010-10-25 00:29:48 +00005466 case clang::Type::Builtin:
5467 switch (cast<clang::BuiltinType>(qual_type)->getKind())
5468 {
5469 default:
5470 break;
5471 case clang::BuiltinType::ObjCId:
5472 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00005473 return true;
5474 }
5475 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00005476 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005477 if (target_type)
5478 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5479 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005480 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005481 if (target_type)
5482 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5483 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005484 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005485 if (target_type)
5486 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5487 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005488 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005489 if (target_type)
5490 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5491 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005492 case clang::Type::LValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005493 if (target_type)
5494 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5495 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005496 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005497 if (target_type)
5498 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5499 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005500 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00005501 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00005502 case clang::Type::Elaborated:
5503 return ClangASTContext::IsPointerOrReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005504 default:
5505 break;
5506 }
5507 return false;
5508}
5509
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005510bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005511ClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005512{
5513 if (!clang_type)
5514 return false;
5515
5516 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5517 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
5518
5519 if (builtin_type)
5520 {
5521 if (builtin_type->isInteger())
Jim Inghamef651602011-12-22 19:12:40 +00005522 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005523 is_signed = builtin_type->isSignedInteger();
Jim Inghamef651602011-12-22 19:12:40 +00005524 return true;
5525 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005526 }
5527
5528 return false;
5529}
5530
5531bool
Greg Claytonaffb03b2011-07-08 18:27:39 +00005532ClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t *target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005533{
Greg Claytonaffb03b2011-07-08 18:27:39 +00005534 if (target_type)
5535 *target_type = NULL;
5536
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005537 if (clang_type)
5538 {
5539 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00005540 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5541 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005542 {
Sean Callanana2424172010-10-25 00:29:48 +00005543 case clang::Type::Builtin:
5544 switch (cast<clang::BuiltinType>(qual_type)->getKind())
5545 {
5546 default:
5547 break;
5548 case clang::BuiltinType::ObjCId:
5549 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00005550 return true;
5551 }
5552 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00005553 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005554 if (target_type)
5555 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5556 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005557 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005558 if (target_type)
5559 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5560 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005561 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005562 if (target_type)
5563 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5564 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005565 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005566 if (target_type)
5567 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5568 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005569 case clang::Type::Typedef:
Greg Claytonaffb03b2011-07-08 18:27:39 +00005570 return ClangASTContext::IsPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
Sean Callanan912855f2011-08-11 23:56:13 +00005571 case clang::Type::Elaborated:
5572 return ClangASTContext::IsPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), target_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005573 default:
5574 break;
5575 }
5576 }
5577 return false;
5578}
5579
5580bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005581ClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005582{
5583 if (clang_type)
5584 {
5585 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5586
5587 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
5588 {
5589 clang::BuiltinType::Kind kind = BT->getKind();
5590 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
5591 {
5592 count = 1;
5593 is_complex = false;
5594 return true;
5595 }
5596 }
5597 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
5598 {
5599 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
5600 {
5601 count = 2;
5602 is_complex = true;
5603 return true;
5604 }
5605 }
5606 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
5607 {
5608 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
5609 {
5610 count = VT->getNumElements();
5611 is_complex = false;
5612 return true;
5613 }
5614 }
5615 }
5616 return false;
5617}
5618
Enrico Granata9fc19442011-07-06 02:13:41 +00005619bool
5620ClangASTContext::IsScalarType (lldb::clang_type_t clang_type)
5621{
5622 bool is_signed;
5623 if (ClangASTContext::IsIntegerType(clang_type, is_signed))
5624 return true;
5625
5626 uint32_t count;
5627 bool is_complex;
5628 return ClangASTContext::IsFloatingPointType(clang_type, count, is_complex) && !is_complex;
5629}
5630
5631bool
5632ClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type)
5633{
5634 if (!IsPointerType(clang_type))
5635 return false;
5636
5637 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5638 lldb::clang_type_t pointee_type = qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr();
5639 return IsScalarType(pointee_type);
5640}
5641
5642bool
5643ClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type)
5644{
Sean Callanan0caa21c2012-01-19 23:54:24 +00005645 clang_type = GetAsArrayType(clang_type);
5646
5647 if (clang_type == 0)
Enrico Granata9fc19442011-07-06 02:13:41 +00005648 return false;
5649
5650 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5651 lldb::clang_type_t item_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
5652 return IsScalarType(item_type);
5653}
5654
Greg Clayton8f92f0a2010-10-14 22:52:14 +00005655
5656bool
5657ClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
5658{
5659 if (clang_type)
5660 {
5661 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5662
5663 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5664 if (cxx_record_decl)
5665 {
5666 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
5667 return true;
5668 }
5669 }
5670 class_name.clear();
5671 return false;
5672}
5673
5674
Greg Clayton0fffff52010-09-24 05:15:53 +00005675bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005676ClangASTContext::IsCXXClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00005677{
5678 if (clang_type)
5679 {
5680 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5681 if (qual_type->getAsCXXRecordDecl() != NULL)
5682 return true;
5683 }
5684 return false;
5685}
5686
Greg Clayton20568dd2011-10-13 23:13:20 +00005687bool
5688ClangASTContext::IsBeingDefined (lldb::clang_type_t clang_type)
5689{
5690 if (clang_type)
5691 {
5692 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5693 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type);
5694 if (tag_type)
5695 return tag_type->isBeingDefined();
5696 }
5697 return false;
5698}
5699
Greg Clayton0fffff52010-09-24 05:15:53 +00005700bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005701ClangASTContext::IsObjCClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00005702{
5703 if (clang_type)
5704 {
5705 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5706 if (qual_type->isObjCObjectOrInterfaceType())
5707 return true;
5708 }
5709 return false;
5710}
5711
5712
Greg Clayton73b472d2010-10-27 03:32:59 +00005713bool
5714ClangASTContext::IsCharType (clang_type_t clang_type)
5715{
5716 if (clang_type)
5717 return QualType::getFromOpaquePtr(clang_type)->isCharType();
5718 return false;
5719}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005720
5721bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005722ClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005723{
Greg Clayton73b472d2010-10-27 03:32:59 +00005724 clang_type_t pointee_or_element_clang_type = NULL;
5725 Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
5726
5727 if (pointee_or_element_clang_type == NULL)
5728 return false;
5729
5730 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005731 {
Greg Clayton73b472d2010-10-27 03:32:59 +00005732 QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
5733
5734 if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005735 {
Greg Clayton73b472d2010-10-27 03:32:59 +00005736 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5737 if (type_flags.Test (eTypeIsArray))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005738 {
Greg Clayton73b472d2010-10-27 03:32:59 +00005739 // We know the size of the array and it could be a C string
5740 // since it is an array of characters
5741 length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
5742 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005743 }
Greg Clayton73b472d2010-10-27 03:32:59 +00005744 else
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005745 {
Greg Clayton73b472d2010-10-27 03:32:59 +00005746 length = 0;
5747 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005748 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005749
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005750 }
5751 }
5752 return false;
5753}
5754
5755bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005756ClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
Greg Clayton737b9322010-09-13 03:32:57 +00005757{
5758 if (clang_type)
5759 {
5760 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5761
5762 if (qual_type->isFunctionPointerType())
5763 return true;
5764
5765 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5766 switch (type_class)
5767 {
Sean Callananfb0b7582011-03-15 00:17:19 +00005768 default:
5769 break;
Greg Clayton737b9322010-09-13 03:32:57 +00005770 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00005771 return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00005772 case clang::Type::Elaborated:
5773 return ClangASTContext::IsFunctionPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00005774
5775 case clang::Type::LValueReference:
5776 case clang::Type::RValueReference:
5777 {
Sean Callanan78e37602011-01-27 04:42:51 +00005778 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00005779 if (reference_type)
5780 return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
5781 }
5782 break;
5783 }
5784 }
5785 return false;
5786}
5787
Greg Clayton73b472d2010-10-27 03:32:59 +00005788size_t
5789ClangASTContext::GetArraySize (clang_type_t clang_type)
5790{
5791 if (clang_type)
5792 {
Greg Claytonef37d68a2011-07-09 17:12:27 +00005793 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
5794 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5795 switch (type_class)
5796 {
5797 case clang::Type::ConstantArray:
5798 {
5799 const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
5800 if (array)
5801 return array->getSize().getLimitedValue();
5802 }
5803 break;
5804
5805 case clang::Type::Typedef:
5806 return ClangASTContext::GetArraySize(cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00005807
5808 case clang::Type::Elaborated:
5809 return ClangASTContext::GetArraySize(cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Enrico Granataf9fa6ee2011-07-12 00:18:11 +00005810
5811 default:
5812 break;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005813 }
Greg Clayton73b472d2010-10-27 03:32:59 +00005814 }
5815 return 0;
5816}
Greg Clayton737b9322010-09-13 03:32:57 +00005817
Sean Callanan0caa21c2012-01-19 23:54:24 +00005818clang_type_t
5819ClangASTContext::GetAsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005820{
5821 if (!clang_type)
Sean Callanan0caa21c2012-01-19 23:54:24 +00005822 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005823
5824 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5825
Greg Clayton737b9322010-09-13 03:32:57 +00005826 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5827 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005828 {
Sean Callananfb0b7582011-03-15 00:17:19 +00005829 default:
5830 break;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005831
Greg Claytone1a916a2010-07-21 22:12:05 +00005832 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005833 if (member_type)
5834 *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
5835 if (size)
Greg Claytonac4827f2011-04-01 18:14:08 +00005836 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
Sean Callanan0caa21c2012-01-19 23:54:24 +00005837 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005838
Greg Claytone1a916a2010-07-21 22:12:05 +00005839 case clang::Type::IncompleteArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005840 if (member_type)
5841 *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
5842 if (size)
5843 *size = 0;
Sean Callanan0caa21c2012-01-19 23:54:24 +00005844 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005845
Greg Claytone1a916a2010-07-21 22:12:05 +00005846 case clang::Type::VariableArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005847 if (member_type)
5848 *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
5849 if (size)
5850 *size = 0;
Sean Callanan0caa21c2012-01-19 23:54:24 +00005851 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005852
Greg Claytone1a916a2010-07-21 22:12:05 +00005853 case clang::Type::DependentSizedArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005854 if (member_type)
5855 *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
5856 if (size)
5857 *size = 0;
Sean Callanan0caa21c2012-01-19 23:54:24 +00005858 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005859
5860 case clang::Type::Typedef:
Sean Callanan0caa21c2012-01-19 23:54:24 +00005861 return ClangASTContext::GetAsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
5862 member_type,
5863 size);
Sean Callanan912855f2011-08-11 23:56:13 +00005864
5865 case clang::Type::Elaborated:
Sean Callanan0caa21c2012-01-19 23:54:24 +00005866 return ClangASTContext::GetAsArrayType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
5867 member_type,
5868 size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005869 }
Sean Callanan0caa21c2012-01-19 23:54:24 +00005870 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005871}
5872
5873
5874#pragma mark Typedefs
5875
Greg Clayton1be10fc2010-09-29 01:12:09 +00005876clang_type_t
5877ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005878{
5879 if (clang_type)
5880 {
5881 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00005882 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005883 IdentifierTable *identifier_table = getIdentifierTable();
Greg Clayton6beaaa62011-01-17 03:46:26 +00005884 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005885 assert (identifier_table != NULL);
5886 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00005887 decl_ctx = ast->getTranslationUnitDecl();
5888 TypedefDecl *decl = TypedefDecl::Create (*ast,
5889 decl_ctx,
5890 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00005891 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00005892 name ? &identifier_table->get(name) : NULL, // Identifier
5893 ast->CreateTypeSourceInfo(qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00005894
Greg Clayton147e1fa2011-10-14 22:47:18 +00005895 //decl_ctx->addDecl (decl);
5896
Sean Callanan2652ad22011-01-18 01:03:44 +00005897 decl->setAccess(AS_public); // TODO respect proper access specifier
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005898
5899 // Get a uniqued QualType for the typedef decl type
Greg Clayton6beaaa62011-01-17 03:46:26 +00005900 return ast->getTypedefType (decl).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005901 }
5902 return NULL;
5903}
5904
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005905// Disable this for now since I can't seem to get a nicely formatted float
5906// out of the APFloat class without just getting the float, double or quad
5907// and then using a formatted print on it which defeats the purpose. We ideally
5908// would like to get perfect string values for any kind of float semantics
5909// so we can support remote targets. The code below also requires a patch to
5910// llvm::APInt.
5911//bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00005912//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 +00005913//{
5914// uint32_t count = 0;
5915// bool is_complex = false;
5916// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
5917// {
5918// unsigned num_bytes_per_float = byte_size / count;
5919// unsigned num_bits_per_float = num_bytes_per_float * 8;
5920//
5921// float_str.clear();
5922// uint32_t i;
5923// for (i=0; i<count; i++)
5924// {
5925// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
5926// bool is_ieee = false;
5927// APFloat ap_float(ap_int, is_ieee);
5928// char s[1024];
5929// unsigned int hex_digits = 0;
5930// bool upper_case = false;
5931//
5932// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
5933// {
5934// if (i > 0)
5935// float_str.append(", ");
5936// float_str.append(s);
5937// if (i == 1 && is_complex)
5938// float_str.append(1, 'i');
5939// }
5940// }
5941// return !float_str.empty();
5942// }
5943// return false;
5944//}
5945
5946size_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00005947ClangASTContext::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 +00005948{
5949 if (clang_type)
5950 {
5951 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5952 uint32_t count = 0;
5953 bool is_complex = false;
5954 if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
5955 {
5956 // TODO: handle complex and vector types
5957 if (count != 1)
5958 return false;
5959
5960 StringRef s_sref(s);
Greg Clayton6beaaa62011-01-17 03:46:26 +00005961 APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005962
Greg Clayton6beaaa62011-01-17 03:46:26 +00005963 const uint64_t bit_size = ast->getTypeSize (qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005964 const uint64_t byte_size = bit_size / 8;
5965 if (dst_size >= byte_size)
5966 {
5967 if (bit_size == sizeof(float)*8)
5968 {
5969 float float32 = ap_float.convertToFloat();
5970 ::memcpy (dst, &float32, byte_size);
5971 return byte_size;
5972 }
5973 else if (bit_size >= 64)
5974 {
5975 llvm::APInt ap_int(ap_float.bitcastToAPInt());
5976 ::memcpy (dst, ap_int.getRawData(), byte_size);
5977 return byte_size;
5978 }
5979 }
5980 }
5981 }
5982 return 0;
5983}
Sean Callanan6fe64b52010-09-17 02:24:29 +00005984
5985unsigned
Greg Clayton1be10fc2010-09-29 01:12:09 +00005986ClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
Sean Callanan6fe64b52010-09-17 02:24:29 +00005987{
5988 assert (clang_type);
5989
5990 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5991
5992 return qual_type.getQualifiers().getCVRQualifiers();
5993}
Greg Clayton6beaaa62011-01-17 03:46:26 +00005994
Sean Callanan3b107b12011-12-03 03:15:28 +00005995uint64_t
5996GetTypeFlags(clang::ASTContext *ast, lldb::clang_type_t clang_type)
5997{
5998 assert (clang_type);
5999
6000 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
6001
6002 if (!external_ast_source)
6003 return 0;
6004
6005 ClangExternalASTSourceCommon *common_ast_source = static_cast<ClangExternalASTSourceCommon*>(external_ast_source);
6006
6007 return common_ast_source->GetMetadata((uintptr_t)clang_type);
6008}
6009
6010void
6011SetTypeFlags(clang::ASTContext *ast, lldb::clang_type_t clang_type, uint64_t flags)
6012{
6013 assert (clang_type);
6014
6015 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
6016
6017 if (!external_ast_source)
6018 return;
6019
6020 ClangExternalASTSourceCommon *common_ast_source = static_cast<ClangExternalASTSourceCommon*>(external_ast_source);
6021
6022 return common_ast_source->SetMetadata((uintptr_t)clang_type, flags);
6023}
6024
Greg Clayton6beaaa62011-01-17 03:46:26 +00006025bool
6026ClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
6027{
6028 if (clang_type == NULL)
6029 return false;
6030
Greg Claytonc432c192011-01-20 04:18:48 +00006031 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00006032}
6033
6034
6035bool
6036ClangASTContext::GetCompleteType (clang_type_t clang_type)
6037{
6038 return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
6039}
6040
Greg Claytona2721472011-06-25 00:44:06 +00006041bool
6042ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
6043 clang::Decl *decl)
6044{
6045 if (!decl)
6046 return false;
6047
6048 ExternalASTSource *ast_source = ast->getExternalSource();
6049
6050 if (!ast_source)
6051 return false;
6052
6053 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
6054 {
6055 if (tag_decl->getDefinition())
6056 return true;
6057
6058 if (!tag_decl->hasExternalLexicalStorage())
6059 return false;
6060
6061 ast_source->CompleteType(tag_decl);
6062
6063 return !tag_decl->getTypeForDecl()->isIncompleteType();
6064 }
6065 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
6066 {
6067 if (!objc_interface_decl->isForwardDecl())
6068 return true;
6069
6070 if (!objc_interface_decl->hasExternalLexicalStorage())
6071 return false;
6072
6073 ast_source->CompleteType(objc_interface_decl);
6074
6075 return !objc_interface_decl->isForwardDecl();
6076 }
6077 else
6078 {
6079 return false;
6080 }
6081}
6082
Greg Clayton2c5f0e92011-08-04 21:02:57 +00006083clang::DeclContext *
6084ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
6085{
Sean Callanana87bee82011-08-19 06:19:25 +00006086 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00006087}
6088
6089clang::DeclContext *
6090ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
6091{
Sean Callanana87bee82011-08-19 06:19:25 +00006092 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00006093}
6094