blob: d500cad3863bcc7cfba876f0daaeced33f4da471 [file] [log] [blame]
Chris Lattner24943d22010-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 Friedmanf05633b2010-06-13 19:06:42 +000010#include "lldb/Symbol/ClangASTContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000011
12// C Includes
13// C++ Includes
14#include <string>
15
16// Other libraries and framework includes
Greg Claytonb01000f2011-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 Callanana31b4dd2011-10-26 17:46:51 +000028#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
Greg Claytonb01000f2011-01-17 03:46:26 +000029#define LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callananbc4f0f52010-07-08 18:16:16 +000030#define NDEBUG
Greg Claytonb01000f2011-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 Lattner24943d22010-06-08 16:52:24 +000035#include "clang/AST/ASTContext.h"
36#include "clang/AST/ASTImporter.h"
Greg Clayton803c3b02012-12-03 18:29:55 +000037#include "clang/AST/Attr.h"
Chris Lattner24943d22010-06-08 16:52:24 +000038#include "clang/AST/CXXInheritance.h"
Greg Clayton84f80752010-07-22 18:30:50 +000039#include "clang/AST/DeclObjC.h"
Greg Claytonf6a5bd72011-10-22 03:33:13 +000040#include "clang/AST/DeclTemplate.h"
Chris Lattner24943d22010-06-08 16:52:24 +000041#include "clang/AST/RecordLayout.h"
42#include "clang/AST/Type.h"
43#include "clang/Basic/Builtins.h"
Sean Callanan97b675e2012-02-06 21:28:03 +000044#include "clang/Basic/Diagnostic.h"
Chris Lattner24943d22010-06-08 16:52:24 +000045#include "clang/Basic/FileManager.h"
Sean Callanan8a3b0a82010-11-18 02:56:27 +000046#include "clang/Basic/FileSystemOptions.h"
Chris Lattner24943d22010-06-08 16:52:24 +000047#include "clang/Basic/SourceManager.h"
48#include "clang/Basic/TargetInfo.h"
49#include "clang/Basic/TargetOptions.h"
50#include "clang/Frontend/FrontendOptions.h"
51#include "clang/Frontend/LangStandard.h"
Greg Claytonb01000f2011-01-17 03:46:26 +000052
53#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callananbc4f0f52010-07-08 18:16:16 +000054#undef NDEBUG
Greg Claytonb01000f2011-01-17 03:46:26 +000055#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
56// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
57#include <assert.h>
58#endif
Chris Lattner24943d22010-06-08 16:52:24 +000059
Greg Clayton395fc332011-02-15 21:59:32 +000060#include "lldb/Core/ArchSpec.h"
Chris Lattner24943d22010-06-08 16:52:24 +000061#include "lldb/Core/dwarf.h"
Greg Claytonf3d0b0c2010-10-27 03:32:59 +000062#include "lldb/Core/Flags.h"
Sean Callanan839fde42010-10-28 18:19:36 +000063#include "lldb/Core/Log.h"
Greg Claytonf6a5bd72011-10-22 03:33:13 +000064#include "lldb/Core/RegularExpression.h"
65#include "lldb/Expression/ASTDumper.h"
Sean Callanan2fc7e8d2011-12-03 03:15:28 +000066#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Sean Callananc6d161e2011-10-26 01:06:27 +000067#include "lldb/Symbol/VerifyDecl.h"
Jim Ingham58513662011-06-24 22:03:24 +000068#include "lldb/Target/ExecutionContext.h"
69#include "lldb/Target/Process.h"
70#include "lldb/Target/ObjCLanguageRuntime.h"
71
Chris Lattner24943d22010-06-08 16:52:24 +000072
Eli Friedmanf05633b2010-06-13 19:06:42 +000073#include <stdio.h>
74
Greg Clayton585660c2010-08-05 01:57:25 +000075using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000076using namespace lldb_private;
77using namespace llvm;
78using namespace clang;
79
Greg Claytonb01000f2011-01-17 03:46:26 +000080
81static bool
Enrico Granatad44c9d32012-03-24 01:11:14 +000082GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true)
Greg Claytonb01000f2011-01-17 03:46:26 +000083{
84 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
85 switch (type_class)
86 {
Sean Callanan8f2e3922012-02-04 08:49:35 +000087 case clang::Type::ConstantArray:
88 {
89 const clang::ArrayType *array_type = dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
90
91 if (array_type)
Enrico Granatad44c9d32012-03-24 01:11:14 +000092 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
Sean Callanan8f2e3922012-02-04 08:49:35 +000093 }
94 break;
95
Greg Claytonb01000f2011-01-17 03:46:26 +000096 case clang::Type::Record:
97 case clang::Type::Enum:
98 {
Sean Callanand5b3c352011-01-27 04:42:51 +000099 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
Greg Claytonb01000f2011-01-17 03:46:26 +0000100 if (tag_type)
101 {
102 clang::TagDecl *tag_decl = tag_type->getDecl();
103 if (tag_decl)
104 {
Greg Clayton3356d4f2012-03-30 00:51:13 +0000105 if (tag_decl->isCompleteDefinition())
Greg Claytonb01000f2011-01-17 03:46:26 +0000106 return true;
Enrico Granatad44c9d32012-03-24 01:11:14 +0000107
108 if (!allow_completion)
109 return false;
Greg Claytonb01000f2011-01-17 03:46:26 +0000110
111 if (tag_decl->hasExternalLexicalStorage())
112 {
Greg Clayton82f07462011-05-30 00:49:24 +0000113 if (ast)
Greg Claytonb01000f2011-01-17 03:46:26 +0000114 {
Greg Clayton82f07462011-05-30 00:49:24 +0000115 ExternalASTSource *external_ast_source = ast->getExternalSource();
116 if (external_ast_source)
117 {
118 external_ast_source->CompleteType(tag_decl);
119 return !tag_type->isIncompleteType();
120 }
Greg Claytonb01000f2011-01-17 03:46:26 +0000121 }
122 }
123 return false;
124 }
125 }
126
127 }
128 break;
129
130 case clang::Type::ObjCObject:
131 case clang::Type::ObjCInterface:
132 {
Sean Callanand5b3c352011-01-27 04:42:51 +0000133 const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
Greg Claytonb01000f2011-01-17 03:46:26 +0000134 if (objc_class_type)
135 {
136 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
137 // We currently can't complete objective C types through the newly added ASTContext
138 // because it only supports TagDecl objects right now...
Enrico Granata90d207e2011-07-15 23:30:15 +0000139 if (class_interface_decl)
Greg Claytonb01000f2011-01-17 03:46:26 +0000140 {
Sean Callanan8f2e3922012-02-04 08:49:35 +0000141 if (class_interface_decl->getDefinition())
142 return true;
143
Enrico Granatad44c9d32012-03-24 01:11:14 +0000144 if (!allow_completion)
145 return false;
Greg Claytonc17d2ed2012-03-30 23:48:28 +0000146
Sean Callanan8f2e3922012-02-04 08:49:35 +0000147 if (class_interface_decl->hasExternalLexicalStorage())
Greg Claytonb01000f2011-01-17 03:46:26 +0000148 {
Enrico Granata886bc3e2011-07-02 00:25:22 +0000149 if (ast)
Greg Clayton82f07462011-05-30 00:49:24 +0000150 {
Enrico Granata886bc3e2011-07-02 00:25:22 +0000151 ExternalASTSource *external_ast_source = ast->getExternalSource();
152 if (external_ast_source)
153 {
154 external_ast_source->CompleteType (class_interface_decl);
Sean Callanan8f2e3922012-02-04 08:49:35 +0000155 return !objc_class_type->isIncompleteType();
Enrico Granata886bc3e2011-07-02 00:25:22 +0000156 }
Greg Clayton82f07462011-05-30 00:49:24 +0000157 }
Greg Claytonb01000f2011-01-17 03:46:26 +0000158 }
Enrico Granata886bc3e2011-07-02 00:25:22 +0000159 return false;
Sean Callanan8f2e3922012-02-04 08:49:35 +0000160 }
Greg Claytonb01000f2011-01-17 03:46:26 +0000161 }
162 }
163 break;
164
165 case clang::Type::Typedef:
Enrico Granatad44c9d32012-03-24 01:11:14 +0000166 return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
Sean Callananc6139712011-08-11 23:56:13 +0000167
168 case clang::Type::Elaborated:
Enrico Granatad44c9d32012-03-24 01:11:14 +0000169 return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType(), allow_completion);
Greg Claytonb01000f2011-01-17 03:46:26 +0000170
171 default:
172 break;
173 }
174
175 return true;
176}
177
Greg Clayton84f80752010-07-22 18:30:50 +0000178static AccessSpecifier
Greg Clayton585660c2010-08-05 01:57:25 +0000179ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton84f80752010-07-22 18:30:50 +0000180{
181 switch (access)
182 {
Greg Clayton585660c2010-08-05 01:57:25 +0000183 default: break;
184 case eAccessNone: return AS_none;
185 case eAccessPublic: return AS_public;
186 case eAccessPrivate: return AS_private;
187 case eAccessProtected: return AS_protected;
Greg Clayton84f80752010-07-22 18:30:50 +0000188 }
189 return AS_none;
190}
191
192static ObjCIvarDecl::AccessControl
Greg Clayton585660c2010-08-05 01:57:25 +0000193ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
Greg Clayton84f80752010-07-22 18:30:50 +0000194{
195 switch (access)
196 {
Greg Clayton585660c2010-08-05 01:57:25 +0000197 default: break;
198 case eAccessNone: return ObjCIvarDecl::None;
199 case eAccessPublic: return ObjCIvarDecl::Public;
200 case eAccessPrivate: return ObjCIvarDecl::Private;
201 case eAccessProtected: return ObjCIvarDecl::Protected;
202 case eAccessPackage: return ObjCIvarDecl::Package;
Greg Clayton84f80752010-07-22 18:30:50 +0000203 }
204 return ObjCIvarDecl::None;
205}
206
207
Chris Lattner24943d22010-06-08 16:52:24 +0000208static void
209ParseLangArgs
210(
211 LangOptions &Opts,
Greg Claytone41c4b22010-06-13 17:34:29 +0000212 InputKind IK
Chris Lattner24943d22010-06-08 16:52:24 +0000213)
214{
215 // FIXME: Cleanup per-file based stuff.
216
217 // Set some properties which depend soley on the input kind; it would be nice
218 // to move these to the language standard, and have the driver resolve the
219 // input kind + language standard.
Greg Claytone41c4b22010-06-13 17:34:29 +0000220 if (IK == IK_Asm) {
Chris Lattner24943d22010-06-08 16:52:24 +0000221 Opts.AsmPreprocessor = 1;
Greg Claytone41c4b22010-06-13 17:34:29 +0000222 } else if (IK == IK_ObjC ||
223 IK == IK_ObjCXX ||
224 IK == IK_PreprocessedObjC ||
225 IK == IK_PreprocessedObjCXX) {
Chris Lattner24943d22010-06-08 16:52:24 +0000226 Opts.ObjC1 = Opts.ObjC2 = 1;
227 }
228
229 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
230
231 if (LangStd == LangStandard::lang_unspecified) {
232 // Based on the base language, pick one.
233 switch (IK) {
Greg Claytone41c4b22010-06-13 17:34:29 +0000234 case IK_None:
235 case IK_AST:
Sean Callanan279584c2011-03-15 00:17:19 +0000236 case IK_LLVM_IR:
Greg Claytonb01000f2011-01-17 03:46:26 +0000237 assert (!"Invalid input kind!");
Greg Claytone41c4b22010-06-13 17:34:29 +0000238 case IK_OpenCL:
Chris Lattner24943d22010-06-08 16:52:24 +0000239 LangStd = LangStandard::lang_opencl;
240 break;
Sean Callanan279584c2011-03-15 00:17:19 +0000241 case IK_CUDA:
242 LangStd = LangStandard::lang_cuda;
243 break;
Greg Claytone41c4b22010-06-13 17:34:29 +0000244 case IK_Asm:
245 case IK_C:
246 case IK_PreprocessedC:
247 case IK_ObjC:
248 case IK_PreprocessedObjC:
Chris Lattner24943d22010-06-08 16:52:24 +0000249 LangStd = LangStandard::lang_gnu99;
250 break;
Greg Claytone41c4b22010-06-13 17:34:29 +0000251 case IK_CXX:
252 case IK_PreprocessedCXX:
253 case IK_ObjCXX:
254 case IK_PreprocessedObjCXX:
Chris Lattner24943d22010-06-08 16:52:24 +0000255 LangStd = LangStandard::lang_gnucxx98;
256 break;
257 }
258 }
259
260 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
Filipe Cabecinhas9bb15b62012-11-12 21:26:32 +0000261 Opts.LineComment = Std.hasLineComments();
Chris Lattner24943d22010-06-08 16:52:24 +0000262 Opts.C99 = Std.isC99();
263 Opts.CPlusPlus = Std.isCPlusPlus();
264 Opts.CPlusPlus0x = Std.isCPlusPlus0x();
265 Opts.Digraphs = Std.hasDigraphs();
266 Opts.GNUMode = Std.isGNUMode();
267 Opts.GNUInline = !Std.isC99();
268 Opts.HexFloats = Std.hasHexFloats();
269 Opts.ImplicitInt = Std.hasImplicitInt();
270
271 // OpenCL has some additional defaults.
272 if (LangStd == LangStandard::lang_opencl) {
273 Opts.OpenCL = 1;
274 Opts.AltiVec = 1;
275 Opts.CXXOperatorNames = 1;
276 Opts.LaxVectorConversions = 1;
277 }
278
279 // OpenCL and C++ both have bool, true, false keywords.
280 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
281
282// if (Opts.CPlusPlus)
283// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
284//
285// if (Args.hasArg(OPT_fobjc_gc_only))
286// Opts.setGCMode(LangOptions::GCOnly);
287// else if (Args.hasArg(OPT_fobjc_gc))
288// Opts.setGCMode(LangOptions::HybridGC);
289//
290// if (Args.hasArg(OPT_print_ivar_layout))
291// Opts.ObjCGCBitmapPrint = 1;
292//
293// if (Args.hasArg(OPT_faltivec))
294// Opts.AltiVec = 1;
295//
296// if (Args.hasArg(OPT_pthread))
297// Opts.POSIXThreads = 1;
298//
299// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
300// "default");
301// if (Vis == "default")
Sean Callanan8950c9a2010-10-29 18:38:40 +0000302 Opts.setVisibilityMode(DefaultVisibility);
Chris Lattner24943d22010-06-08 16:52:24 +0000303// else if (Vis == "hidden")
304// Opts.setVisibilityMode(LangOptions::Hidden);
305// else if (Vis == "protected")
306// Opts.setVisibilityMode(LangOptions::Protected);
307// else
308// Diags.Report(diag::err_drv_invalid_value)
309// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
310
311// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
312
313 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
314 // is specified, or -std is set to a conforming mode.
315 Opts.Trigraphs = !Opts.GNUMode;
316// if (Args.hasArg(OPT_trigraphs))
317// Opts.Trigraphs = 1;
318//
319// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
320// OPT_fno_dollars_in_identifiers,
321// !Opts.AsmPreprocessor);
322// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
323// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
324// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
325// if (Args.hasArg(OPT_fno_lax_vector_conversions))
326// Opts.LaxVectorConversions = 0;
327// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
328// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
329// Opts.Blocks = Args.hasArg(OPT_fblocks);
330// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
331// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
332// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
333// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
334// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
335// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
336// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
337// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
338// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
339// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
340// Diags);
341// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
342// Opts.ObjCConstantStringClass = getLastArgValue(Args,
343// OPT_fconstant_string_class);
344// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
345// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
346// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
347// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
348// Opts.Static = Args.hasArg(OPT_static_define);
349 Opts.OptimizeSize = 0;
350
351 // FIXME: Eliminate this dependency.
352// unsigned Opt =
353// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
354// Opts.Optimize = Opt != 0;
355 unsigned Opt = 0;
356
357 // This is the __NO_INLINE__ define, which just depends on things like the
358 // optimization level and -fno-inline, not actually whether the backend has
359 // inlining enabled.
360 //
361 // FIXME: This is affected by other options (-fno-inline).
Sean Callanan06dc17f2012-09-24 22:25:51 +0000362 Opts.NoInlineDefine = !Opt;
Chris Lattner24943d22010-06-08 16:52:24 +0000363
364// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
365// switch (SSP) {
366// default:
367// Diags.Report(diag::err_drv_invalid_value)
368// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
369// break;
370// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
371// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
372// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
373// }
374}
375
Chris Lattner24943d22010-06-08 16:52:24 +0000376
Greg Claytonb01000f2011-01-17 03:46:26 +0000377ClangASTContext::ClangASTContext (const char *target_triple) :
Chris Lattner24943d22010-06-08 16:52:24 +0000378 m_target_triple(),
Greg Claytonb01000f2011-01-17 03:46:26 +0000379 m_ast_ap(),
Chris Lattner24943d22010-06-08 16:52:24 +0000380 m_language_options_ap(),
381 m_source_manager_ap(),
Sean Callananc1535182011-10-07 23:18:13 +0000382 m_diagnostics_engine_ap(),
Sean Callanan6a97d422012-10-17 22:11:14 +0000383 m_target_options_rp(),
Chris Lattner24943d22010-06-08 16:52:24 +0000384 m_target_info_ap(),
385 m_identifier_table_ap(),
386 m_selector_table_ap(),
Greg Claytonb01000f2011-01-17 03:46:26 +0000387 m_builtins_ap(),
388 m_callback_tag_decl (NULL),
389 m_callback_objc_decl (NULL),
390 m_callback_baton (NULL)
391
Chris Lattner24943d22010-06-08 16:52:24 +0000392{
393 if (target_triple && target_triple[0])
Greg Claytondcc59f02011-07-30 01:26:02 +0000394 SetTargetTriple (target_triple);
Chris Lattner24943d22010-06-08 16:52:24 +0000395}
396
397//----------------------------------------------------------------------
398// Destructor
399//----------------------------------------------------------------------
400ClangASTContext::~ClangASTContext()
401{
402 m_builtins_ap.reset();
403 m_selector_table_ap.reset();
404 m_identifier_table_ap.reset();
405 m_target_info_ap.reset();
Sean Callanan6a97d422012-10-17 22:11:14 +0000406 m_target_options_rp.reset();
Sean Callananc1535182011-10-07 23:18:13 +0000407 m_diagnostics_engine_ap.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000408 m_source_manager_ap.reset();
409 m_language_options_ap.reset();
Greg Claytonb01000f2011-01-17 03:46:26 +0000410 m_ast_ap.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000411}
412
413
414void
415ClangASTContext::Clear()
416{
Greg Claytonb01000f2011-01-17 03:46:26 +0000417 m_ast_ap.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000418 m_language_options_ap.reset();
419 m_source_manager_ap.reset();
Sean Callananc1535182011-10-07 23:18:13 +0000420 m_diagnostics_engine_ap.reset();
Sean Callanan6a97d422012-10-17 22:11:14 +0000421 m_target_options_rp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000422 m_target_info_ap.reset();
423 m_identifier_table_ap.reset();
424 m_selector_table_ap.reset();
425 m_builtins_ap.reset();
426}
427
428const char *
429ClangASTContext::GetTargetTriple ()
430{
431 return m_target_triple.c_str();
432}
433
434void
435ClangASTContext::SetTargetTriple (const char *target_triple)
436{
437 Clear();
438 m_target_triple.assign(target_triple);
439}
440
Greg Clayton395fc332011-02-15 21:59:32 +0000441void
442ClangASTContext::SetArchitecture (const ArchSpec &arch)
443{
Greg Claytondcc59f02011-07-30 01:26:02 +0000444 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton395fc332011-02-15 21:59:32 +0000445}
446
Greg Claytonb01000f2011-01-17 03:46:26 +0000447bool
448ClangASTContext::HasExternalSource ()
449{
450 ASTContext *ast = getASTContext();
451 if (ast)
452 return ast->getExternalSource () != NULL;
453 return false;
454}
455
456void
457ClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
458{
459 ASTContext *ast = getASTContext();
460 if (ast)
461 {
462 ast->setExternalSource (ast_source_ap);
463 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
464 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
465 }
466}
467
468void
469ClangASTContext::RemoveExternalSource ()
470{
471 ASTContext *ast = getASTContext();
472
473 if (ast)
474 {
475 llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
476 ast->setExternalSource (empty_ast_source_ap);
477 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
478 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
479 }
480}
481
482
Chris Lattner24943d22010-06-08 16:52:24 +0000483
484ASTContext *
485ClangASTContext::getASTContext()
486{
Greg Claytonb01000f2011-01-17 03:46:26 +0000487 if (m_ast_ap.get() == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000488 {
Greg Claytonb01000f2011-01-17 03:46:26 +0000489 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
490 *getSourceManager(),
Sean Callananc1535182011-10-07 23:18:13 +0000491 getTargetInfo(),
Greg Claytonb01000f2011-01-17 03:46:26 +0000492 *getIdentifierTable(),
493 *getSelectorTable(),
494 *getBuiltinContext(),
495 0));
Sean Callanan887d2512010-12-11 00:08:56 +0000496
Greg Claytonb01000f2011-01-17 03:46:26 +0000497 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
498 {
499 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
500 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
501 }
502
Sean Callananc1535182011-10-07 23:18:13 +0000503 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Chris Lattner24943d22010-06-08 16:52:24 +0000504 }
Greg Claytonb01000f2011-01-17 03:46:26 +0000505 return m_ast_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000506}
507
508Builtin::Context *
509ClangASTContext::getBuiltinContext()
510{
511 if (m_builtins_ap.get() == NULL)
Sean Callananc1535182011-10-07 23:18:13 +0000512 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner24943d22010-06-08 16:52:24 +0000513 return m_builtins_ap.get();
514}
515
516IdentifierTable *
517ClangASTContext::getIdentifierTable()
518{
519 if (m_identifier_table_ap.get() == NULL)
520 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
521 return m_identifier_table_ap.get();
522}
523
524LangOptions *
525ClangASTContext::getLanguageOptions()
526{
527 if (m_language_options_ap.get() == NULL)
528 {
529 m_language_options_ap.reset(new LangOptions());
Greg Claytone41c4b22010-06-13 17:34:29 +0000530 ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
531// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner24943d22010-06-08 16:52:24 +0000532 }
533 return m_language_options_ap.get();
534}
535
536SelectorTable *
537ClangASTContext::getSelectorTable()
538{
539 if (m_selector_table_ap.get() == NULL)
540 m_selector_table_ap.reset (new SelectorTable());
541 return m_selector_table_ap.get();
542}
543
Sean Callanan8a3b0a82010-11-18 02:56:27 +0000544clang::FileManager *
545ClangASTContext::getFileManager()
546{
547 if (m_file_manager_ap.get() == NULL)
Greg Clayton22defe82010-12-02 23:20:03 +0000548 {
549 clang::FileSystemOptions file_system_options;
550 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
551 }
Sean Callanan8a3b0a82010-11-18 02:56:27 +0000552 return m_file_manager_ap.get();
553}
554
Greg Clayton1674b122010-07-21 22:12:05 +0000555clang::SourceManager *
Chris Lattner24943d22010-06-08 16:52:24 +0000556ClangASTContext::getSourceManager()
557{
558 if (m_source_manager_ap.get() == NULL)
Sean Callananc1535182011-10-07 23:18:13 +0000559 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner24943d22010-06-08 16:52:24 +0000560 return m_source_manager_ap.get();
561}
562
Sean Callananc1535182011-10-07 23:18:13 +0000563clang::DiagnosticsEngine *
564ClangASTContext::getDiagnosticsEngine()
Chris Lattner24943d22010-06-08 16:52:24 +0000565{
Sean Callananc1535182011-10-07 23:18:13 +0000566 if (m_diagnostics_engine_ap.get() == NULL)
Greg Claytoneae91242010-11-19 21:46:54 +0000567 {
568 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callanancbe707c2012-10-25 01:00:25 +0000569 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
Greg Claytoneae91242010-11-19 21:46:54 +0000570 }
Sean Callananc1535182011-10-07 23:18:13 +0000571 return m_diagnostics_engine_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000572}
573
Sean Callananc1535182011-10-07 23:18:13 +0000574class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan887d2512010-12-11 00:08:56 +0000575{
576public:
Sean Callananc1535182011-10-07 23:18:13 +0000577 NullDiagnosticConsumer ()
Sean Callanan887d2512010-12-11 00:08:56 +0000578 {
579 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
580 }
581
Sean Callananc1535182011-10-07 23:18:13 +0000582 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan887d2512010-12-11 00:08:56 +0000583 {
584 if (m_log)
585 {
Sean Callanan8f2e3922012-02-04 08:49:35 +0000586 llvm::SmallVector<char, 32> diag_str(10);
Sean Callanan887d2512010-12-11 00:08:56 +0000587 info.FormatDiagnostic(diag_str);
588 diag_str.push_back('\0');
589 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
590 }
591 }
Sean Callananc1535182011-10-07 23:18:13 +0000592
593 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
594 {
595 return new NullDiagnosticConsumer ();
596 }
Sean Callanan887d2512010-12-11 00:08:56 +0000597private:
598 LogSP m_log;
599};
600
Sean Callananc1535182011-10-07 23:18:13 +0000601DiagnosticConsumer *
602ClangASTContext::getDiagnosticConsumer()
Sean Callanan887d2512010-12-11 00:08:56 +0000603{
Sean Callananc1535182011-10-07 23:18:13 +0000604 if (m_diagnostic_consumer_ap.get() == NULL)
605 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan887d2512010-12-11 00:08:56 +0000606
Sean Callananc1535182011-10-07 23:18:13 +0000607 return m_diagnostic_consumer_ap.get();
Sean Callanan887d2512010-12-11 00:08:56 +0000608}
609
Chris Lattner24943d22010-06-08 16:52:24 +0000610TargetOptions *
611ClangASTContext::getTargetOptions()
612{
Sean Callanan6a97d422012-10-17 22:11:14 +0000613 if (m_target_options_rp.getPtr() == NULL && !m_target_triple.empty())
Chris Lattner24943d22010-06-08 16:52:24 +0000614 {
Sean Callanan6a97d422012-10-17 22:11:14 +0000615 m_target_options_rp.reset ();
616 m_target_options_rp = new TargetOptions();
617 if (m_target_options_rp.getPtr() != NULL)
618 m_target_options_rp->Triple = m_target_triple;
Chris Lattner24943d22010-06-08 16:52:24 +0000619 }
Sean Callanan6a97d422012-10-17 22:11:14 +0000620 return m_target_options_rp.getPtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000621}
622
623
624TargetInfo *
625ClangASTContext::getTargetInfo()
626{
Greg Claytonb170aee2012-05-08 01:45:38 +0000627 // target_triple should be something like "x86_64-apple-macosx"
Chris Lattner24943d22010-06-08 16:52:24 +0000628 if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
Greg Claytonb4fadde2012-11-16 21:35:22 +0000629 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), getTargetOptions()));
Chris Lattner24943d22010-06-08 16:52:24 +0000630 return m_target_info_ap.get();
631}
632
633#pragma mark Basic Types
634
635static inline bool
Greg Claytonb01000f2011-01-17 03:46:26 +0000636QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner24943d22010-06-08 16:52:24 +0000637{
Greg Claytonb01000f2011-01-17 03:46:26 +0000638 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner24943d22010-06-08 16:52:24 +0000639 if (qual_type_bit_size == bit_size)
640 return true;
641 return false;
642}
643
Greg Clayton462d4142010-09-29 01:12:09 +0000644clang_type_t
Greg Clayton585660c2010-08-05 01:57:25 +0000645ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
Chris Lattner24943d22010-06-08 16:52:24 +0000646{
Greg Claytonb01000f2011-01-17 03:46:26 +0000647 ASTContext *ast = getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +0000648
Greg Claytonb01000f2011-01-17 03:46:26 +0000649 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000650
Greg Claytonb01000f2011-01-17 03:46:26 +0000651 return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
Chris Lattner24943d22010-06-08 16:52:24 +0000652}
653
Greg Clayton462d4142010-09-29 01:12:09 +0000654clang_type_t
Greg Claytonb01000f2011-01-17 03:46:26 +0000655ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner24943d22010-06-08 16:52:24 +0000656{
Greg Claytonb01000f2011-01-17 03:46:26 +0000657 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +0000658 return NULL;
659
660 switch (encoding)
661 {
Greg Clayton585660c2010-08-05 01:57:25 +0000662 case eEncodingInvalid:
Greg Claytonb01000f2011-01-17 03:46:26 +0000663 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
664 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000665 break;
666
Greg Clayton585660c2010-08-05 01:57:25 +0000667 case eEncodingUint:
Greg Claytonb01000f2011-01-17 03:46:26 +0000668 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
669 return ast->UnsignedCharTy.getAsOpaquePtr();
670 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
671 return ast->UnsignedShortTy.getAsOpaquePtr();
672 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
673 return ast->UnsignedIntTy.getAsOpaquePtr();
674 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
675 return ast->UnsignedLongTy.getAsOpaquePtr();
676 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
677 return ast->UnsignedLongLongTy.getAsOpaquePtr();
678 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
679 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000680 break;
681
Greg Clayton585660c2010-08-05 01:57:25 +0000682 case eEncodingSint:
Greg Claytonb01000f2011-01-17 03:46:26 +0000683 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
684 return ast->CharTy.getAsOpaquePtr();
685 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
686 return ast->ShortTy.getAsOpaquePtr();
687 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
688 return ast->IntTy.getAsOpaquePtr();
689 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
690 return ast->LongTy.getAsOpaquePtr();
691 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
692 return ast->LongLongTy.getAsOpaquePtr();
693 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
694 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000695 break;
696
Greg Clayton585660c2010-08-05 01:57:25 +0000697 case eEncodingIEEE754:
Greg Claytonb01000f2011-01-17 03:46:26 +0000698 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
699 return ast->FloatTy.getAsOpaquePtr();
700 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
701 return ast->DoubleTy.getAsOpaquePtr();
702 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
703 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000704 break;
705
Greg Clayton585660c2010-08-05 01:57:25 +0000706 case eEncodingVector:
Johnny Chen1bc1cad2012-03-07 01:12:24 +0000707 // Sanity check that bit_size is a multiple of 8's.
708 if (bit_size && !(bit_size & 0x7u))
709 return ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8).getAsOpaquePtr();
710 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000711 default:
712 break;
713 }
714
715 return NULL;
716}
717
Greg Clayton462d4142010-09-29 01:12:09 +0000718clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +0000719ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
720{
Greg Claytonb01000f2011-01-17 03:46:26 +0000721 ASTContext *ast = getASTContext();
Sean Callanane4b3d632012-04-03 01:10:10 +0000722
723#define streq(a,b) strcmp(a,b) == 0
Greg Claytonb01000f2011-01-17 03:46:26 +0000724 assert (ast != NULL);
725 if (ast)
Chris Lattner24943d22010-06-08 16:52:24 +0000726 {
727 switch (dw_ate)
728 {
Sean Callanane4b3d632012-04-03 01:10:10 +0000729 default:
730 break;
Greg Claytonca541932011-10-28 23:06:08 +0000731
Sean Callanane4b3d632012-04-03 01:10:10 +0000732 case DW_ATE_address:
733 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
734 return ast->VoidPtrTy.getAsOpaquePtr();
735 break;
736
737 case DW_ATE_boolean:
738 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
739 return ast->BoolTy.getAsOpaquePtr();
740 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
741 return ast->UnsignedCharTy.getAsOpaquePtr();
742 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
743 return ast->UnsignedShortTy.getAsOpaquePtr();
744 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
745 return ast->UnsignedIntTy.getAsOpaquePtr();
746 break;
747
748 case DW_ATE_lo_user:
749 // This has been seen to mean DW_AT_complex_integer
750 if (type_name)
Greg Claytonca541932011-10-28 23:06:08 +0000751 {
Sean Callanane4b3d632012-04-03 01:10:10 +0000752 if (::strstr(type_name, "complex"))
753 {
754 clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
755 return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
756 }
Greg Claytonca541932011-10-28 23:06:08 +0000757 }
Sean Callanane4b3d632012-04-03 01:10:10 +0000758 break;
759
760 case DW_ATE_complex_float:
761 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
762 return ast->FloatComplexTy.getAsOpaquePtr();
763 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
764 return ast->DoubleComplexTy.getAsOpaquePtr();
765 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
766 return ast->LongDoubleComplexTy.getAsOpaquePtr();
767 else
Greg Claytonca541932011-10-28 23:06:08 +0000768 {
Sean Callanane4b3d632012-04-03 01:10:10 +0000769 clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
770 return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
Greg Claytonca541932011-10-28 23:06:08 +0000771 }
Sean Callanane4b3d632012-04-03 01:10:10 +0000772 break;
773
774 case DW_ATE_float:
775 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
776 return ast->FloatTy.getAsOpaquePtr();
777 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
778 return ast->DoubleTy.getAsOpaquePtr();
779 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
780 return ast->LongDoubleTy.getAsOpaquePtr();
781 break;
782
783 case DW_ATE_signed:
784 if (type_name)
785 {
786 if (streq(type_name, "wchar_t") &&
787 QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
788 return ast->WCharTy.getAsOpaquePtr();
789 if (streq(type_name, "void") &&
790 QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
791 return ast->VoidTy.getAsOpaquePtr();
792 if (strstr(type_name, "long long") &&
793 QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
794 return ast->LongLongTy.getAsOpaquePtr();
795 if (strstr(type_name, "long") &&
796 QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
797 return ast->LongTy.getAsOpaquePtr();
798 if (strstr(type_name, "short") &&
799 QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
800 return ast->ShortTy.getAsOpaquePtr();
801 if (strstr(type_name, "char"))
802 {
803 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
804 return ast->CharTy.getAsOpaquePtr();
805 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
806 return ast->SignedCharTy.getAsOpaquePtr();
807 }
808 if (strstr(type_name, "int"))
809 {
810 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
811 return ast->IntTy.getAsOpaquePtr();
812 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
813 return ast->Int128Ty.getAsOpaquePtr();
814 }
815 }
816 // We weren't able to match up a type name, just search by size
817 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
818 return ast->CharTy.getAsOpaquePtr();
819 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
820 return ast->ShortTy.getAsOpaquePtr();
821 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
822 return ast->IntTy.getAsOpaquePtr();
823 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
824 return ast->LongTy.getAsOpaquePtr();
825 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
826 return ast->LongLongTy.getAsOpaquePtr();
827 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
828 return ast->Int128Ty.getAsOpaquePtr();
829 break;
830
831 case DW_ATE_signed_char:
832 if (type_name)
833 {
834 if (streq(type_name, "signed char"))
835 {
836 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
837 return ast->SignedCharTy.getAsOpaquePtr();
838 }
839 }
840 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
841 return ast->CharTy.getAsOpaquePtr();
842 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
843 return ast->SignedCharTy.getAsOpaquePtr();
844 break;
845
846 case DW_ATE_unsigned:
847 if (type_name)
848 {
849 if (strstr(type_name, "long long"))
850 {
851 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
852 return ast->UnsignedLongLongTy.getAsOpaquePtr();
853 }
854 else if (strstr(type_name, "long"))
855 {
856 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
857 return ast->UnsignedLongTy.getAsOpaquePtr();
858 }
859 else if (strstr(type_name, "short"))
860 {
861 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
862 return ast->UnsignedShortTy.getAsOpaquePtr();
863 }
864 else if (strstr(type_name, "char"))
865 {
866 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
867 return ast->UnsignedCharTy.getAsOpaquePtr();
868 }
869 else if (strstr(type_name, "int"))
870 {
871 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
872 return ast->UnsignedIntTy.getAsOpaquePtr();
873 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
874 return ast->UnsignedInt128Ty.getAsOpaquePtr();
875 }
876 }
877 // We weren't able to match up a type name, just search by size
878 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
879 return ast->UnsignedCharTy.getAsOpaquePtr();
880 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
881 return ast->UnsignedShortTy.getAsOpaquePtr();
882 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
883 return ast->UnsignedIntTy.getAsOpaquePtr();
884 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
885 return ast->UnsignedLongTy.getAsOpaquePtr();
886 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
887 return ast->UnsignedLongLongTy.getAsOpaquePtr();
888 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
889 return ast->UnsignedInt128Ty.getAsOpaquePtr();
890 break;
891
892 case DW_ATE_unsigned_char:
893 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
894 return ast->UnsignedCharTy.getAsOpaquePtr();
895 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
896 return ast->UnsignedShortTy.getAsOpaquePtr();
897 break;
898
899 case DW_ATE_imaginary_float:
900 break;
901
902 case DW_ATE_UTF:
903 if (type_name)
904 {
905 if (streq(type_name, "char16_t"))
906 {
907 return ast->Char16Ty.getAsOpaquePtr();
908 }
909 else if (streq(type_name, "char32_t"))
910 {
911 return ast->Char32Ty.getAsOpaquePtr();
912 }
913 }
914 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000915 }
916 }
917 // This assert should fire for anything that we don't catch above so we know
918 // to fix any issues we run into.
Greg Clayton5a570902011-05-17 18:15:05 +0000919 if (type_name)
920 {
Greg Claytondf6dc882012-01-05 03:57:59 +0000921 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 Clayton5a570902011-05-17 18:15:05 +0000922 }
923 else
924 {
Greg Claytondf6dc882012-01-05 03:57:59 +0000925 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 Clayton5a570902011-05-17 18:15:05 +0000926 }
Chris Lattner24943d22010-06-08 16:52:24 +0000927 return NULL;
928}
929
Greg Clayton462d4142010-09-29 01:12:09 +0000930clang_type_t
Greg Claytonb01000f2011-01-17 03:46:26 +0000931ClangASTContext::GetBuiltInType_void(ASTContext *ast)
Chris Lattner24943d22010-06-08 16:52:24 +0000932{
Greg Claytonb01000f2011-01-17 03:46:26 +0000933 return ast->VoidTy.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000934}
935
Greg Clayton462d4142010-09-29 01:12:09 +0000936clang_type_t
Sean Callanana91dd992010-11-19 02:52:21 +0000937ClangASTContext::GetBuiltInType_bool()
938{
939 return getASTContext()->BoolTy.getAsOpaquePtr();
940}
941
942clang_type_t
Greg Clayton960d6a42010-08-03 00:35:52 +0000943ClangASTContext::GetBuiltInType_objc_id()
944{
Sean Callanane6ea5fe2011-11-15 02:11:17 +0000945 return getASTContext()->getObjCIdType().getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +0000946}
947
Greg Clayton462d4142010-09-29 01:12:09 +0000948clang_type_t
Greg Clayton960d6a42010-08-03 00:35:52 +0000949ClangASTContext::GetBuiltInType_objc_Class()
950{
Sean Callanane6ea5fe2011-11-15 02:11:17 +0000951 return getASTContext()->getObjCClassType().getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +0000952}
953
Greg Clayton462d4142010-09-29 01:12:09 +0000954clang_type_t
Greg Clayton960d6a42010-08-03 00:35:52 +0000955ClangASTContext::GetBuiltInType_objc_selector()
956{
Sean Callanane6ea5fe2011-11-15 02:11:17 +0000957 return getASTContext()->getObjCSelType().getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +0000958}
959
Greg Clayton462d4142010-09-29 01:12:09 +0000960clang_type_t
Sean Callananfb3058e2011-05-12 23:54:16 +0000961ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
962{
963 return ast->UnknownAnyTy.getAsOpaquePtr();
964}
965
966clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +0000967ClangASTContext::GetCStringType (bool is_const)
968{
969 QualType char_type(getASTContext()->CharTy);
970
971 if (is_const)
972 char_type.addConst();
973
974 return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
975}
976
Greg Clayton462d4142010-09-29 01:12:09 +0000977clang_type_t
Sean Callanan8d611562012-04-05 00:12:52 +0000978ClangASTContext::GetVoidType()
979{
980 return GetVoidType(getASTContext());
981}
982
983clang_type_t
984ClangASTContext::GetVoidType(ASTContext *ast)
985{
986 return ast->VoidTy.getAsOpaquePtr();
987}
988
989clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +0000990ClangASTContext::GetVoidPtrType (bool is_const)
991{
992 return GetVoidPtrType(getASTContext(), is_const);
993}
994
Greg Clayton462d4142010-09-29 01:12:09 +0000995clang_type_t
Greg Claytonb01000f2011-01-17 03:46:26 +0000996ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
Chris Lattner24943d22010-06-08 16:52:24 +0000997{
Greg Claytonb01000f2011-01-17 03:46:26 +0000998 QualType void_ptr_type(ast->VoidPtrTy);
Chris Lattner24943d22010-06-08 16:52:24 +0000999
1000 if (is_const)
1001 void_ptr_type.addConst();
1002
1003 return void_ptr_type.getAsOpaquePtr();
1004}
1005
Sean Callanan673f3db2011-11-30 22:11:59 +00001006clang::DeclContext *
1007ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
1008{
1009 return ast->getTranslationUnitDecl();
1010}
1011
Greg Clayton462d4142010-09-29 01:12:09 +00001012clang_type_t
Greg Clayton22defe82010-12-02 23:20:03 +00001013ClangASTContext::CopyType (ASTContext *dst_ast,
1014 ASTContext *src_ast,
Greg Clayton462d4142010-09-29 01:12:09 +00001015 clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00001016{
Sean Callanan8a3b0a82010-11-18 02:56:27 +00001017 FileSystemOptions file_system_options;
Greg Clayton22defe82010-12-02 23:20:03 +00001018 FileManager file_manager (file_system_options);
1019 ASTImporter importer(*dst_ast, file_manager,
Sean Callananad293092011-01-18 23:32:05 +00001020 *src_ast, file_manager,
1021 false);
Sean Callanancf18faa2010-11-09 22:37:10 +00001022
Greg Clayton22defe82010-12-02 23:20:03 +00001023 QualType src (QualType::getFromOpaquePtr(clang_type));
1024 QualType dst (importer.Import(src));
Sean Callanancf18faa2010-11-09 22:37:10 +00001025
1026 return dst.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00001027}
1028
Greg Clayton6916e352010-11-13 03:52:47 +00001029
1030clang::Decl *
Greg Clayton22defe82010-12-02 23:20:03 +00001031ClangASTContext::CopyDecl (ASTContext *dst_ast,
1032 ASTContext *src_ast,
Greg Clayton6916e352010-11-13 03:52:47 +00001033 clang::Decl *source_decl)
Sean Callanan887d2512010-12-11 00:08:56 +00001034{
Sean Callanan8a3b0a82010-11-18 02:56:27 +00001035 FileSystemOptions file_system_options;
Greg Clayton22defe82010-12-02 23:20:03 +00001036 FileManager file_manager (file_system_options);
1037 ASTImporter importer(*dst_ast, file_manager,
Sean Callananad293092011-01-18 23:32:05 +00001038 *src_ast, file_manager,
1039 false);
Greg Clayton6916e352010-11-13 03:52:47 +00001040
1041 return importer.Import(source_decl);
1042}
1043
Sean Callanan8d825062010-07-16 00:00:27 +00001044bool
Greg Claytondc0a38c2012-03-26 23:03:23 +00001045ClangASTContext::AreTypesSame (ASTContext *ast,
1046 clang_type_t type1,
1047 clang_type_t type2,
1048 bool ignore_qualifiers)
Sean Callanan5510ddd2010-07-15 22:30:52 +00001049{
Greg Claytone2f71a32012-04-06 17:38:55 +00001050 if (type1 == type2)
1051 return true;
1052
Sean Callanan70c6cf42012-02-18 02:01:03 +00001053 QualType type1_qual = QualType::getFromOpaquePtr(type1);
1054 QualType type2_qual = QualType::getFromOpaquePtr(type2);
1055
1056 if (ignore_qualifiers)
1057 {
1058 type1_qual = type1_qual.getUnqualifiedType();
1059 type2_qual = type2_qual.getUnqualifiedType();
1060 }
1061
1062 return ast->hasSameType (type1_qual,
1063 type2_qual);
Sean Callanan5510ddd2010-07-15 22:30:52 +00001064}
1065
Chris Lattner24943d22010-06-08 16:52:24 +00001066#pragma mark CVR modifiers
1067
Greg Clayton462d4142010-09-29 01:12:09 +00001068clang_type_t
1069ClangASTContext::AddConstModifier (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00001070{
1071 if (clang_type)
1072 {
1073 QualType result(QualType::getFromOpaquePtr(clang_type));
1074 result.addConst();
1075 return result.getAsOpaquePtr();
1076 }
1077 return NULL;
1078}
1079
Greg Clayton462d4142010-09-29 01:12:09 +00001080clang_type_t
1081ClangASTContext::AddRestrictModifier (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00001082{
1083 if (clang_type)
1084 {
1085 QualType result(QualType::getFromOpaquePtr(clang_type));
1086 result.getQualifiers().setRestrict (true);
1087 return result.getAsOpaquePtr();
1088 }
1089 return NULL;
1090}
1091
Greg Clayton462d4142010-09-29 01:12:09 +00001092clang_type_t
1093ClangASTContext::AddVolatileModifier (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00001094{
1095 if (clang_type)
1096 {
1097 QualType result(QualType::getFromOpaquePtr(clang_type));
1098 result.getQualifiers().setVolatile (true);
1099 return result.getAsOpaquePtr();
1100 }
1101 return NULL;
1102}
1103
Greg Claytonb01000f2011-01-17 03:46:26 +00001104
1105clang_type_t
1106ClangASTContext::GetTypeForDecl (TagDecl *decl)
1107{
1108 // No need to call the getASTContext() accessor (which can create the AST
1109 // if it isn't created yet, because we can't have created a decl in this
1110 // AST if our AST didn't already exist...
1111 if (m_ast_ap.get())
1112 return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1113 return NULL;
1114}
1115
1116clang_type_t
1117ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1118{
1119 // No need to call the getASTContext() accessor (which can create the AST
1120 // if it isn't created yet, because we can't have created a decl in this
1121 // AST if our AST didn't already exist...
1122 if (m_ast_ap.get())
1123 return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1124 return NULL;
1125}
1126
Chris Lattner24943d22010-06-08 16:52:24 +00001127#pragma mark Structure, Unions, Classes
1128
Greg Clayton462d4142010-09-29 01:12:09 +00001129clang_type_t
Jim Inghama32c5a52012-10-27 02:54:13 +00001130ClangASTContext::CreateRecordType (DeclContext *decl_ctx, AccessType access_type, const char *name, int kind, LanguageType language, ClangASTMetadata *metadata)
Chris Lattner24943d22010-06-08 16:52:24 +00001131{
Greg Claytonb01000f2011-01-17 03:46:26 +00001132 ASTContext *ast = getASTContext();
1133 assert (ast != NULL);
Sean Callanana4974db2012-04-18 01:06:17 +00001134
Chris Lattner24943d22010-06-08 16:52:24 +00001135 if (decl_ctx == NULL)
Greg Claytonb01000f2011-01-17 03:46:26 +00001136 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner24943d22010-06-08 16:52:24 +00001137
Greg Clayton9488b742010-07-28 02:04:09 +00001138
Greg Clayton32b4f142011-08-24 23:50:00 +00001139 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9488b742010-07-28 02:04:09 +00001140 {
Greg Clayton306edca2010-10-11 02:25:34 +00001141 bool isForwardDecl = true;
Greg Clayton9488b742010-07-28 02:04:09 +00001142 bool isInternal = false;
Sean Callanana4974db2012-04-18 01:06:17 +00001143 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
Greg Clayton9488b742010-07-28 02:04:09 +00001144 }
1145
Chris Lattner24943d22010-06-08 16:52:24 +00001146 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1147 // we will need to update this code. I was told to currently always use
1148 // the CXXRecordDecl class since we often don't know from debug information
1149 // if something is struct or a class, so we default to always use the more
1150 // complete definition just in case.
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001151 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1152 (TagDecl::TagKind)kind,
1153 decl_ctx,
1154 SourceLocation(),
1155 SourceLocation(),
1156 name && name[0] ? &ast->Idents.get(name) : NULL);
Sean Callanand0d73722012-01-13 22:10:18 +00001157
Jim Inghama32c5a52012-10-27 02:54:13 +00001158 if (decl && metadata)
1159 SetMetadata(ast, (uintptr_t)decl, *metadata);
Sean Callananfafffe02012-04-13 00:10:03 +00001160
Greg Clayton5e8eb5c2011-10-26 03:31:36 +00001161 if (decl_ctx)
1162 {
1163 if (access_type != eAccessNone)
1164 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
1165 decl_ctx->addDecl (decl);
1166 }
Greg Claytonb01000f2011-01-17 03:46:26 +00001167 return ast->getTagDeclType(decl).getAsOpaquePtr();
1168}
1169
Greg Claytonb7fad952012-02-06 06:42:51 +00001170static TemplateParameterList *
1171CreateTemplateParameterList (ASTContext *ast,
Sean Callanan06dc17f2012-09-24 22:25:51 +00001172 const ClangASTContext::TemplateParameterInfos &template_param_infos,
Greg Claytonb7fad952012-02-06 06:42:51 +00001173 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1174{
1175 const bool parameter_pack = false;
1176 const bool is_typename = false;
1177 const unsigned depth = 0;
1178 const size_t num_template_params = template_param_infos.GetSize();
1179 for (size_t i=0; i<num_template_params; ++i)
1180 {
1181 const char *name = template_param_infos.names[i];
Sean Callanan06dc17f2012-09-24 22:25:51 +00001182 if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
Greg Claytonb7fad952012-02-06 06:42:51 +00001183 {
1184 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1185 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1186 SourceLocation(),
1187 SourceLocation(),
1188 depth,
1189 i,
1190 &ast->Idents.get(name),
1191 template_param_infos.args[i].getIntegralType(),
1192 parameter_pack,
1193 NULL));
1194
1195 }
1196 else
1197 {
1198 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1199 ast->getTranslationUnitDecl(), // Is this the right decl context?
1200 SourceLocation(),
1201 SourceLocation(),
1202 depth,
1203 i,
1204 &ast->Idents.get(name),
1205 is_typename,
1206 parameter_pack));
1207 }
1208 }
1209
1210 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1211 SourceLocation(),
1212 SourceLocation(),
1213 &template_param_decls.front(),
1214 template_param_decls.size(),
1215 SourceLocation());
1216 return template_param_list;
1217}
1218
1219clang::FunctionTemplateDecl *
1220ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1221 clang::FunctionDecl *func_decl,
1222 const char *name,
1223 const TemplateParameterInfos &template_param_infos)
1224{
1225// /// \brief Create a function template node.
1226 ASTContext *ast = getASTContext();
1227
1228 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1229
1230 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1231 template_param_infos,
1232 template_param_decls);
1233 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1234 decl_ctx,
1235 func_decl->getLocation(),
1236 func_decl->getDeclName(),
1237 template_param_list,
1238 func_decl);
1239
1240 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1241 i < template_param_decl_count;
1242 ++i)
1243 {
1244 // TODO: verify which decl context we should put template_param_decls into..
1245 template_param_decls[i]->setDeclContext (func_decl);
1246 }
1247
1248 return func_tmpl_decl;
1249}
1250
1251void
1252ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1253 clang::FunctionTemplateDecl *func_tmpl_decl,
1254 const TemplateParameterInfos &infos)
1255{
1256 TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1257 infos.args.data(),
1258 infos.args.size());
1259
1260 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1261 &template_args,
1262 NULL);
1263}
1264
1265
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001266ClassTemplateDecl *
1267ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton5e8eb5c2011-10-26 03:31:36 +00001268 lldb::AccessType access_type,
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001269 const char *class_name,
1270 int kind,
1271 const TemplateParameterInfos &template_param_infos)
1272{
1273 ASTContext *ast = getASTContext();
1274
1275 ClassTemplateDecl *class_template_decl = NULL;
1276 if (decl_ctx == NULL)
1277 decl_ctx = ast->getTranslationUnitDecl();
1278
1279 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1280 DeclarationName decl_name (&identifier_info);
1281
1282 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
1283 for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos)
1284 {
1285 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(*pos);
1286 if (class_template_decl)
1287 return class_template_decl;
1288 }
1289
1290 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001291
Greg Claytonb7fad952012-02-06 06:42:51 +00001292 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1293 template_param_infos,
1294 template_param_decls);
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001295
1296 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1297 (TagDecl::TagKind)kind,
1298 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1299 SourceLocation(),
1300 SourceLocation(),
1301 &identifier_info);
Greg Clayton4b9cf3d2011-12-02 02:09:28 +00001302
1303 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1304 i < template_param_decl_count;
1305 ++i)
1306 {
1307 template_param_decls[i]->setDeclContext (template_cxx_decl);
1308 }
1309
Sean Callanand9b79852011-11-19 01:35:08 +00001310 // With templated classes, we say that a class is templated with
1311 // specializations, but that the bare class has no functions.
1312 template_cxx_decl->startDefinition();
1313 template_cxx_decl->completeDefinition();
1314
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001315 class_template_decl = ClassTemplateDecl::Create (*ast,
1316 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1317 SourceLocation(),
1318 decl_name,
1319 template_param_list,
1320 template_cxx_decl,
1321 NULL);
1322
1323 if (class_template_decl)
Sean Callananc6d161e2011-10-26 01:06:27 +00001324 {
Greg Clayton5e8eb5c2011-10-26 03:31:36 +00001325 if (access_type != eAccessNone)
1326 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan8f2e3922012-02-04 08:49:35 +00001327
1328 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1329 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1330
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001331 decl_ctx->addDecl (class_template_decl);
Sean Callananc6d161e2011-10-26 01:06:27 +00001332
1333#ifdef LLDB_CONFIGURATION_DEBUG
1334 VerifyDecl(class_template_decl);
1335#endif
1336 }
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001337
1338 return class_template_decl;
1339}
1340
1341
1342ClassTemplateSpecializationDecl *
1343ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1344 ClassTemplateDecl *class_template_decl,
1345 int kind,
1346 const TemplateParameterInfos &template_param_infos)
1347{
1348 ASTContext *ast = getASTContext();
1349 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1350 (TagDecl::TagKind)kind,
1351 decl_ctx,
1352 SourceLocation(),
1353 SourceLocation(),
1354 class_template_decl,
1355 &template_param_infos.args.front(),
1356 template_param_infos.args.size(),
1357 NULL);
1358
1359 return class_template_specialization_decl;
1360}
1361
1362lldb::clang_type_t
1363ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1364{
1365 if (class_template_specialization_decl)
1366 {
1367 ASTContext *ast = getASTContext();
1368 if (ast)
1369 return ast->getTagDeclType(class_template_specialization_decl).getAsOpaquePtr();
1370 }
1371 return NULL;
1372}
1373
Greg Claytonb01000f2011-01-17 03:46:26 +00001374bool
1375ClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1376{
1377 if (clang_type == NULL)
1378 return false;
1379
1380 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1381
1382 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1383 switch (type_class)
1384 {
1385 case clang::Type::Record:
1386 {
1387 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1388 if (cxx_record_decl)
1389 {
1390 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
Greg Clayton7a183dc2011-01-20 04:18:48 +00001391 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
Greg Claytonb01000f2011-01-17 03:46:26 +00001392 return true;
1393 }
1394 }
1395 break;
1396
1397 case clang::Type::Enum:
1398 {
1399 EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1400 if (enum_decl)
1401 {
1402 enum_decl->setHasExternalLexicalStorage (has_extern);
Greg Clayton7a183dc2011-01-20 04:18:48 +00001403 enum_decl->setHasExternalVisibleStorage (has_extern);
Greg Claytonb01000f2011-01-17 03:46:26 +00001404 return true;
1405 }
1406 }
1407 break;
1408
1409 case clang::Type::ObjCObject:
1410 case clang::Type::ObjCInterface:
1411 {
Sean Callanand5b3c352011-01-27 04:42:51 +00001412 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Claytonb01000f2011-01-17 03:46:26 +00001413 assert (objc_class_type);
1414 if (objc_class_type)
1415 {
1416 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1417
1418 if (class_interface_decl)
1419 {
Greg Claytonb01000f2011-01-17 03:46:26 +00001420 class_interface_decl->setHasExternalLexicalStorage (has_extern);
Greg Clayton7a183dc2011-01-20 04:18:48 +00001421 class_interface_decl->setHasExternalVisibleStorage (has_extern);
Greg Claytonb01000f2011-01-17 03:46:26 +00001422 return true;
1423 }
1424 }
1425 }
1426 break;
1427
1428 case clang::Type::Typedef:
1429 return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Sean Callananc6139712011-08-11 23:56:13 +00001430
1431 case clang::Type::Elaborated:
1432 return ClangASTContext::SetHasExternalStorage (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
Greg Claytonb01000f2011-01-17 03:46:26 +00001433
1434 default:
1435 break;
1436 }
1437 return false;
Chris Lattner24943d22010-06-08 16:52:24 +00001438}
1439
Greg Claytondbf26152010-10-01 23:13:49 +00001440static bool
1441IsOperator (const char *name, OverloadedOperatorKind &op_kind)
1442{
1443 if (name == NULL || name[0] == '\0')
1444 return false;
1445
Sean Callanan494735d2010-12-10 19:51:54 +00001446#define OPERATOR_PREFIX "operator"
Greg Clayton427f2902010-12-14 02:59:59 +00001447#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
Sean Callananc2c9a142010-12-10 02:15:55 +00001448
1449 const char *post_op_name = NULL;
1450
Sean Callanan494735d2010-12-10 19:51:54 +00001451 bool no_space = true;
Sean Callananc2c9a142010-12-10 02:15:55 +00001452
Greg Clayton427f2902010-12-14 02:59:59 +00001453 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
Greg Claytondbf26152010-10-01 23:13:49 +00001454 return false;
1455
Greg Clayton427f2902010-12-14 02:59:59 +00001456 post_op_name = name + OPERATOR_PREFIX_LENGTH;
1457
Sean Callanan494735d2010-12-10 19:51:54 +00001458 if (post_op_name[0] == ' ')
1459 {
1460 post_op_name++;
1461 no_space = false;
1462 }
1463
1464#undef OPERATOR_PREFIX
Greg Clayton427f2902010-12-14 02:59:59 +00001465#undef OPERATOR_PREFIX_LENGTH
Sean Callanan494735d2010-12-10 19:51:54 +00001466
Greg Claytondbf26152010-10-01 23:13:49 +00001467 // This is an operator, set the overloaded operator kind to invalid
1468 // in case this is a conversion operator...
1469 op_kind = NUM_OVERLOADED_OPERATORS;
1470
1471 switch (post_op_name[0])
1472 {
Sean Callananc2c9a142010-12-10 02:15:55 +00001473 default:
1474 if (no_space)
1475 return false;
1476 break;
Greg Claytondbf26152010-10-01 23:13:49 +00001477 case 'n':
Sean Callananc2c9a142010-12-10 02:15:55 +00001478 if (no_space)
1479 return false;
Greg Claytondbf26152010-10-01 23:13:49 +00001480 if (strcmp (post_op_name, "new") == 0)
1481 op_kind = OO_New;
1482 else if (strcmp (post_op_name, "new[]") == 0)
1483 op_kind = OO_Array_New;
1484 break;
1485
1486 case 'd':
Sean Callananc2c9a142010-12-10 02:15:55 +00001487 if (no_space)
1488 return false;
Greg Claytondbf26152010-10-01 23:13:49 +00001489 if (strcmp (post_op_name, "delete") == 0)
1490 op_kind = OO_Delete;
1491 else if (strcmp (post_op_name, "delete[]") == 0)
1492 op_kind = OO_Array_Delete;
1493 break;
1494
1495 case '+':
1496 if (post_op_name[1] == '\0')
1497 op_kind = OO_Plus;
1498 else if (post_op_name[2] == '\0')
1499 {
1500 if (post_op_name[1] == '=')
1501 op_kind = OO_PlusEqual;
1502 else if (post_op_name[1] == '+')
1503 op_kind = OO_PlusPlus;
1504 }
1505 break;
1506
1507 case '-':
1508 if (post_op_name[1] == '\0')
1509 op_kind = OO_Minus;
1510 else if (post_op_name[2] == '\0')
1511 {
1512 switch (post_op_name[1])
1513 {
1514 case '=': op_kind = OO_MinusEqual; break;
1515 case '-': op_kind = OO_MinusMinus; break;
1516 case '>': op_kind = OO_Arrow; break;
1517 }
1518 }
1519 else if (post_op_name[3] == '\0')
1520 {
1521 if (post_op_name[2] == '*')
1522 op_kind = OO_ArrowStar; break;
1523 }
1524 break;
1525
1526 case '*':
1527 if (post_op_name[1] == '\0')
1528 op_kind = OO_Star;
1529 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1530 op_kind = OO_StarEqual;
1531 break;
1532
1533 case '/':
1534 if (post_op_name[1] == '\0')
1535 op_kind = OO_Slash;
1536 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1537 op_kind = OO_SlashEqual;
1538 break;
1539
1540 case '%':
1541 if (post_op_name[1] == '\0')
1542 op_kind = OO_Percent;
1543 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1544 op_kind = OO_PercentEqual;
1545 break;
1546
1547
1548 case '^':
1549 if (post_op_name[1] == '\0')
1550 op_kind = OO_Caret;
1551 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1552 op_kind = OO_CaretEqual;
1553 break;
1554
1555 case '&':
1556 if (post_op_name[1] == '\0')
1557 op_kind = OO_Amp;
1558 else if (post_op_name[2] == '\0')
1559 {
1560 switch (post_op_name[1])
1561 {
1562 case '=': op_kind = OO_AmpEqual; break;
1563 case '&': op_kind = OO_AmpAmp; break;
1564 }
1565 }
1566 break;
1567
1568 case '|':
1569 if (post_op_name[1] == '\0')
1570 op_kind = OO_Pipe;
1571 else if (post_op_name[2] == '\0')
1572 {
1573 switch (post_op_name[1])
1574 {
1575 case '=': op_kind = OO_PipeEqual; break;
1576 case '|': op_kind = OO_PipePipe; break;
1577 }
1578 }
1579 break;
1580
1581 case '~':
1582 if (post_op_name[1] == '\0')
1583 op_kind = OO_Tilde;
1584 break;
1585
1586 case '!':
1587 if (post_op_name[1] == '\0')
1588 op_kind = OO_Exclaim;
1589 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1590 op_kind = OO_ExclaimEqual;
1591 break;
1592
1593 case '=':
1594 if (post_op_name[1] == '\0')
1595 op_kind = OO_Equal;
1596 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1597 op_kind = OO_EqualEqual;
1598 break;
1599
1600 case '<':
1601 if (post_op_name[1] == '\0')
1602 op_kind = OO_Less;
1603 else if (post_op_name[2] == '\0')
1604 {
1605 switch (post_op_name[1])
1606 {
1607 case '<': op_kind = OO_LessLess; break;
1608 case '=': op_kind = OO_LessEqual; break;
1609 }
1610 }
1611 else if (post_op_name[3] == '\0')
1612 {
1613 if (post_op_name[2] == '=')
1614 op_kind = OO_LessLessEqual;
1615 }
1616 break;
1617
1618 case '>':
1619 if (post_op_name[1] == '\0')
1620 op_kind = OO_Greater;
1621 else if (post_op_name[2] == '\0')
1622 {
1623 switch (post_op_name[1])
1624 {
1625 case '>': op_kind = OO_GreaterGreater; break;
1626 case '=': op_kind = OO_GreaterEqual; break;
1627 }
1628 }
1629 else if (post_op_name[1] == '>' &&
1630 post_op_name[2] == '=' &&
1631 post_op_name[3] == '\0')
1632 {
1633 op_kind = OO_GreaterGreaterEqual;
1634 }
1635 break;
1636
1637 case ',':
1638 if (post_op_name[1] == '\0')
1639 op_kind = OO_Comma;
1640 break;
1641
1642 case '(':
1643 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1644 op_kind = OO_Call;
1645 break;
1646
1647 case '[':
1648 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1649 op_kind = OO_Subscript;
1650 break;
1651 }
1652
1653 return true;
1654}
Greg Claytonb01000f2011-01-17 03:46:26 +00001655
Greg Clayton8c6907c2011-06-19 03:43:27 +00001656static inline bool
Sean Callanan37e27832011-10-15 01:15:07 +00001657check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton8c6907c2011-06-19 03:43:27 +00001658{
Sean Callanan37e27832011-10-15 01:15:07 +00001659 // Special-case call since it can take any number of operands
1660 if(op_kind == OO_Call)
1661 return true;
1662
Greg Clayton8c6907c2011-06-19 03:43:27 +00001663 // The parameter count doens't include "this"
1664 if (num_params == 0)
1665 return unary;
1666 if (num_params == 1)
1667 return binary;
Sean Callanan37e27832011-10-15 01:15:07 +00001668 else
Greg Clayton8c6907c2011-06-19 03:43:27 +00001669 return false;
1670}
Daniel Dunbar354ffde2011-10-31 22:50:57 +00001671
Greg Clayton8c6907c2011-06-19 03:43:27 +00001672bool
1673ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1674{
Sean Callanan8f2e3922012-02-04 08:49:35 +00001675 switch (op_kind)
1676 {
1677 default:
1678 break;
1679 // C++ standard allows any number of arguments to new/delete
1680 case OO_New:
1681 case OO_Array_New:
1682 case OO_Delete:
1683 case OO_Array_Delete:
1684 return true;
1685 }
1686
Sean Callanan37e27832011-10-15 01:15:07 +00001687#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (op_kind, Unary, Binary, num_params);
Greg Clayton8c6907c2011-06-19 03:43:27 +00001688 switch (op_kind)
1689 {
1690#include "clang/Basic/OperatorKinds.def"
1691 default: break;
1692 }
1693 return false;
1694}
1695
Greg Clayton412440a2010-09-23 01:09:21 +00001696CXXMethodDecl *
Sean Callanan79523002010-09-17 02:58:26 +00001697ClangASTContext::AddMethodToCXXRecordType
1698(
Greg Claytonb01000f2011-01-17 03:46:26 +00001699 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00001700 clang_type_t record_opaque_type,
Greg Clayton412440a2010-09-23 01:09:21 +00001701 const char *name,
Greg Clayton462d4142010-09-29 01:12:09 +00001702 clang_type_t method_opaque_type,
Greg Clayton412440a2010-09-23 01:09:21 +00001703 lldb::AccessType access,
Greg Clayton1d8173f2010-09-24 05:15:53 +00001704 bool is_virtual,
1705 bool is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00001706 bool is_inline,
Sean Callanan716e3f02011-11-01 18:07:13 +00001707 bool is_explicit,
Sean Callanan2581dbf2011-11-02 01:38:59 +00001708 bool is_attr_used,
1709 bool is_artificial
Greg Clayton412440a2010-09-23 01:09:21 +00001710)
Sean Callanan79523002010-09-17 02:58:26 +00001711{
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001712 if (!record_opaque_type || !method_opaque_type || !name)
Johnny Chen974fddb2010-09-28 16:10:54 +00001713 return NULL;
Sean Callanan79523002010-09-17 02:58:26 +00001714
Greg Claytonb01000f2011-01-17 03:46:26 +00001715 assert(ast);
Sean Callanan79523002010-09-17 02:58:26 +00001716
Greg Claytonb01000f2011-01-17 03:46:26 +00001717 IdentifierTable *identifier_table = &ast->Idents;
Sean Callanan79523002010-09-17 02:58:26 +00001718
1719 assert(identifier_table);
1720
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001721 QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
Greg Clayton1d8173f2010-09-24 05:15:53 +00001722
Greg Claytonb01000f2011-01-17 03:46:26 +00001723 CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
Sean Callanan79523002010-09-17 02:58:26 +00001724
Greg Clayton1d8173f2010-09-24 05:15:53 +00001725 if (cxx_record_decl == NULL)
Greg Clayton412440a2010-09-23 01:09:21 +00001726 return NULL;
Sean Callanan79523002010-09-17 02:58:26 +00001727
Greg Clayton1d8173f2010-09-24 05:15:53 +00001728 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001729
Greg Clayton30449d52010-10-01 02:31:07 +00001730 CXXMethodDecl *cxx_method_decl = NULL;
Sean Callanan79523002010-09-17 02:58:26 +00001731
Greg Clayton30449d52010-10-01 02:31:07 +00001732 DeclarationName decl_name (&identifier_table->get(name));
Greg Clayton90e325d2010-10-01 03:45:20 +00001733
Sean Callanand5b3c352011-01-27 04:42:51 +00001734 const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
Greg Clayton90e325d2010-10-01 03:45:20 +00001735
Greg Clayton5325a362010-10-02 01:40:05 +00001736 if (function_Type == NULL)
Greg Clayton90e325d2010-10-01 03:45:20 +00001737 return NULL;
1738
Sean Callanand5b3c352011-01-27 04:42:51 +00001739 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
Greg Clayton90e325d2010-10-01 03:45:20 +00001740
1741 if (!method_function_prototype)
1742 return NULL;
1743
1744 unsigned int num_params = method_function_prototype->getNumArgs();
1745
Sean Callanan2581dbf2011-11-02 01:38:59 +00001746 CXXDestructorDecl *cxx_dtor_decl(NULL);
1747 CXXConstructorDecl *cxx_ctor_decl(NULL);
1748
Greg Clayton90e325d2010-10-01 03:45:20 +00001749 if (name[0] == '~')
Greg Clayton30449d52010-10-01 02:31:07 +00001750 {
Sean Callanan2581dbf2011-11-02 01:38:59 +00001751 cxx_dtor_decl = CXXDestructorDecl::Create (*ast,
1752 cxx_record_decl,
1753 SourceLocation(),
1754 DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1755 method_qual_type,
1756 NULL,
1757 is_inline,
1758 is_artificial);
1759 cxx_method_decl = cxx_dtor_decl;
Greg Clayton90e325d2010-10-01 03:45:20 +00001760 }
Greg Claytonb01000f2011-01-17 03:46:26 +00001761 else if (decl_name == cxx_record_decl->getDeclName())
Greg Clayton90e325d2010-10-01 03:45:20 +00001762 {
Sean Callanan2581dbf2011-11-02 01:38:59 +00001763 cxx_ctor_decl = CXXConstructorDecl::Create (*ast,
1764 cxx_record_decl,
1765 SourceLocation(),
1766 DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1767 method_qual_type,
1768 NULL, // TypeSourceInfo *
1769 is_explicit,
1770 is_inline,
1771 is_artificial,
1772 false /*is_constexpr*/);
1773 cxx_method_decl = cxx_ctor_decl;
Greg Clayton30449d52010-10-01 02:31:07 +00001774 }
1775 else
Greg Clayton90e325d2010-10-01 03:45:20 +00001776 {
Greg Claytondbf26152010-10-01 23:13:49 +00001777
1778 OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1779 if (IsOperator (name, op_kind))
Greg Clayton90e325d2010-10-01 03:45:20 +00001780 {
Greg Claytondbf26152010-10-01 23:13:49 +00001781 if (op_kind != NUM_OVERLOADED_OPERATORS)
1782 {
Greg Clayton8c6907c2011-06-19 03:43:27 +00001783 // Check the number of operator parameters. Sometimes we have
1784 // seen bad DWARF that doesn't correctly describe operators and
1785 // if we try to create a methed and add it to the class, clang
1786 // will assert and crash, so we need to make sure things are
1787 // acceptable.
1788 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
1789 return NULL;
Greg Claytonb01000f2011-01-17 03:46:26 +00001790 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton90e325d2010-10-01 03:45:20 +00001791 cxx_record_decl,
Sean Callanan279584c2011-03-15 00:17:19 +00001792 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00001793 DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
Greg Clayton90e325d2010-10-01 03:45:20 +00001794 method_qual_type,
1795 NULL, // TypeSourceInfo *
Greg Claytondbf26152010-10-01 23:13:49 +00001796 is_static,
1797 SC_None,
Sean Callanan279584c2011-03-15 00:17:19 +00001798 is_inline,
Sean Callananc1535182011-10-07 23:18:13 +00001799 false /*is_constexpr*/,
Sean Callanan279584c2011-03-15 00:17:19 +00001800 SourceLocation());
Greg Claytondbf26152010-10-01 23:13:49 +00001801 }
1802 else if (num_params == 0)
1803 {
1804 // Conversion operators don't take params...
Greg Claytonb01000f2011-01-17 03:46:26 +00001805 cxx_method_decl = CXXConversionDecl::Create (*ast,
Greg Claytondbf26152010-10-01 23:13:49 +00001806 cxx_record_decl,
Sean Callanan279584c2011-03-15 00:17:19 +00001807 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00001808 DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
Greg Claytondbf26152010-10-01 23:13:49 +00001809 method_qual_type,
1810 NULL, // TypeSourceInfo *
1811 is_inline,
Sean Callanan279584c2011-03-15 00:17:19 +00001812 is_explicit,
Sean Callananc1535182011-10-07 23:18:13 +00001813 false /*is_constexpr*/,
Sean Callanan279584c2011-03-15 00:17:19 +00001814 SourceLocation());
Greg Claytondbf26152010-10-01 23:13:49 +00001815 }
Greg Clayton90e325d2010-10-01 03:45:20 +00001816 }
Greg Claytondbf26152010-10-01 23:13:49 +00001817
1818 if (cxx_method_decl == NULL)
Greg Clayton90e325d2010-10-01 03:45:20 +00001819 {
Greg Claytonb01000f2011-01-17 03:46:26 +00001820 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton90e325d2010-10-01 03:45:20 +00001821 cxx_record_decl,
Sean Callanan279584c2011-03-15 00:17:19 +00001822 SourceLocation(),
Greg Claytondbf26152010-10-01 23:13:49 +00001823 DeclarationNameInfo (decl_name, SourceLocation()),
Greg Clayton90e325d2010-10-01 03:45:20 +00001824 method_qual_type,
1825 NULL, // TypeSourceInfo *
1826 is_static,
1827 SC_None,
Sean Callanan279584c2011-03-15 00:17:19 +00001828 is_inline,
Sean Callananc1535182011-10-07 23:18:13 +00001829 false /*is_constexpr*/,
Sean Callanan279584c2011-03-15 00:17:19 +00001830 SourceLocation());
Greg Clayton90e325d2010-10-01 03:45:20 +00001831 }
Greg Clayton30449d52010-10-01 02:31:07 +00001832 }
Greg Claytondbf26152010-10-01 23:13:49 +00001833
Greg Clayton462d4142010-09-29 01:12:09 +00001834 AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
Greg Clayton1d8173f2010-09-24 05:15:53 +00001835
1836 cxx_method_decl->setAccess (access_specifier);
1837 cxx_method_decl->setVirtualAsWritten (is_virtual);
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001838
Sean Callanan716e3f02011-11-01 18:07:13 +00001839 if (is_attr_used)
1840 cxx_method_decl->addAttr(::new (*ast) UsedAttr(SourceRange(), *ast));
1841
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001842 // Populate the method decl with parameter decls
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001843
Charles Davisa71464f2011-05-19 23:33:46 +00001844 llvm::SmallVector<ParmVarDecl *, 12> params;
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001845
1846 for (int param_index = 0;
1847 param_index < num_params;
1848 ++param_index)
1849 {
Charles Davisa71464f2011-05-19 23:33:46 +00001850 params.push_back (ParmVarDecl::Create (*ast,
1851 cxx_method_decl,
1852 SourceLocation(),
1853 SourceLocation(),
1854 NULL, // anonymous
1855 method_function_prototype->getArgType(param_index),
1856 NULL,
1857 SC_None,
1858 SC_None,
1859 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001860 }
1861
Sean Callananc1535182011-10-07 23:18:13 +00001862 cxx_method_decl->setParams (ArrayRef<ParmVarDecl*>(params));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001863
Greg Clayton1d8173f2010-09-24 05:15:53 +00001864 cxx_record_decl->addDecl (cxx_method_decl);
Sean Callananc6d161e2011-10-26 01:06:27 +00001865
Greg Claytonf84d4dd2011-11-02 02:06:20 +00001866 // Sometimes the debug info will mention a constructor (default/copy/move),
1867 // destructor, or assignment operator (copy/move) but there won't be any
1868 // version of this in the code. So we check if the function was artificially
1869 // generated and if it is trivial and this lets the compiler/backend know
1870 // that it can inline the IR for these when it needs to and we can avoid a
1871 // "missing function" error when running expressions.
1872
Sean Callanan2581dbf2011-11-02 01:38:59 +00001873 if (is_artificial)
1874 {
Greg Claytonf84d4dd2011-11-02 02:06:20 +00001875 if (cxx_ctor_decl &&
1876 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
1877 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
1878 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
Sean Callanan2581dbf2011-11-02 01:38:59 +00001879 {
1880 cxx_ctor_decl->setDefaulted();
1881 cxx_ctor_decl->setTrivial(true);
1882 }
Greg Claytonf84d4dd2011-11-02 02:06:20 +00001883 else if (cxx_dtor_decl)
Sean Callanan2581dbf2011-11-02 01:38:59 +00001884 {
Greg Claytonf84d4dd2011-11-02 02:06:20 +00001885 if (cxx_record_decl->hasTrivialDestructor())
1886 {
1887 cxx_dtor_decl->setDefaulted();
1888 cxx_dtor_decl->setTrivial(true);
1889 }
1890 }
1891 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
1892 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
1893 {
1894 cxx_method_decl->setDefaulted();
1895 cxx_method_decl->setTrivial(true);
Sean Callanan2581dbf2011-11-02 01:38:59 +00001896 }
1897 }
1898
Sean Callananc6d161e2011-10-26 01:06:27 +00001899#ifdef LLDB_CONFIGURATION_DEBUG
1900 VerifyDecl(cxx_method_decl);
1901#endif
Greg Clayton7a183dc2011-01-20 04:18:48 +00001902
1903// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
1904// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
1905// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
1906// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
1907// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
1908// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
1909// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
1910// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
1911// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
Greg Clayton412440a2010-09-23 01:09:21 +00001912 return cxx_method_decl;
Sean Callanan79523002010-09-17 02:58:26 +00001913}
1914
Jim Ingham2546fd22011-11-12 01:36:43 +00001915clang::FieldDecl *
Greg Clayton84f80752010-07-22 18:30:50 +00001916ClangASTContext::AddFieldToRecordType
1917(
Greg Claytonb01000f2011-01-17 03:46:26 +00001918 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00001919 clang_type_t record_clang_type,
Greg Clayton84f80752010-07-22 18:30:50 +00001920 const char *name,
Greg Clayton462d4142010-09-29 01:12:09 +00001921 clang_type_t field_type,
Greg Clayton84f80752010-07-22 18:30:50 +00001922 AccessType access,
1923 uint32_t bitfield_bit_size
1924)
Chris Lattner24943d22010-06-08 16:52:24 +00001925{
1926 if (record_clang_type == NULL || field_type == NULL)
Jim Ingham2546fd22011-11-12 01:36:43 +00001927 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001928
Jim Ingham2546fd22011-11-12 01:36:43 +00001929 FieldDecl *field = NULL;
Greg Claytonb01000f2011-01-17 03:46:26 +00001930 IdentifierTable *identifier_table = &ast->Idents;
Chris Lattner24943d22010-06-08 16:52:24 +00001931
Greg Claytonb01000f2011-01-17 03:46:26 +00001932 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +00001933 assert (identifier_table != NULL);
1934
1935 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
1936
Sean Callanand5b3c352011-01-27 04:42:51 +00001937 const clang::Type *clang_type = record_qual_type.getTypePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00001938 if (clang_type)
1939 {
1940 const RecordType *record_type = dyn_cast<RecordType>(clang_type);
1941
1942 if (record_type)
1943 {
1944 RecordDecl *record_decl = record_type->getDecl();
1945
Chris Lattner24943d22010-06-08 16:52:24 +00001946 clang::Expr *bit_width = NULL;
1947 if (bitfield_bit_size != 0)
1948 {
Greg Claytonb01000f2011-01-17 03:46:26 +00001949 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1950 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Chris Lattner24943d22010-06-08 16:52:24 +00001951 }
Jim Ingham2546fd22011-11-12 01:36:43 +00001952 field = FieldDecl::Create (*ast,
Sean Callanan06dc17f2012-09-24 22:25:51 +00001953 record_decl,
1954 SourceLocation(),
1955 SourceLocation(),
1956 name ? &identifier_table->get(name) : NULL, // Identifier
1957 QualType::getFromOpaquePtr(field_type), // Field type
1958 NULL, // TInfo *
1959 bit_width, // BitWidth
1960 false, // Mutable
1961 ICIS_NoInit); // HasInit
Sean Callanan3552ed02012-03-02 01:03:45 +00001962
Sean Callanane9fcfd92012-07-13 20:01:02 +00001963 if (!name) {
1964 // Determine whether this field corresponds to an anonymous
1965 // struct or union.
1966 if (const TagType *TagT = field->getType()->getAs<TagType>()) {
1967 if (RecordDecl *Rec = dyn_cast<RecordDecl>(TagT->getDecl()))
1968 if (!Rec->getDeclName()) {
1969 Rec->setAnonymousStructOrUnion(true);
1970 field->setImplicit();
1971
1972 }
1973 }
1974 }
Chris Lattner24943d22010-06-08 16:52:24 +00001975
Greg Clayton84f80752010-07-22 18:30:50 +00001976 field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
Chris Lattner24943d22010-06-08 16:52:24 +00001977
1978 if (field)
1979 {
1980 record_decl->addDecl(field);
Sean Callananc6d161e2011-10-26 01:06:27 +00001981
1982#ifdef LLDB_CONFIGURATION_DEBUG
1983 VerifyDecl(field);
1984#endif
Chris Lattner24943d22010-06-08 16:52:24 +00001985 }
1986 }
Greg Clayton9488b742010-07-28 02:04:09 +00001987 else
1988 {
Sean Callanand5b3c352011-01-27 04:42:51 +00001989 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
Greg Clayton9488b742010-07-28 02:04:09 +00001990 if (objc_class_type)
1991 {
Greg Clayton1d8173f2010-09-24 05:15:53 +00001992 bool is_synthesized = false;
Jim Ingham2546fd22011-11-12 01:36:43 +00001993 field = ClangASTContext::AddObjCClassIVar (ast,
Sean Callanan60a0ced2010-09-16 20:01:08 +00001994 record_clang_type,
Greg Clayton9488b742010-07-28 02:04:09 +00001995 name,
1996 field_type,
1997 access,
1998 bitfield_bit_size,
Greg Clayton1d8173f2010-09-24 05:15:53 +00001999 is_synthesized);
Greg Clayton9488b742010-07-28 02:04:09 +00002000 }
2001 }
Chris Lattner24943d22010-06-08 16:52:24 +00002002 }
Jim Ingham2546fd22011-11-12 01:36:43 +00002003 return field;
Chris Lattner24943d22010-06-08 16:52:24 +00002004}
2005
Sean Callanan3552ed02012-03-02 01:03:45 +00002006static clang::AccessSpecifier UnifyAccessSpecifiers (clang::AccessSpecifier lhs,
2007 clang::AccessSpecifier rhs)
2008{
2009 clang::AccessSpecifier ret = lhs;
2010
2011 // Make the access equal to the stricter of the field and the nested field's access
2012 switch (ret)
2013 {
2014 case clang::AS_none:
2015 break;
2016 case clang::AS_private:
2017 break;
2018 case clang::AS_protected:
2019 if (rhs == AS_private)
2020 ret = AS_private;
2021 break;
2022 case clang::AS_public:
2023 ret = rhs;
2024 break;
2025 }
2026
2027 return ret;
2028}
2029
2030void
2031ClangASTContext::BuildIndirectFields (clang::ASTContext *ast,
2032 lldb::clang_type_t record_clang_type)
2033{
2034 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
2035
2036 const RecordType *record_type = record_qual_type->getAs<RecordType>();
2037
2038 if (!record_type)
2039 return;
2040
2041 RecordDecl *record_decl = record_type->getDecl();
2042
2043 if (!record_decl)
2044 return;
2045
2046 typedef llvm::SmallVector <IndirectFieldDecl *, 1> IndirectFieldVector;
2047
2048 IndirectFieldVector indirect_fields;
Greg Claytonb9124572012-12-06 02:33:54 +00002049 RecordDecl::field_iterator field_pos;
2050 RecordDecl::field_iterator field_end_pos = record_decl->field_end();
2051 RecordDecl::field_iterator last_field_pos = field_end_pos;
2052 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
Sean Callanan3552ed02012-03-02 01:03:45 +00002053 {
Greg Claytonb9124572012-12-06 02:33:54 +00002054 if (field_pos->isAnonymousStructOrUnion())
Sean Callanan3552ed02012-03-02 01:03:45 +00002055 {
Greg Claytonb9124572012-12-06 02:33:54 +00002056 QualType field_qual_type = field_pos->getType();
Sean Callanan3552ed02012-03-02 01:03:45 +00002057
2058 const RecordType *field_record_type = field_qual_type->getAs<RecordType>();
2059
2060 if (!field_record_type)
2061 continue;
2062
2063 RecordDecl *field_record_decl = field_record_type->getDecl();
2064
2065 if (!field_record_decl)
2066 continue;
2067
2068 for (RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
2069 di != de;
2070 ++di)
2071 {
2072 if (FieldDecl *nested_field_decl = dyn_cast<FieldDecl>(*di))
2073 {
2074 NamedDecl **chain = new (*ast) NamedDecl*[2];
Greg Claytonb9124572012-12-06 02:33:54 +00002075 chain[0] = *field_pos;
Sean Callanan3552ed02012-03-02 01:03:45 +00002076 chain[1] = nested_field_decl;
2077 IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*ast,
2078 record_decl,
2079 SourceLocation(),
2080 nested_field_decl->getIdentifier(),
2081 nested_field_decl->getType(),
2082 chain,
2083 2);
2084
Greg Claytonb9124572012-12-06 02:33:54 +00002085 indirect_field->setAccess(UnifyAccessSpecifiers(field_pos->getAccess(),
Sean Callanan3552ed02012-03-02 01:03:45 +00002086 nested_field_decl->getAccess()));
2087
2088 indirect_fields.push_back(indirect_field);
2089 }
2090 else if (IndirectFieldDecl *nested_indirect_field_decl = dyn_cast<IndirectFieldDecl>(*di))
2091 {
2092 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
2093 NamedDecl **chain = new (*ast) NamedDecl*[nested_chain_size + 1];
Greg Claytonb9124572012-12-06 02:33:54 +00002094 chain[0] = *field_pos;
Sean Callanan3552ed02012-03-02 01:03:45 +00002095
2096 int chain_index = 1;
2097 for (IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
2098 nce = nested_indirect_field_decl->chain_end();
2099 nci < nce;
2100 ++nci)
2101 {
2102 chain[chain_index] = *nci;
2103 chain_index++;
2104 }
2105
2106 IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*ast,
2107 record_decl,
2108 SourceLocation(),
2109 nested_indirect_field_decl->getIdentifier(),
2110 nested_indirect_field_decl->getType(),
2111 chain,
2112 nested_chain_size + 1);
2113
Greg Claytonb9124572012-12-06 02:33:54 +00002114 indirect_field->setAccess(UnifyAccessSpecifiers(field_pos->getAccess(),
Sean Callanan3552ed02012-03-02 01:03:45 +00002115 nested_indirect_field_decl->getAccess()));
2116
2117 indirect_fields.push_back(indirect_field);
2118 }
2119 }
2120 }
2121 }
2122
Greg Claytonb9124572012-12-06 02:33:54 +00002123 // Check the last field to see if it has an incomplete array type as its
2124 // last member and if it does, the tell the record decl about it
2125 if (last_field_pos != field_end_pos)
2126 {
2127 if (last_field_pos->getType()->isIncompleteArrayType())
2128 record_decl->hasFlexibleArrayMember();
2129 }
2130
Sean Callanan3552ed02012-03-02 01:03:45 +00002131 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
2132 ifi < ife;
2133 ++ifi)
2134 {
2135 record_decl->addDecl(*ifi);
2136 }
2137}
2138
Chris Lattner24943d22010-06-08 16:52:24 +00002139bool
2140ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
2141{
2142 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
2143}
2144
2145bool
2146ClangASTContext::FieldIsBitfield
2147(
Greg Claytonb01000f2011-01-17 03:46:26 +00002148 ASTContext *ast,
Chris Lattner24943d22010-06-08 16:52:24 +00002149 FieldDecl* field,
2150 uint32_t& bitfield_bit_size
2151)
2152{
Greg Claytonb01000f2011-01-17 03:46:26 +00002153 if (ast == NULL || field == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00002154 return false;
2155
2156 if (field->isBitField())
2157 {
2158 Expr* bit_width_expr = field->getBitWidth();
2159 if (bit_width_expr)
2160 {
2161 llvm::APSInt bit_width_apsint;
Greg Claytonb01000f2011-01-17 03:46:26 +00002162 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner24943d22010-06-08 16:52:24 +00002163 {
2164 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
2165 return true;
2166 }
2167 }
2168 }
2169 return false;
2170}
2171
2172bool
2173ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
2174{
2175 if (record_decl == NULL)
2176 return false;
2177
2178 if (!record_decl->field_empty())
2179 return true;
2180
2181 // No fields, lets check this is a CXX record and check the base classes
2182 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2183 if (cxx_record_decl)
2184 {
2185 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2186 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2187 base_class != base_class_end;
2188 ++base_class)
2189 {
2190 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2191 if (RecordHasFields(base_class_decl))
2192 return true;
2193 }
2194 }
2195 return false;
2196}
2197
2198void
Greg Claytonb01000f2011-01-17 03:46:26 +00002199ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
Chris Lattner24943d22010-06-08 16:52:24 +00002200{
Greg Claytonb01000f2011-01-17 03:46:26 +00002201 if (clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00002202 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002203 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2204
Sean Callanand5b3c352011-01-27 04:42:51 +00002205 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
Greg Claytonb01000f2011-01-17 03:46:26 +00002206 if (record_type)
Chris Lattner24943d22010-06-08 16:52:24 +00002207 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002208 RecordDecl *record_decl = record_type->getDecl();
2209 if (record_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00002210 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002211 uint32_t field_idx;
2212 RecordDecl::field_iterator field, field_end;
2213 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2214 field != field_end;
2215 ++field, ++field_idx)
Chris Lattner24943d22010-06-08 16:52:24 +00002216 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002217 // If no accessibility was assigned, assign the correct one
2218 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2219 field->setAccess ((AccessSpecifier)default_accessibility);
Chris Lattner24943d22010-06-08 16:52:24 +00002220 }
2221 }
2222 }
2223 }
2224}
2225
2226#pragma mark C++ Base Classes
2227
2228CXXBaseSpecifier *
Greg Clayton462d4142010-09-29 01:12:09 +00002229ClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
Chris Lattner24943d22010-06-08 16:52:24 +00002230{
2231 if (base_class_type)
Greg Clayton6e713402010-07-30 20:30:44 +00002232 return new CXXBaseSpecifier (SourceRange(),
2233 is_virtual,
2234 base_of_class,
2235 ConvertAccessTypeToAccessSpecifier (access),
Sean Callananad293092011-01-18 23:32:05 +00002236 getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
2237 SourceLocation());
Chris Lattner24943d22010-06-08 16:52:24 +00002238 return NULL;
2239}
2240
Greg Claytone9d0df42010-07-02 01:29:13 +00002241void
2242ClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
2243{
2244 for (unsigned i=0; i<num_base_classes; ++i)
2245 {
2246 delete base_classes[i];
2247 base_classes[i] = NULL;
2248 }
2249}
2250
Chris Lattner24943d22010-06-08 16:52:24 +00002251bool
Greg Clayton462d4142010-09-29 01:12:09 +00002252ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
Chris Lattner24943d22010-06-08 16:52:24 +00002253{
2254 if (class_clang_type)
2255 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002256 CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
2257 if (cxx_record_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00002258 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002259 cxx_record_decl->setBases(base_classes, num_base_classes);
2260 return true;
Chris Lattner24943d22010-06-08 16:52:24 +00002261 }
2262 }
2263 return false;
2264}
Greg Clayton84f80752010-07-22 18:30:50 +00002265#pragma mark Objective C Classes
Chris Lattner24943d22010-06-08 16:52:24 +00002266
Greg Clayton462d4142010-09-29 01:12:09 +00002267clang_type_t
Sean Callanana4974db2012-04-18 01:06:17 +00002268ClangASTContext::CreateObjCClass
Greg Clayton84f80752010-07-22 18:30:50 +00002269(
2270 const char *name,
2271 DeclContext *decl_ctx,
2272 bool isForwardDecl,
Sean Callanana4974db2012-04-18 01:06:17 +00002273 bool isInternal,
Jim Inghama32c5a52012-10-27 02:54:13 +00002274 ClangASTMetadata *metadata
Greg Clayton84f80752010-07-22 18:30:50 +00002275)
2276{
Greg Claytonb01000f2011-01-17 03:46:26 +00002277 ASTContext *ast = getASTContext();
2278 assert (ast != NULL);
Greg Clayton84f80752010-07-22 18:30:50 +00002279 assert (name && name[0]);
2280 if (decl_ctx == NULL)
Greg Claytonb01000f2011-01-17 03:46:26 +00002281 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton84f80752010-07-22 18:30:50 +00002282
2283 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
2284 // we will need to update this code. I was told to currently always use
2285 // the CXXRecordDecl class since we often don't know from debug information
2286 // if something is struct or a class, so we default to always use the more
2287 // complete definition just in case.
Greg Claytonb01000f2011-01-17 03:46:26 +00002288 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton84f80752010-07-22 18:30:50 +00002289 decl_ctx,
2290 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00002291 &ast->Idents.get(name),
Sean Callanan8f2e3922012-02-04 08:49:35 +00002292 NULL,
Greg Clayton84f80752010-07-22 18:30:50 +00002293 SourceLocation(),
Sean Callanan8f2e3922012-02-04 08:49:35 +00002294 /*isForwardDecl,*/
Greg Clayton84f80752010-07-22 18:30:50 +00002295 isInternal);
Greg Clayton9488b742010-07-28 02:04:09 +00002296
Jim Inghama32c5a52012-10-27 02:54:13 +00002297 if (decl && metadata)
2298 SetMetadata(ast, (uintptr_t)decl, *metadata);
Sean Callanana4974db2012-04-18 01:06:17 +00002299
Greg Claytonb01000f2011-01-17 03:46:26 +00002300 return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
Greg Clayton84f80752010-07-22 18:30:50 +00002301}
2302
2303bool
Greg Clayton462d4142010-09-29 01:12:09 +00002304ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
Greg Clayton84f80752010-07-22 18:30:50 +00002305{
2306 if (class_opaque_type && super_opaque_type)
2307 {
2308 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2309 QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
Sean Callanand5b3c352011-01-27 04:42:51 +00002310 const clang::Type *class_type = class_qual_type.getTypePtr();
2311 const clang::Type *super_type = super_qual_type.getTypePtr();
Greg Clayton84f80752010-07-22 18:30:50 +00002312 if (class_type && super_type)
2313 {
Sean Callanand5b3c352011-01-27 04:42:51 +00002314 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2315 const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
Greg Clayton84f80752010-07-22 18:30:50 +00002316 if (objc_class_type && objc_super_type)
2317 {
2318 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2319 ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
2320 if (class_interface_decl && super_interface_decl)
2321 {
2322 class_interface_decl->setSuperClass(super_interface_decl);
2323 return true;
2324 }
2325 }
2326 }
2327 }
2328 return false;
2329}
2330
2331
Jim Ingham2546fd22011-11-12 01:36:43 +00002332FieldDecl *
Greg Clayton84f80752010-07-22 18:30:50 +00002333ClangASTContext::AddObjCClassIVar
2334(
Greg Claytonb01000f2011-01-17 03:46:26 +00002335 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00002336 clang_type_t class_opaque_type,
Greg Clayton84f80752010-07-22 18:30:50 +00002337 const char *name,
Greg Clayton462d4142010-09-29 01:12:09 +00002338 clang_type_t ivar_opaque_type,
Greg Clayton84f80752010-07-22 18:30:50 +00002339 AccessType access,
2340 uint32_t bitfield_bit_size,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002341 bool is_synthesized
Greg Clayton84f80752010-07-22 18:30:50 +00002342)
2343{
2344 if (class_opaque_type == NULL || ivar_opaque_type == NULL)
Jim Ingham2546fd22011-11-12 01:36:43 +00002345 return NULL;
Greg Clayton84f80752010-07-22 18:30:50 +00002346
Jim Ingham2546fd22011-11-12 01:36:43 +00002347 ObjCIvarDecl *field = NULL;
2348
Greg Claytonb01000f2011-01-17 03:46:26 +00002349 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton84f80752010-07-22 18:30:50 +00002350
Greg Claytonb01000f2011-01-17 03:46:26 +00002351 assert (ast != NULL);
Greg Clayton84f80752010-07-22 18:30:50 +00002352 assert (identifier_table != NULL);
2353
2354 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2355
Sean Callanand5b3c352011-01-27 04:42:51 +00002356 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton84f80752010-07-22 18:30:50 +00002357 if (class_type)
2358 {
Sean Callanand5b3c352011-01-27 04:42:51 +00002359 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton84f80752010-07-22 18:30:50 +00002360
2361 if (objc_class_type)
2362 {
2363 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2364
2365 if (class_interface_decl)
2366 {
2367 clang::Expr *bit_width = NULL;
2368 if (bitfield_bit_size != 0)
2369 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002370 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
2371 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Greg Clayton84f80752010-07-22 18:30:50 +00002372 }
2373
Jim Ingham2546fd22011-11-12 01:36:43 +00002374 field = ObjCIvarDecl::Create (*ast,
2375 class_interface_decl,
2376 SourceLocation(),
2377 SourceLocation(),
Greg Claytonf270fa92012-11-06 00:20:41 +00002378 name ? &identifier_table->get(name) : NULL, // Identifier
Jim Ingham2546fd22011-11-12 01:36:43 +00002379 QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
2380 NULL, // TypeSourceInfo *
2381 ConvertAccessTypeToObjCIvarAccessControl (access),
2382 bit_width,
2383 is_synthesized);
Greg Clayton9488b742010-07-28 02:04:09 +00002384
2385 if (field)
2386 {
2387 class_interface_decl->addDecl(field);
Sean Callananc6d161e2011-10-26 01:06:27 +00002388
2389#ifdef LLDB_CONFIGURATION_DEBUG
2390 VerifyDecl(field);
2391#endif
2392
Jim Ingham2546fd22011-11-12 01:36:43 +00002393 return field;
Greg Clayton9488b742010-07-28 02:04:09 +00002394 }
Greg Clayton84f80752010-07-22 18:30:50 +00002395 }
2396 }
2397 }
Jim Ingham2546fd22011-11-12 01:36:43 +00002398 return NULL;
2399}
2400
2401bool
2402ClangASTContext::AddObjCClassProperty
2403(
2404 ASTContext *ast,
2405 clang_type_t class_opaque_type,
2406 const char *property_name,
2407 clang_type_t property_opaque_type,
2408 ObjCIvarDecl *ivar_decl,
2409 const char *property_setter_name,
2410 const char *property_getter_name,
Sean Callanana4974db2012-04-18 01:06:17 +00002411 uint32_t property_attributes,
Jim Inghama32c5a52012-10-27 02:54:13 +00002412 ClangASTMetadata *metadata
Jim Ingham2546fd22011-11-12 01:36:43 +00002413)
2414{
Sean Callananda81dae2011-12-09 23:24:26 +00002415 if (class_opaque_type == NULL || property_name == NULL || property_name[0] == '\0')
Jim Ingham2546fd22011-11-12 01:36:43 +00002416 return false;
2417
2418 IdentifierTable *identifier_table = &ast->Idents;
2419
2420 assert (ast != NULL);
2421 assert (identifier_table != NULL);
2422
2423 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2424 const clang::Type *class_type = class_qual_type.getTypePtr();
2425 if (class_type)
2426 {
2427 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2428
2429 if (objc_class_type)
2430 {
2431 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2432
Greg Clayton4a379b12012-07-17 03:23:13 +00002433 clang_type_t property_opaque_type_to_access = NULL;
Sean Callananda81dae2011-12-09 23:24:26 +00002434
2435 if (property_opaque_type)
2436 property_opaque_type_to_access = property_opaque_type;
2437 else if (ivar_decl)
2438 property_opaque_type_to_access = ivar_decl->getType().getAsOpaquePtr();
2439
Sean Callananda81dae2011-12-09 23:24:26 +00002440 if (class_interface_decl && property_opaque_type_to_access)
Jim Ingham2546fd22011-11-12 01:36:43 +00002441 {
2442 clang::TypeSourceInfo *prop_type_source;
2443 if (ivar_decl)
2444 prop_type_source = ast->CreateTypeSourceInfo (ivar_decl->getType());
2445 else
2446 prop_type_source = ast->CreateTypeSourceInfo (QualType::getFromOpaquePtr(property_opaque_type));
2447
2448 ObjCPropertyDecl *property_decl = ObjCPropertyDecl::Create(*ast,
2449 class_interface_decl,
2450 SourceLocation(), // Source Location
2451 &identifier_table->get(property_name),
2452 SourceLocation(), //Source Location for AT
Sean Callanan142f94c2012-03-01 02:03:47 +00002453 SourceLocation(), //Source location for (
Jim Ingham2546fd22011-11-12 01:36:43 +00002454 prop_type_source
2455 );
Sean Callanana4974db2012-04-18 01:06:17 +00002456
Sean Callananda81dae2011-12-09 23:24:26 +00002457 if (property_decl)
2458 {
Jim Inghama32c5a52012-10-27 02:54:13 +00002459 if (metadata)
2460 SetMetadata(ast, (uintptr_t)property_decl, *metadata);
Sean Callanana4974db2012-04-18 01:06:17 +00002461
Jim Ingham2546fd22011-11-12 01:36:43 +00002462 class_interface_decl->addDecl (property_decl);
Sean Callananda81dae2011-12-09 23:24:26 +00002463
2464 Selector setter_sel, getter_sel;
2465
Jim Ingham2546fd22011-11-12 01:36:43 +00002466 if (property_setter_name != NULL)
2467 {
2468 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
2469 clang::IdentifierInfo *setter_ident = &identifier_table->get(property_setter_no_colon.c_str());
Sean Callananda81dae2011-12-09 23:24:26 +00002470 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
Jim Ingham2546fd22011-11-12 01:36:43 +00002471 }
Sean Callananda81dae2011-12-09 23:24:26 +00002472 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
2473 {
2474 std::string setter_sel_string("set");
2475 setter_sel_string.push_back(::toupper(property_name[0]));
2476 setter_sel_string.append(&property_name[1]);
2477 clang::IdentifierInfo *setter_ident = &identifier_table->get(setter_sel_string.c_str());
2478 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
2479 }
Sean Callanan8d611562012-04-05 00:12:52 +00002480 property_decl->setSetterName(setter_sel);
2481 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
Jim Ingham2546fd22011-11-12 01:36:43 +00002482
2483 if (property_getter_name != NULL)
2484 {
2485 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_getter_name);
Sean Callananda81dae2011-12-09 23:24:26 +00002486 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Sean Callananda81dae2011-12-09 23:24:26 +00002487 }
2488 else
2489 {
2490 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_name);
2491 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Jim Ingham2546fd22011-11-12 01:36:43 +00002492 }
Sean Callanan8d611562012-04-05 00:12:52 +00002493 property_decl->setGetterName(getter_sel);
2494 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
Jim Ingham2546fd22011-11-12 01:36:43 +00002495
2496 if (ivar_decl)
2497 property_decl->setPropertyIvarDecl (ivar_decl);
2498
2499 if (property_attributes & DW_APPLE_PROPERTY_readonly)
2500 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
2501 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
2502 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
2503 if (property_attributes & DW_APPLE_PROPERTY_assign)
2504 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
2505 if (property_attributes & DW_APPLE_PROPERTY_retain)
2506 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
2507 if (property_attributes & DW_APPLE_PROPERTY_copy)
2508 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
2509 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
2510 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
Sean Callananda81dae2011-12-09 23:24:26 +00002511
2512 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
2513 {
2514 QualType result_type = QualType::getFromOpaquePtr(property_opaque_type_to_access);
2515
2516 const bool isInstance = true;
2517 const bool isVariadic = false;
2518 const bool isSynthesized = false;
2519 const bool isImplicitlyDeclared = true;
2520 const bool isDefined = false;
2521 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2522 const bool HasRelatedResultType = false;
2523
2524 ObjCMethodDecl *getter = ObjCMethodDecl::Create(*ast,
2525 SourceLocation(),
2526 SourceLocation(),
2527 getter_sel,
2528 result_type,
2529 NULL,
2530 class_interface_decl,
2531 isInstance,
2532 isVariadic,
2533 isSynthesized,
2534 isImplicitlyDeclared,
2535 isDefined,
2536 impControl,
2537 HasRelatedResultType);
Sean Callanana4974db2012-04-18 01:06:17 +00002538
Jim Inghama32c5a52012-10-27 02:54:13 +00002539 if (getter && metadata)
2540 SetMetadata(ast, (uintptr_t)getter, *metadata);
Sean Callananda81dae2011-12-09 23:24:26 +00002541
2542 getter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(), ArrayRef<SourceLocation>());
2543
2544 class_interface_decl->addDecl(getter);
2545 }
2546
2547 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
2548 {
2549 QualType result_type = ast->VoidTy;
2550
2551 const bool isInstance = true;
2552 const bool isVariadic = false;
2553 const bool isSynthesized = false;
2554 const bool isImplicitlyDeclared = true;
2555 const bool isDefined = false;
2556 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2557 const bool HasRelatedResultType = false;
2558
2559 ObjCMethodDecl *setter = ObjCMethodDecl::Create(*ast,
2560 SourceLocation(),
2561 SourceLocation(),
2562 setter_sel,
2563 result_type,
2564 NULL,
2565 class_interface_decl,
2566 isInstance,
2567 isVariadic,
2568 isSynthesized,
2569 isImplicitlyDeclared,
2570 isDefined,
2571 impControl,
2572 HasRelatedResultType);
2573
Jim Inghama32c5a52012-10-27 02:54:13 +00002574 if (setter && metadata)
2575 SetMetadata(ast, (uintptr_t)setter, *metadata);
Sean Callanana4974db2012-04-18 01:06:17 +00002576
Sean Callananda81dae2011-12-09 23:24:26 +00002577 llvm::SmallVector<ParmVarDecl *, 1> params;
2578
2579 params.push_back (ParmVarDecl::Create (*ast,
2580 setter,
2581 SourceLocation(),
2582 SourceLocation(),
2583 NULL, // anonymous
2584 QualType::getFromOpaquePtr(property_opaque_type_to_access),
2585 NULL,
2586 SC_Auto,
2587 SC_Auto,
2588 NULL));
2589
2590 setter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
2591
2592 class_interface_decl->addDecl(setter);
2593 }
Jim Ingham2546fd22011-11-12 01:36:43 +00002594
2595 return true;
Sean Callananda81dae2011-12-09 23:24:26 +00002596 }
Jim Ingham2546fd22011-11-12 01:36:43 +00002597 }
2598 }
2599 }
Greg Clayton84f80752010-07-22 18:30:50 +00002600 return false;
2601}
Chris Lattner24943d22010-06-08 16:52:24 +00002602
Greg Clayton9488b742010-07-28 02:04:09 +00002603bool
Greg Clayton462d4142010-09-29 01:12:09 +00002604ClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
Greg Clayton9488b742010-07-28 02:04:09 +00002605{
2606 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2607
Sean Callanand5b3c352011-01-27 04:42:51 +00002608 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton9488b742010-07-28 02:04:09 +00002609 if (class_type)
2610 {
Sean Callanand5b3c352011-01-27 04:42:51 +00002611 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton9488b742010-07-28 02:04:09 +00002612
2613 if (objc_class_type)
2614 return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
2615 }
2616 return false;
2617}
2618
2619bool
2620ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
2621{
2622 while (class_interface_decl)
2623 {
2624 if (class_interface_decl->ivar_size() > 0)
2625 return true;
2626
2627 if (check_superclass)
2628 class_interface_decl = class_interface_decl->getSuperClass();
2629 else
2630 break;
2631 }
2632 return false;
2633}
Greg Clayton1d8173f2010-09-24 05:15:53 +00002634
Greg Clayton462d4142010-09-29 01:12:09 +00002635ObjCMethodDecl *
Greg Clayton1d8173f2010-09-24 05:15:53 +00002636ClangASTContext::AddMethodToObjCObjectType
2637(
Greg Claytonb01000f2011-01-17 03:46:26 +00002638 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00002639 clang_type_t class_opaque_type,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002640 const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
Greg Clayton462d4142010-09-29 01:12:09 +00002641 clang_type_t method_opaque_type,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002642 lldb::AccessType access
2643)
2644{
2645 if (class_opaque_type == NULL || method_opaque_type == NULL)
2646 return NULL;
2647
Greg Claytonb01000f2011-01-17 03:46:26 +00002648 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002649
Greg Claytonb01000f2011-01-17 03:46:26 +00002650 assert (ast != NULL);
Greg Clayton1d8173f2010-09-24 05:15:53 +00002651 assert (identifier_table != NULL);
2652
2653 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2654
Sean Callanand5b3c352011-01-27 04:42:51 +00002655 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton1d8173f2010-09-24 05:15:53 +00002656 if (class_type == NULL)
2657 return NULL;
2658
Sean Callanand5b3c352011-01-27 04:42:51 +00002659 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton1d8173f2010-09-24 05:15:53 +00002660
2661 if (objc_class_type == NULL)
2662 return NULL;
2663
2664 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2665
2666 if (class_interface_decl == NULL)
2667 return NULL;
Greg Clayton9488b742010-07-28 02:04:09 +00002668
Greg Clayton1d8173f2010-09-24 05:15:53 +00002669 const char *selector_start = ::strchr (name, ' ');
2670 if (selector_start == NULL)
2671 return NULL;
2672
2673 selector_start++;
2674 if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
2675 return NULL;
2676 llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
2677
Greg Claytonad60bf42010-10-12 02:24:53 +00002678 size_t len = 0;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002679 const char *start;
Greg Claytonad60bf42010-10-12 02:24:53 +00002680 //printf ("name = '%s'\n", name);
2681
2682 unsigned num_selectors_with_args = 0;
2683 for (start = selector_start;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002684 start && *start != '\0' && *start != ']';
Greg Claytonad60bf42010-10-12 02:24:53 +00002685 start += len)
Greg Clayton1d8173f2010-09-24 05:15:53 +00002686 {
Greg Claytonad60bf42010-10-12 02:24:53 +00002687 len = ::strcspn(start, ":]");
Greg Clayton6bc44a42010-10-27 04:01:14 +00002688 bool has_arg = (start[len] == ':');
2689 if (has_arg)
Greg Claytonad60bf42010-10-12 02:24:53 +00002690 ++num_selectors_with_args;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002691 selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
Greg Clayton6bc44a42010-10-27 04:01:14 +00002692 if (has_arg)
2693 len += 1;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002694 }
2695
2696
2697 if (selector_idents.size() == 0)
2698 return 0;
2699
Greg Claytonb01000f2011-01-17 03:46:26 +00002700 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002701 selector_idents.data());
2702
2703 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
2704
2705 // Populate the method decl with parameter decls
Sean Callanand5b3c352011-01-27 04:42:51 +00002706 const clang::Type *method_type(method_qual_type.getTypePtr());
Greg Clayton1d8173f2010-09-24 05:15:53 +00002707
2708 if (method_type == NULL)
2709 return NULL;
2710
Sean Callanand5b3c352011-01-27 04:42:51 +00002711 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
Greg Clayton1d8173f2010-09-24 05:15:53 +00002712
2713 if (!method_function_prototype)
2714 return NULL;
2715
2716
2717 bool is_variadic = false;
2718 bool is_synthesized = false;
2719 bool is_defined = false;
2720 ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
2721
2722 const unsigned num_args = method_function_prototype->getNumArgs();
2723
Greg Claytonb01000f2011-01-17 03:46:26 +00002724 ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002725 SourceLocation(), // beginLoc,
2726 SourceLocation(), // endLoc,
2727 method_selector,
2728 method_function_prototype->getResultType(),
2729 NULL, // TypeSourceInfo *ResultTInfo,
2730 GetDeclContextForType (class_opaque_type),
2731 name[0] == '-',
2732 is_variadic,
2733 is_synthesized,
Sean Callananc1535182011-10-07 23:18:13 +00002734 true, // is_implicitly_declared
Greg Clayton1d8173f2010-09-24 05:15:53 +00002735 is_defined,
2736 imp_control,
Sean Callananc1535182011-10-07 23:18:13 +00002737 false /*has_related_result_type*/);
Greg Clayton1d8173f2010-09-24 05:15:53 +00002738
2739
2740 if (objc_method_decl == NULL)
2741 return NULL;
2742
2743 if (num_args > 0)
2744 {
2745 llvm::SmallVector<ParmVarDecl *, 12> params;
2746
2747 for (int param_index = 0; param_index < num_args; ++param_index)
2748 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002749 params.push_back (ParmVarDecl::Create (*ast,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002750 objc_method_decl,
2751 SourceLocation(),
Sean Callanan279584c2011-03-15 00:17:19 +00002752 SourceLocation(),
Greg Clayton1d8173f2010-09-24 05:15:53 +00002753 NULL, // anonymous
2754 method_function_prototype->getArgType(param_index),
2755 NULL,
2756 SC_Auto,
2757 SC_Auto,
2758 NULL));
2759 }
2760
Sean Callananc1535182011-10-07 23:18:13 +00002761 objc_method_decl->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
Greg Clayton1d8173f2010-09-24 05:15:53 +00002762 }
2763
2764 class_interface_decl->addDecl (objc_method_decl);
2765
Sean Callananc6d161e2011-10-26 01:06:27 +00002766#ifdef LLDB_CONFIGURATION_DEBUG
2767 VerifyDecl(objc_method_decl);
2768#endif
Greg Clayton1d8173f2010-09-24 05:15:53 +00002769
2770 return objc_method_decl;
2771}
2772
Greg Clayton3eeaf6e2012-02-03 01:30:30 +00002773size_t
2774ClangASTContext::GetNumTemplateArguments (clang::ASTContext *ast, clang_type_t clang_type)
2775{
2776 if (clang_type)
2777 {
2778 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2779
2780 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2781 switch (type_class)
2782 {
2783 case clang::Type::Record:
2784 if (GetCompleteQualType (ast, qual_type))
2785 {
2786 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2787 if (cxx_record_decl)
2788 {
2789 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
2790 if (template_decl)
2791 return template_decl->getTemplateArgs().size();
2792 }
2793 }
2794 break;
2795
2796 case clang::Type::Typedef:
2797 return ClangASTContext::GetNumTemplateArguments (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2798 default:
2799 break;
2800 }
2801 }
2802 return 0;
2803}
2804
2805clang_type_t
2806ClangASTContext::GetTemplateArgument (clang::ASTContext *ast, clang_type_t clang_type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
2807{
2808 if (clang_type)
2809 {
2810 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2811
2812 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2813 switch (type_class)
2814 {
2815 case clang::Type::Record:
2816 if (GetCompleteQualType (ast, qual_type))
2817 {
2818 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2819 if (cxx_record_decl)
2820 {
2821 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
2822 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
2823 {
2824 const TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
2825 switch (template_arg.getKind())
2826 {
2827 case clang::TemplateArgument::Null:
2828 kind = eTemplateArgumentKindNull;
2829 return NULL;
2830
2831 case clang::TemplateArgument::Type:
2832 kind = eTemplateArgumentKindType;
2833 return template_arg.getAsType().getAsOpaquePtr();
2834
2835 case clang::TemplateArgument::Declaration:
2836 kind = eTemplateArgumentKindDeclaration;
2837 return NULL;
2838
2839 case clang::TemplateArgument::Integral:
2840 kind = eTemplateArgumentKindIntegral;
2841 return template_arg.getIntegralType().getAsOpaquePtr();
2842
2843 case clang::TemplateArgument::Template:
2844 kind = eTemplateArgumentKindTemplate;
2845 return NULL;
2846
2847 case clang::TemplateArgument::TemplateExpansion:
2848 kind = eTemplateArgumentKindTemplateExpansion;
2849 return NULL;
2850
2851 case clang::TemplateArgument::Expression:
2852 kind = eTemplateArgumentKindExpression;
2853 return NULL;
2854
2855 case clang::TemplateArgument::Pack:
2856 kind = eTemplateArgumentKindPack;
2857 return NULL;
2858
2859 default:
2860 assert (!"Unhandled TemplateArgument::ArgKind");
2861 kind = eTemplateArgumentKindNull;
2862 return NULL;
2863 }
2864 }
2865 }
2866 }
2867 break;
2868
2869 case clang::Type::Typedef:
2870 return ClangASTContext::GetTemplateArgument (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), arg_idx, kind);
2871 default:
2872 break;
2873 }
2874 }
2875 kind = eTemplateArgumentKindNull;
2876 return NULL;
2877}
Greg Clayton1d8173f2010-09-24 05:15:53 +00002878
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002879uint32_t
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002880ClangASTContext::GetTypeInfo
2881(
2882 clang_type_t clang_type,
Greg Claytonb01000f2011-01-17 03:46:26 +00002883 clang::ASTContext *ast,
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002884 clang_type_t *pointee_or_element_clang_type
2885)
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002886{
2887 if (clang_type == NULL)
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002888 return 0;
2889
2890 if (pointee_or_element_clang_type)
2891 *pointee_or_element_clang_type = NULL;
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002892
2893 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2894
2895 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2896 switch (type_class)
2897 {
Sean Callanan04325062010-10-25 00:29:48 +00002898 case clang::Type::Builtin:
2899 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2900 {
Sean Callanan04325062010-10-25 00:29:48 +00002901 case clang::BuiltinType::ObjCId:
2902 case clang::BuiltinType::ObjCClass:
Greg Claytonb01000f2011-01-17 03:46:26 +00002903 if (ast && pointee_or_element_clang_type)
2904 *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Sean Callanan04325062010-10-25 00:29:48 +00002905 return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
Enrico Granata1a102082011-07-12 00:18:11 +00002906 break;
2907 case clang::BuiltinType::Bool:
2908 case clang::BuiltinType::Char_U:
2909 case clang::BuiltinType::UChar:
2910 case clang::BuiltinType::WChar_U:
2911 case clang::BuiltinType::Char16:
2912 case clang::BuiltinType::Char32:
2913 case clang::BuiltinType::UShort:
2914 case clang::BuiltinType::UInt:
2915 case clang::BuiltinType::ULong:
2916 case clang::BuiltinType::ULongLong:
2917 case clang::BuiltinType::UInt128:
2918 case clang::BuiltinType::Char_S:
2919 case clang::BuiltinType::SChar:
2920 case clang::BuiltinType::WChar_S:
2921 case clang::BuiltinType::Short:
2922 case clang::BuiltinType::Int:
2923 case clang::BuiltinType::Long:
2924 case clang::BuiltinType::LongLong:
2925 case clang::BuiltinType::Int128:
2926 case clang::BuiltinType::Float:
2927 case clang::BuiltinType::Double:
2928 case clang::BuiltinType::LongDouble:
2929 return eTypeIsBuiltIn | eTypeHasValue | eTypeIsScalar;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002930 default:
2931 break;
Sean Callanan04325062010-10-25 00:29:48 +00002932 }
2933 return eTypeIsBuiltIn | eTypeHasValue;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002934
2935 case clang::Type::BlockPointer:
2936 if (pointee_or_element_clang_type)
2937 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2938 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2939
Greg Claytone52f37b2011-01-15 02:52:14 +00002940 case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002941
2942 case clang::Type::ConstantArray:
2943 case clang::Type::DependentSizedArray:
2944 case clang::Type::IncompleteArray:
2945 case clang::Type::VariableArray:
2946 if (pointee_or_element_clang_type)
2947 *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2948 return eTypeHasChildren | eTypeIsArray;
2949
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002950 case clang::Type::DependentName: return 0;
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002951 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
2952 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
2953 case clang::Type::Decltype: return 0;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002954
2955 case clang::Type::Enum:
2956 if (pointee_or_element_clang_type)
2957 *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2958 return eTypeIsEnumeration | eTypeHasValue;
2959
Sean Callananc6139712011-08-11 23:56:13 +00002960 case clang::Type::Elaborated:
2961 return ClangASTContext::GetTypeInfo (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2962 ast,
2963 pointee_or_element_clang_type);
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002964 case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector;
2965 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
2966 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002967 case clang::Type::InjectedClassName: return 0;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002968
2969 case clang::Type::LValueReference:
2970 case clang::Type::RValueReference:
2971 if (pointee_or_element_clang_type)
2972 *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2973 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2974
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002975 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002976
2977 case clang::Type::ObjCObjectPointer:
2978 if (pointee_or_element_clang_type)
2979 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2980 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2981
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002982 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2983 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002984
2985 case clang::Type::Pointer:
2986 if (pointee_or_element_clang_type)
2987 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2988 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2989
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002990 case clang::Type::Record:
2991 if (qual_type->getAsCXXRecordDecl())
2992 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2993 else
2994 return eTypeHasChildren | eTypeIsStructUnion;
2995 break;
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002996 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
2997 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
2998 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002999
3000 case clang::Type::Typedef:
Sean Callanan9e7958e2010-12-13 01:26:27 +00003001 return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Greg Claytonb01000f2011-01-17 03:46:26 +00003002 ast,
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003003 pointee_or_element_clang_type);
3004
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003005 case clang::Type::TypeOfExpr: return 0;
3006 case clang::Type::TypeOf: return 0;
3007 case clang::Type::UnresolvedUsing: return 0;
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003008 case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector;
3009 default: return 0;
3010 }
3011 return 0;
3012}
3013
Greg Clayton9488b742010-07-28 02:04:09 +00003014
Chris Lattner24943d22010-06-08 16:52:24 +00003015#pragma mark Aggregate Types
3016
3017bool
Greg Clayton462d4142010-09-29 01:12:09 +00003018ClangASTContext::IsAggregateType (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00003019{
3020 if (clang_type == NULL)
3021 return false;
3022
3023 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3024
Greg Clayton03e0f972010-09-13 03:32:57 +00003025 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3026 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00003027 {
Greg Clayton1674b122010-07-21 22:12:05 +00003028 case clang::Type::IncompleteArray:
3029 case clang::Type::VariableArray:
3030 case clang::Type::ConstantArray:
3031 case clang::Type::ExtVector:
3032 case clang::Type::Vector:
3033 case clang::Type::Record:
Greg Clayton9488b742010-07-28 02:04:09 +00003034 case clang::Type::ObjCObject:
3035 case clang::Type::ObjCInterface:
Chris Lattner24943d22010-06-08 16:52:24 +00003036 return true;
Sean Callananc6139712011-08-11 23:56:13 +00003037 case clang::Type::Elaborated:
3038 return ClangASTContext::IsAggregateType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton1674b122010-07-21 22:12:05 +00003039 case clang::Type::Typedef:
Sean Callanan9e7958e2010-12-13 01:26:27 +00003040 return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00003041
3042 default:
3043 break;
3044 }
3045 // The clang type does have a value
3046 return false;
3047}
3048
3049uint32_t
Greg Claytonb01000f2011-01-17 03:46:26 +00003050ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
Chris Lattner24943d22010-06-08 16:52:24 +00003051{
Greg Claytonb01000f2011-01-17 03:46:26 +00003052 if (clang_type == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00003053 return 0;
3054
3055 uint32_t num_children = 0;
Greg Claytonb01000f2011-01-17 03:46:26 +00003056 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9488b742010-07-28 02:04:09 +00003057 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3058 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00003059 {
Greg Clayton960d6a42010-08-03 00:35:52 +00003060 case clang::Type::Builtin:
3061 switch (cast<clang::BuiltinType>(qual_type)->getKind())
3062 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003063 case clang::BuiltinType::ObjCId: // child is Class
Greg Clayton960d6a42010-08-03 00:35:52 +00003064 case clang::BuiltinType::ObjCClass: // child is Class
Greg Clayton960d6a42010-08-03 00:35:52 +00003065 num_children = 1;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003066 break;
Greg Clayton960d6a42010-08-03 00:35:52 +00003067
3068 default:
3069 break;
3070 }
3071 break;
Greg Claytonc3b61d22010-12-15 05:08:08 +00003072
Greg Claytone52f37b2011-01-15 02:52:14 +00003073 case clang::Type::Complex: return 0;
Greg Claytonc3b61d22010-12-15 05:08:08 +00003074
Greg Clayton1674b122010-07-21 22:12:05 +00003075 case clang::Type::Record:
Greg Clayton7a183dc2011-01-20 04:18:48 +00003076 if (GetCompleteQualType (ast, qual_type))
Chris Lattner24943d22010-06-08 16:52:24 +00003077 {
3078 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3079 const RecordDecl *record_decl = record_type->getDecl();
3080 assert(record_decl);
3081 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3082 if (cxx_record_decl)
3083 {
3084 if (omit_empty_base_classes)
3085 {
3086 // Check each base classes to see if it or any of its
3087 // base classes contain any fields. This can help
3088 // limit the noise in variable views by not having to
3089 // show base classes that contain no members.
3090 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3091 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3092 base_class != base_class_end;
3093 ++base_class)
3094 {
3095 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3096
3097 // Skip empty base classes
3098 if (RecordHasFields(base_class_decl) == false)
3099 continue;
3100
3101 num_children++;
3102 }
3103 }
3104 else
3105 {
3106 // Include all base classes
3107 num_children += cxx_record_decl->getNumBases();
3108 }
3109
3110 }
3111 RecordDecl::field_iterator field, field_end;
3112 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
3113 ++num_children;
3114 }
3115 break;
3116
Greg Clayton9488b742010-07-28 02:04:09 +00003117 case clang::Type::ObjCObject:
3118 case clang::Type::ObjCInterface:
Greg Clayton7a183dc2011-01-20 04:18:48 +00003119 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9488b742010-07-28 02:04:09 +00003120 {
Sean Callanand5b3c352011-01-27 04:42:51 +00003121 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00003122 assert (objc_class_type);
3123 if (objc_class_type)
3124 {
3125 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3126
3127 if (class_interface_decl)
3128 {
3129
3130 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3131 if (superclass_interface_decl)
3132 {
3133 if (omit_empty_base_classes)
3134 {
3135 if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
3136 ++num_children;
3137 }
3138 else
3139 ++num_children;
3140 }
3141
3142 num_children += class_interface_decl->ivar_size();
3143 }
3144 }
3145 }
3146 break;
3147
3148 case clang::Type::ObjCObjectPointer:
Greg Clayton960d6a42010-08-03 00:35:52 +00003149 {
Sean Callanand5b3c352011-01-27 04:42:51 +00003150 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
Greg Clayton960d6a42010-08-03 00:35:52 +00003151 QualType pointee_type = pointer_type->getPointeeType();
Greg Claytonb01000f2011-01-17 03:46:26 +00003152 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
3153 pointee_type.getAsOpaquePtr(),
Greg Clayton960d6a42010-08-03 00:35:52 +00003154 omit_empty_base_classes);
3155 // If this type points to a simple type, then it has 1 child
3156 if (num_pointee_children == 0)
3157 num_children = 1;
3158 else
3159 num_children = num_pointee_children;
3160 }
3161 break;
Greg Clayton9488b742010-07-28 02:04:09 +00003162
Greg Clayton1674b122010-07-21 22:12:05 +00003163 case clang::Type::ConstantArray:
Chris Lattner24943d22010-06-08 16:52:24 +00003164 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
3165 break;
3166
Greg Clayton1674b122010-07-21 22:12:05 +00003167 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00003168 {
Sean Callanand5b3c352011-01-27 04:42:51 +00003169 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Greg Claytonc3b61d22010-12-15 05:08:08 +00003170 QualType pointee_type (pointer_type->getPointeeType());
Greg Claytonb01000f2011-01-17 03:46:26 +00003171 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
3172 pointee_type.getAsOpaquePtr(),
Greg Clayton9488b742010-07-28 02:04:09 +00003173 omit_empty_base_classes);
Chris Lattner24943d22010-06-08 16:52:24 +00003174 if (num_pointee_children == 0)
Greg Claytonc3b61d22010-12-15 05:08:08 +00003175 {
3176 // We have a pointer to a pointee type that claims it has no children.
3177 // We will want to look at
3178 num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
3179 }
Chris Lattner24943d22010-06-08 16:52:24 +00003180 else
3181 num_children = num_pointee_children;
3182 }
3183 break;
3184
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003185 case clang::Type::LValueReference:
3186 case clang::Type::RValueReference:
3187 {
Sean Callanand5b3c352011-01-27 04:42:51 +00003188 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003189 QualType pointee_type = reference_type->getPointeeType();
Greg Claytonb01000f2011-01-17 03:46:26 +00003190 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
3191 pointee_type.getAsOpaquePtr(),
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003192 omit_empty_base_classes);
3193 // If this type points to a simple type, then it has 1 child
3194 if (num_pointee_children == 0)
3195 num_children = 1;
3196 else
3197 num_children = num_pointee_children;
3198 }
3199 break;
3200
3201
Greg Clayton1674b122010-07-21 22:12:05 +00003202 case clang::Type::Typedef:
Greg Claytonb01000f2011-01-17 03:46:26 +00003203 num_children = ClangASTContext::GetNumChildren (ast,
3204 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3205 omit_empty_base_classes);
Chris Lattner24943d22010-06-08 16:52:24 +00003206 break;
Sean Callananc6139712011-08-11 23:56:13 +00003207
3208 case clang::Type::Elaborated:
3209 num_children = ClangASTContext::GetNumChildren (ast,
3210 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3211 omit_empty_base_classes);
3212 break;
Chris Lattner24943d22010-06-08 16:52:24 +00003213
3214 default:
3215 break;
3216 }
3217 return num_children;
3218}
3219
Greg Claytond68e0892011-09-09 23:04:00 +00003220uint32_t
3221ClangASTContext::GetNumDirectBaseClasses (clang::ASTContext *ast, clang_type_t clang_type)
3222{
3223 if (clang_type == NULL)
3224 return 0;
3225
3226 uint32_t count = 0;
3227 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3228 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3229 switch (type_class)
3230 {
3231 case clang::Type::Record:
3232 if (GetCompleteQualType (ast, qual_type))
3233 {
3234 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3235 if (cxx_record_decl)
3236 count = cxx_record_decl->getNumBases();
3237 }
3238 break;
3239
3240 case clang::Type::ObjCObject:
3241 case clang::Type::ObjCInterface:
3242 if (GetCompleteQualType (ast, qual_type))
3243 {
3244 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
3245 if (objc_class_type)
3246 {
3247 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3248
3249 if (class_interface_decl && class_interface_decl->getSuperClass())
3250 count = 1;
3251 }
3252 }
3253 break;
3254
3255
3256 case clang::Type::Typedef:
3257 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3258 break;
3259
3260 case clang::Type::Elaborated:
3261 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3262 break;
3263
3264 default:
3265 break;
3266 }
3267 return count;
3268}
3269
3270uint32_t
3271ClangASTContext::GetNumVirtualBaseClasses (clang::ASTContext *ast,
3272 clang_type_t clang_type)
3273{
3274 if (clang_type == NULL)
3275 return 0;
3276
3277 uint32_t count = 0;
3278 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3279 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3280 switch (type_class)
3281 {
3282 case clang::Type::Record:
3283 if (GetCompleteQualType (ast, qual_type))
3284 {
3285 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3286 if (cxx_record_decl)
3287 count = cxx_record_decl->getNumVBases();
3288 }
3289 break;
3290
3291 case clang::Type::Typedef:
3292 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3293 break;
3294
3295 case clang::Type::Elaborated:
3296 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3297 break;
3298
3299 default:
3300 break;
3301 }
3302 return count;
3303}
3304
3305uint32_t
3306ClangASTContext::GetNumFields (clang::ASTContext *ast, clang_type_t clang_type)
3307{
3308 if (clang_type == NULL)
3309 return 0;
3310
3311 uint32_t count = 0;
3312 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3313 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3314 switch (type_class)
3315 {
3316 case clang::Type::Record:
3317 if (GetCompleteQualType (ast, qual_type))
3318 {
3319 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
3320 if (record_type)
3321 {
3322 RecordDecl *record_decl = record_type->getDecl();
3323 if (record_decl)
3324 {
3325 uint32_t field_idx = 0;
3326 RecordDecl::field_iterator field, field_end;
3327 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
3328 ++field_idx;
3329 count = field_idx;
3330 }
3331 }
3332 }
3333 break;
3334
3335 case clang::Type::Typedef:
3336 count = ClangASTContext::GetNumFields (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3337 break;
3338
3339 case clang::Type::Elaborated:
3340 count = ClangASTContext::GetNumFields (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3341 break;
3342
Greg Clayton96154be2011-11-13 06:57:31 +00003343 case clang::Type::ObjCObject:
3344 case clang::Type::ObjCInterface:
3345 if (GetCompleteQualType (ast, qual_type))
3346 {
3347 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3348 if (objc_class_type)
3349 {
3350 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3351
3352 if (class_interface_decl)
3353 count = class_interface_decl->ivar_size();
3354 }
3355 }
3356 break;
3357
Greg Claytond68e0892011-09-09 23:04:00 +00003358 default:
3359 break;
3360 }
3361 return count;
3362}
3363
3364clang_type_t
3365ClangASTContext::GetDirectBaseClassAtIndex (clang::ASTContext *ast,
3366 clang_type_t clang_type,
3367 uint32_t idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003368 uint32_t *bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003369{
3370 if (clang_type == NULL)
3371 return 0;
3372
3373 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3374 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3375 switch (type_class)
3376 {
3377 case clang::Type::Record:
3378 if (GetCompleteQualType (ast, qual_type))
3379 {
3380 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3381 if (cxx_record_decl)
3382 {
3383 uint32_t curr_idx = 0;
3384 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3385 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3386 base_class != base_class_end;
3387 ++base_class, ++curr_idx)
3388 {
3389 if (curr_idx == idx)
3390 {
Greg Clayton96154be2011-11-13 06:57:31 +00003391 if (bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003392 {
3393 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3394 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3395// if (base_class->isVirtual())
Greg Clayton96154be2011-11-13 06:57:31 +00003396// *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytond68e0892011-09-09 23:04:00 +00003397// else
Greg Clayton96154be2011-11-13 06:57:31 +00003398 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytond68e0892011-09-09 23:04:00 +00003399 }
3400 return base_class->getType().getAsOpaquePtr();
3401 }
3402 }
3403 }
3404 }
3405 break;
3406
3407 case clang::Type::ObjCObject:
3408 case clang::Type::ObjCInterface:
3409 if (idx == 0 && GetCompleteQualType (ast, qual_type))
3410 {
3411 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
3412 if (objc_class_type)
3413 {
3414 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3415
3416 if (class_interface_decl)
3417 {
3418 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3419 if (superclass_interface_decl)
3420 {
Greg Clayton96154be2011-11-13 06:57:31 +00003421 if (bit_offset_ptr)
3422 *bit_offset_ptr = 0;
Greg Claytond68e0892011-09-09 23:04:00 +00003423 return ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr();
3424 }
3425 }
3426 }
3427 }
3428 break;
3429
3430
3431 case clang::Type::Typedef:
3432 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3433 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3434 idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003435 bit_offset_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003436
3437 case clang::Type::Elaborated:
3438 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3439 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3440 idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003441 bit_offset_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003442
3443 default:
3444 break;
3445 }
3446 return NULL;
3447}
3448
3449clang_type_t
3450ClangASTContext::GetVirtualBaseClassAtIndex (clang::ASTContext *ast,
3451 clang_type_t clang_type,
3452 uint32_t idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003453 uint32_t *bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003454{
3455 if (clang_type == NULL)
3456 return 0;
3457
3458 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3459 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3460 switch (type_class)
3461 {
3462 case clang::Type::Record:
3463 if (GetCompleteQualType (ast, qual_type))
3464 {
3465 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3466 if (cxx_record_decl)
3467 {
3468 uint32_t curr_idx = 0;
3469 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3470 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
3471 base_class != base_class_end;
3472 ++base_class, ++curr_idx)
3473 {
3474 if (curr_idx == idx)
3475 {
Greg Clayton96154be2011-11-13 06:57:31 +00003476 if (bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003477 {
3478 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3479 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
Greg Clayton96154be2011-11-13 06:57:31 +00003480 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytond68e0892011-09-09 23:04:00 +00003481
3482 }
3483 return base_class->getType().getAsOpaquePtr();
3484 }
3485 }
3486 }
3487 }
3488 break;
3489
3490 case clang::Type::Typedef:
3491 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3492 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3493 idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003494 bit_offset_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003495
3496 case clang::Type::Elaborated:
3497 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3498 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3499 idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003500 bit_offset_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003501
3502 default:
3503 break;
3504 }
3505 return NULL;
3506}
3507
3508clang_type_t
3509ClangASTContext::GetFieldAtIndex (clang::ASTContext *ast,
3510 clang_type_t clang_type,
3511 uint32_t idx,
3512 std::string& name,
Greg Claytonf6132ef2012-07-31 23:39:10 +00003513 uint64_t *bit_offset_ptr,
3514 uint32_t *bitfield_bit_size_ptr,
3515 bool *is_bitfield_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003516{
3517 if (clang_type == NULL)
3518 return 0;
3519
3520 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3521 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3522 switch (type_class)
3523 {
3524 case clang::Type::Record:
3525 if (GetCompleteQualType (ast, qual_type))
3526 {
3527 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3528 const RecordDecl *record_decl = record_type->getDecl();
3529 uint32_t field_idx = 0;
3530 RecordDecl::field_iterator field, field_end;
3531 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
3532 {
3533 if (idx == field_idx)
3534 {
3535 // Print the member type if requested
3536 // Print the member name and equal sign
3537 name.assign(field->getNameAsString());
3538
3539 // Figure out the type byte size (field_type_info.first) and
3540 // alignment (field_type_info.second) from the AST context.
Greg Clayton96154be2011-11-13 06:57:31 +00003541 if (bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003542 {
3543 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Greg Clayton96154be2011-11-13 06:57:31 +00003544 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
Greg Claytond68e0892011-09-09 23:04:00 +00003545 }
3546
Greg Claytonf6132ef2012-07-31 23:39:10 +00003547 const bool is_bitfield = field->isBitField();
3548
3549 if (bitfield_bit_size_ptr)
3550 {
3551 *bitfield_bit_size_ptr = 0;
3552
3553 if (is_bitfield && ast)
3554 {
3555 Expr *bitfield_bit_size_expr = field->getBitWidth();
3556 llvm::APSInt bitfield_apsint;
3557 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
3558 {
3559 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
3560 }
3561 }
3562 }
3563 if (is_bitfield_ptr)
3564 *is_bitfield_ptr = is_bitfield;
3565
Greg Claytond68e0892011-09-09 23:04:00 +00003566 return field->getType().getAsOpaquePtr();
3567 }
3568 }
3569 }
3570 break;
3571
3572 case clang::Type::ObjCObject:
3573 case clang::Type::ObjCInterface:
3574 if (GetCompleteQualType (ast, qual_type))
3575 {
3576 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3577 assert (objc_class_type);
3578 if (objc_class_type)
3579 {
3580 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3581
3582 if (class_interface_decl)
3583 {
3584 if (idx < (class_interface_decl->ivar_size()))
3585 {
3586 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3587 uint32_t ivar_idx = 0;
3588
3589 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
3590 {
3591 if (ivar_idx == idx)
3592 {
3593 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3594
3595 QualType ivar_qual_type(ivar_decl->getType());
3596
3597 name.assign(ivar_decl->getNameAsString());
3598
Greg Clayton96154be2011-11-13 06:57:31 +00003599 if (bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003600 {
3601 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Clayton96154be2011-11-13 06:57:31 +00003602 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
Greg Claytond68e0892011-09-09 23:04:00 +00003603 }
3604
Greg Claytonf6132ef2012-07-31 23:39:10 +00003605 const bool is_bitfield = ivar_pos->isBitField();
3606
3607 if (bitfield_bit_size_ptr)
3608 {
3609 *bitfield_bit_size_ptr = 0;
3610
3611 if (is_bitfield && ast)
3612 {
3613 Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
3614 llvm::APSInt bitfield_apsint;
3615 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
3616 {
3617 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
3618 }
3619 }
3620 }
3621 if (is_bitfield_ptr)
3622 *is_bitfield_ptr = is_bitfield;
3623
Greg Claytond68e0892011-09-09 23:04:00 +00003624 return ivar_qual_type.getAsOpaquePtr();
3625 }
3626 }
3627 }
3628 }
3629 }
3630 }
3631 break;
3632
3633
3634 case clang::Type::Typedef:
3635 return ClangASTContext::GetFieldAtIndex (ast,
3636 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3637 idx,
3638 name,
Greg Claytonf6132ef2012-07-31 23:39:10 +00003639 bit_offset_ptr,
3640 bitfield_bit_size_ptr,
3641 is_bitfield_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003642
3643 case clang::Type::Elaborated:
3644 return ClangASTContext::GetFieldAtIndex (ast,
3645 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3646 idx,
3647 name,
Greg Claytonf6132ef2012-07-31 23:39:10 +00003648 bit_offset_ptr,
3649 bitfield_bit_size_ptr,
3650 is_bitfield_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003651
3652 default:
3653 break;
3654 }
3655 return NULL;
3656}
3657
Greg Clayton949b7172012-10-13 00:20:27 +00003658lldb::BasicType
3659ClangASTContext::GetLLDBBasicTypeEnumeration (clang_type_t clang_type)
3660{
3661 if (clang_type)
3662 {
3663 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3664 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
Greg Clayton12f1d1e2012-10-15 21:16:43 +00003665 if (type_class == clang::Type::Builtin)
Greg Clayton949b7172012-10-13 00:20:27 +00003666 {
Greg Clayton949b7172012-10-13 00:20:27 +00003667 switch (cast<clang::BuiltinType>(qual_type)->getKind())
Greg Clayton12f1d1e2012-10-15 21:16:43 +00003668 {
Greg Clayton949b7172012-10-13 00:20:27 +00003669 case clang::BuiltinType::Void: return eBasicTypeVoid;
3670 case clang::BuiltinType::Bool: return eBasicTypeBool;
3671 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
3672 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
3673 case clang::BuiltinType::Char16: return eBasicTypeChar16;
3674 case clang::BuiltinType::Char32: return eBasicTypeChar32;
3675 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
3676 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
3677 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
3678 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
3679 case clang::BuiltinType::Short: return eBasicTypeShort;
3680 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
3681 case clang::BuiltinType::Int: return eBasicTypeInt;
3682 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
3683 case clang::BuiltinType::Long: return eBasicTypeLong;
3684 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
3685 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
3686 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
3687 case clang::BuiltinType::Int128: return eBasicTypeInt128;
3688 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
3689
3690 case clang::BuiltinType::Half: return eBasicTypeHalf;
3691 case clang::BuiltinType::Float: return eBasicTypeFloat;
3692 case clang::BuiltinType::Double: return eBasicTypeDouble;
3693 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
3694
3695 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
3696 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
3697 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
3698 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
3699 case clang::BuiltinType::Dependent:
3700 case clang::BuiltinType::Overload:
3701 case clang::BuiltinType::BoundMember:
3702 case clang::BuiltinType::PseudoObject:
3703 case clang::BuiltinType::UnknownAny:
3704 case clang::BuiltinType::BuiltinFn:
3705 case clang::BuiltinType::ARCUnbridgedCast:
3706 return eBasicTypeOther;
Greg Clayton12f1d1e2012-10-15 21:16:43 +00003707 }
Greg Clayton949b7172012-10-13 00:20:27 +00003708 }
3709 }
3710
3711 return eBasicTypeInvalid;
3712}
3713
3714
Greg Claytond68e0892011-09-09 23:04:00 +00003715
Greg Claytonc3b61d22010-12-15 05:08:08 +00003716// If a pointer to a pointee type (the clang_type arg) says that it has no
3717// children, then we either need to trust it, or override it and return a
3718// different result. For example, an "int *" has one child that is an integer,
3719// but a function pointer doesn't have any children. Likewise if a Record type
3720// claims it has no children, then there really is nothing to show.
3721uint32_t
3722ClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
3723{
3724 if (clang_type == NULL)
3725 return 0;
3726
3727 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3728 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3729 switch (type_class)
3730 {
Greg Clayton9db023b2011-01-08 22:26:47 +00003731 case clang::Type::Builtin:
3732 switch (cast<clang::BuiltinType>(qual_type)->getKind())
3733 {
Greg Claytonabe0fed2011-04-18 08:33:37 +00003734 case clang::BuiltinType::UnknownAny:
Greg Clayton9db023b2011-01-08 22:26:47 +00003735 case clang::BuiltinType::Void:
3736 case clang::BuiltinType::NullPtr:
3737 return 0;
3738 case clang::BuiltinType::Bool:
3739 case clang::BuiltinType::Char_U:
3740 case clang::BuiltinType::UChar:
Sean Callananad293092011-01-18 23:32:05 +00003741 case clang::BuiltinType::WChar_U:
Greg Clayton9db023b2011-01-08 22:26:47 +00003742 case clang::BuiltinType::Char16:
3743 case clang::BuiltinType::Char32:
3744 case clang::BuiltinType::UShort:
3745 case clang::BuiltinType::UInt:
3746 case clang::BuiltinType::ULong:
3747 case clang::BuiltinType::ULongLong:
3748 case clang::BuiltinType::UInt128:
3749 case clang::BuiltinType::Char_S:
3750 case clang::BuiltinType::SChar:
Sean Callananad293092011-01-18 23:32:05 +00003751 case clang::BuiltinType::WChar_S:
Greg Clayton9db023b2011-01-08 22:26:47 +00003752 case clang::BuiltinType::Short:
3753 case clang::BuiltinType::Int:
3754 case clang::BuiltinType::Long:
3755 case clang::BuiltinType::LongLong:
3756 case clang::BuiltinType::Int128:
3757 case clang::BuiltinType::Float:
3758 case clang::BuiltinType::Double:
3759 case clang::BuiltinType::LongDouble:
3760 case clang::BuiltinType::Dependent:
3761 case clang::BuiltinType::Overload:
Greg Clayton9db023b2011-01-08 22:26:47 +00003762 case clang::BuiltinType::ObjCId:
3763 case clang::BuiltinType::ObjCClass:
3764 case clang::BuiltinType::ObjCSel:
Sean Callanan0de254a2011-05-15 22:34:38 +00003765 case clang::BuiltinType::BoundMember:
Greg Claytonf6a5bd72011-10-22 03:33:13 +00003766 case clang::BuiltinType::Half:
3767 case clang::BuiltinType::ARCUnbridgedCast:
Greg Clayton32e25642011-11-09 19:04:58 +00003768 case clang::BuiltinType::PseudoObject:
Sean Callanan06dc17f2012-09-24 22:25:51 +00003769 case clang::BuiltinType::BuiltinFn:
Greg Clayton9db023b2011-01-08 22:26:47 +00003770 return 1;
3771 }
3772 break;
3773
Greg Claytone52f37b2011-01-15 02:52:14 +00003774 case clang::Type::Complex: return 1;
Greg Claytonc3b61d22010-12-15 05:08:08 +00003775 case clang::Type::Pointer: return 1;
3776 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
3777 case clang::Type::LValueReference: return 1;
3778 case clang::Type::RValueReference: return 1;
3779 case clang::Type::MemberPointer: return 0;
3780 case clang::Type::ConstantArray: return 0;
3781 case clang::Type::IncompleteArray: return 0;
3782 case clang::Type::VariableArray: return 0;
3783 case clang::Type::DependentSizedArray: return 0;
3784 case clang::Type::DependentSizedExtVector: return 0;
3785 case clang::Type::Vector: return 0;
3786 case clang::Type::ExtVector: return 0;
3787 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
3788 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
3789 case clang::Type::UnresolvedUsing: return 0;
3790 case clang::Type::Paren: return 0;
3791 case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00003792 case clang::Type::Elaborated: return ClangASTContext::GetNumPointeeChildren (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Claytonc3b61d22010-12-15 05:08:08 +00003793 case clang::Type::TypeOfExpr: return 0;
3794 case clang::Type::TypeOf: return 0;
3795 case clang::Type::Decltype: return 0;
3796 case clang::Type::Record: return 0;
3797 case clang::Type::Enum: return 1;
Greg Claytonc3b61d22010-12-15 05:08:08 +00003798 case clang::Type::TemplateTypeParm: return 1;
3799 case clang::Type::SubstTemplateTypeParm: return 1;
3800 case clang::Type::TemplateSpecialization: return 1;
3801 case clang::Type::InjectedClassName: return 0;
3802 case clang::Type::DependentName: return 1;
3803 case clang::Type::DependentTemplateSpecialization: return 1;
3804 case clang::Type::ObjCObject: return 0;
3805 case clang::Type::ObjCInterface: return 0;
3806 case clang::Type::ObjCObjectPointer: return 1;
3807 default:
3808 break;
3809 }
3810 return 0;
3811}
Chris Lattner24943d22010-06-08 16:52:24 +00003812
Greg Clayton462d4142010-09-29 01:12:09 +00003813clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +00003814ClangASTContext::GetChildClangTypeAtIndex
3815(
Jim Ingham58513662011-06-24 22:03:24 +00003816 ExecutionContext *exe_ctx,
Chris Lattner24943d22010-06-08 16:52:24 +00003817 const char *parent_name,
Greg Clayton462d4142010-09-29 01:12:09 +00003818 clang_type_t parent_clang_type,
Chris Lattner24943d22010-06-08 16:52:24 +00003819 uint32_t idx,
3820 bool transparent_pointers,
3821 bool omit_empty_base_classes,
Greg Clayton24b03102011-07-09 20:12:33 +00003822 bool ignore_array_bounds,
Chris Lattner24943d22010-06-08 16:52:24 +00003823 std::string& child_name,
3824 uint32_t &child_byte_size,
3825 int32_t &child_byte_offset,
3826 uint32_t &child_bitfield_bit_size,
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003827 uint32_t &child_bitfield_bit_offset,
Greg Clayton00c3ae72011-01-21 01:59:00 +00003828 bool &child_is_base_class,
3829 bool &child_is_deref_of_parent
Chris Lattner24943d22010-06-08 16:52:24 +00003830)
3831{
3832 if (parent_clang_type)
3833
Jim Ingham58513662011-06-24 22:03:24 +00003834 return GetChildClangTypeAtIndex (exe_ctx,
3835 getASTContext(),
Chris Lattner24943d22010-06-08 16:52:24 +00003836 parent_name,
3837 parent_clang_type,
3838 idx,
3839 transparent_pointers,
3840 omit_empty_base_classes,
Greg Clayton24b03102011-07-09 20:12:33 +00003841 ignore_array_bounds,
Chris Lattner24943d22010-06-08 16:52:24 +00003842 child_name,
3843 child_byte_size,
3844 child_byte_offset,
3845 child_bitfield_bit_size,
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003846 child_bitfield_bit_offset,
Greg Clayton00c3ae72011-01-21 01:59:00 +00003847 child_is_base_class,
3848 child_is_deref_of_parent);
Chris Lattner24943d22010-06-08 16:52:24 +00003849 return NULL;
3850}
3851
Greg Clayton462d4142010-09-29 01:12:09 +00003852clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +00003853ClangASTContext::GetChildClangTypeAtIndex
3854(
Jim Ingham58513662011-06-24 22:03:24 +00003855 ExecutionContext *exe_ctx,
Greg Claytonb01000f2011-01-17 03:46:26 +00003856 ASTContext *ast,
Chris Lattner24943d22010-06-08 16:52:24 +00003857 const char *parent_name,
Greg Clayton462d4142010-09-29 01:12:09 +00003858 clang_type_t parent_clang_type,
Chris Lattner24943d22010-06-08 16:52:24 +00003859 uint32_t idx,
3860 bool transparent_pointers,
3861 bool omit_empty_base_classes,
Greg Clayton24b03102011-07-09 20:12:33 +00003862 bool ignore_array_bounds,
Chris Lattner24943d22010-06-08 16:52:24 +00003863 std::string& child_name,
3864 uint32_t &child_byte_size,
3865 int32_t &child_byte_offset,
3866 uint32_t &child_bitfield_bit_size,
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003867 uint32_t &child_bitfield_bit_offset,
Greg Clayton00c3ae72011-01-21 01:59:00 +00003868 bool &child_is_base_class,
3869 bool &child_is_deref_of_parent
Chris Lattner24943d22010-06-08 16:52:24 +00003870)
3871{
3872 if (parent_clang_type == NULL)
3873 return NULL;
3874
Greg Claytonb9124572012-12-06 02:33:54 +00003875 QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
3876 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
3877 child_bitfield_bit_size = 0;
3878 child_bitfield_bit_offset = 0;
3879 child_is_base_class = false;
3880
3881 const bool idx_is_valid = idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes);
3882 uint32_t bit_offset;
3883 switch (parent_type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00003884 {
Greg Claytonb9124572012-12-06 02:33:54 +00003885 case clang::Type::Builtin:
3886 if (idx_is_valid)
Chris Lattner24943d22010-06-08 16:52:24 +00003887 {
Greg Clayton960d6a42010-08-03 00:35:52 +00003888 switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
3889 {
3890 case clang::BuiltinType::ObjCId:
3891 case clang::BuiltinType::ObjCClass:
Sean Callanan04325062010-10-25 00:29:48 +00003892 child_name = "isa";
Greg Claytonb01000f2011-01-17 03:46:26 +00003893 child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
3894 return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +00003895
Greg Clayton960d6a42010-08-03 00:35:52 +00003896 default:
3897 break;
3898 }
Greg Claytonb9124572012-12-06 02:33:54 +00003899 }
3900 break;
Greg Clayton960d6a42010-08-03 00:35:52 +00003901
Greg Claytonb9124572012-12-06 02:33:54 +00003902 case clang::Type::Record:
3903 if (idx_is_valid && GetCompleteQualType (ast, parent_qual_type))
3904 {
3905 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
3906 const RecordDecl *record_decl = record_type->getDecl();
3907 assert(record_decl);
3908 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
3909 uint32_t child_idx = 0;
3910
3911 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3912 if (cxx_record_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00003913 {
Greg Claytonb9124572012-12-06 02:33:54 +00003914 // We might have base classes to print out first
3915 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3916 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3917 base_class != base_class_end;
3918 ++base_class)
Chris Lattner24943d22010-06-08 16:52:24 +00003919 {
Greg Claytonb9124572012-12-06 02:33:54 +00003920 const CXXRecordDecl *base_class_decl = NULL;
3921
3922 // Skip empty base classes
3923 if (omit_empty_base_classes)
Chris Lattner24943d22010-06-08 16:52:24 +00003924 {
Greg Claytonb9124572012-12-06 02:33:54 +00003925 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3926 if (RecordHasFields(base_class_decl) == false)
3927 continue;
Chris Lattner24943d22010-06-08 16:52:24 +00003928 }
Greg Claytonb9124572012-12-06 02:33:54 +00003929
Chris Lattner24943d22010-06-08 16:52:24 +00003930 if (idx == child_idx)
3931 {
Greg Claytonb9124572012-12-06 02:33:54 +00003932 if (base_class_decl == NULL)
3933 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
Chris Lattner24943d22010-06-08 16:52:24 +00003934
Chris Lattner24943d22010-06-08 16:52:24 +00003935
Greg Claytonb9124572012-12-06 02:33:54 +00003936 if (base_class->isVirtual())
3937 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
3938 else
3939 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner24943d22010-06-08 16:52:24 +00003940
Greg Claytonb9124572012-12-06 02:33:54 +00003941 // Base classes should be a multiple of 8 bits in size
3942 child_byte_offset = bit_offset/8;
3943
3944 child_name = ClangASTType::GetTypeNameForQualType(ast, base_class->getType());
Chris Lattner24943d22010-06-08 16:52:24 +00003945
Greg Claytonb9124572012-12-06 02:33:54 +00003946 uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
3947
3948 // Base classes bit sizes should be a multiple of 8 bits in size
3949 assert (clang_type_info_bit_size % 8 == 0);
3950 child_byte_size = clang_type_info_bit_size / 8;
3951 child_is_base_class = true;
3952 return base_class->getType().getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00003953 }
Greg Claytonb9124572012-12-06 02:33:54 +00003954 // We don't increment the child index in the for loop since we might
3955 // be skipping empty base classes
3956 ++child_idx;
Chris Lattner24943d22010-06-08 16:52:24 +00003957 }
3958 }
Greg Claytonb9124572012-12-06 02:33:54 +00003959 // Make sure index is in range...
3960 uint32_t field_idx = 0;
3961 RecordDecl::field_iterator field, field_end;
3962 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
Greg Clayton9488b742010-07-28 02:04:09 +00003963 {
Greg Claytonb9124572012-12-06 02:33:54 +00003964 if (idx == child_idx)
Greg Clayton9488b742010-07-28 02:04:09 +00003965 {
Greg Claytonb9124572012-12-06 02:33:54 +00003966 // Print the member type if requested
3967 // Print the member name and equal sign
3968 child_name.assign(field->getNameAsString().c_str());
3969
3970 // Figure out the type byte size (field_type_info.first) and
3971 // alignment (field_type_info.second) from the AST context.
3972 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
3973 assert(field_idx < record_layout.getFieldCount());
3974
3975 child_byte_size = field_type_info.first / 8;
3976
3977 // Figure out the field offset within the current struct/union/class type
3978 bit_offset = record_layout.getFieldOffset (field_idx);
3979 child_byte_offset = bit_offset / 8;
3980 if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
3981 child_bitfield_bit_offset = bit_offset % 8;
3982
3983 return field->getType().getAsOpaquePtr();
3984 }
3985 }
3986 }
3987 break;
3988
3989 case clang::Type::ObjCObject:
3990 case clang::Type::ObjCInterface:
3991 if (idx_is_valid && GetCompleteQualType (ast, parent_qual_type))
3992 {
3993 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
3994 assert (objc_class_type);
3995 if (objc_class_type)
3996 {
3997 uint32_t child_idx = 0;
3998 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3999
4000 if (class_interface_decl)
4001 {
4002
4003 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
4004 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4005 if (superclass_interface_decl)
Greg Clayton9488b742010-07-28 02:04:09 +00004006 {
Greg Claytonb9124572012-12-06 02:33:54 +00004007 if (omit_empty_base_classes)
Greg Clayton9488b742010-07-28 02:04:09 +00004008 {
Greg Claytonb9124572012-12-06 02:33:54 +00004009 if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
Greg Clayton9488b742010-07-28 02:04:09 +00004010 {
Greg Claytonb9124572012-12-06 02:33:54 +00004011 if (idx == 0)
Greg Clayton9488b742010-07-28 02:04:09 +00004012 {
Greg Claytonb9124572012-12-06 02:33:54 +00004013 QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
Greg Clayton9488b742010-07-28 02:04:09 +00004014
Greg Clayton9488b742010-07-28 02:04:09 +00004015
Greg Claytonb9124572012-12-06 02:33:54 +00004016 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
Greg Clayton9488b742010-07-28 02:04:09 +00004017
Greg Claytonb01000f2011-01-17 03:46:26 +00004018 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00004019
4020 child_byte_size = ivar_type_info.first / 8;
Greg Claytonb9124572012-12-06 02:33:54 +00004021 child_byte_offset = 0;
4022 child_is_base_class = true;
Greg Clayton9488b742010-07-28 02:04:09 +00004023
Greg Clayton9488b742010-07-28 02:04:09 +00004024 return ivar_qual_type.getAsOpaquePtr();
4025 }
Greg Claytonb9124572012-12-06 02:33:54 +00004026
Greg Clayton9488b742010-07-28 02:04:09 +00004027 ++child_idx;
4028 }
4029 }
Greg Claytonb9124572012-12-06 02:33:54 +00004030 else
4031 ++child_idx;
4032 }
4033
4034 const uint32_t superclass_idx = child_idx;
4035
4036 if (idx < (child_idx + class_interface_decl->ivar_size()))
4037 {
4038 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4039
4040 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
4041 {
4042 if (child_idx == idx)
4043 {
4044 ObjCIvarDecl* ivar_decl = *ivar_pos;
4045
4046 QualType ivar_qual_type(ivar_decl->getType());
4047
4048 child_name.assign(ivar_decl->getNameAsString().c_str());
4049
4050 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
4051
4052 child_byte_size = ivar_type_info.first / 8;
4053
4054 // Figure out the field offset within the current struct/union/class type
4055 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
4056 // that doesn't account for the space taken up by unbacked properties, or from
4057 // the changing size of base classes that are newer than this class.
4058 // So if we have a process around that we can ask about this object, do so.
4059 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
4060 Process *process = NULL;
4061 if (exe_ctx)
4062 process = exe_ctx->GetProcessPtr();
4063 if (process)
4064 {
4065 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4066 if (objc_runtime != NULL)
4067 {
4068 ClangASTType parent_ast_type (ast, parent_qual_type.getAsOpaquePtr());
4069 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
4070 }
4071 }
4072
4073 // Setting this to UINT32_MAX to make sure we don't compute it twice...
4074 bit_offset = UINT32_MAX;
4075
4076 if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
4077 {
4078 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
4079 child_byte_offset = bit_offset / 8;
4080 }
4081
4082 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
4083 // of a bitfield within its containing object. So regardless of where we get the byte
4084 // offset from, we still need to get the bit offset for bitfields from the layout.
4085
4086 if (ClangASTContext::FieldIsBitfield (ast, ivar_decl, child_bitfield_bit_size))
4087 {
4088 if (bit_offset == UINT32_MAX)
4089 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
4090
4091 child_bitfield_bit_offset = bit_offset % 8;
4092 }
4093 return ivar_qual_type.getAsOpaquePtr();
4094 }
4095 ++child_idx;
4096 }
Greg Clayton9488b742010-07-28 02:04:09 +00004097 }
4098 }
4099 }
Greg Claytonb9124572012-12-06 02:33:54 +00004100 }
4101 break;
4102
4103 case clang::Type::ObjCObjectPointer:
4104 if (idx_is_valid)
4105 {
4106 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
4107 QualType pointee_type = pointer_type->getPointeeType();
4108
4109 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
Greg Clayton9488b742010-07-28 02:04:09 +00004110 {
Greg Claytonb9124572012-12-06 02:33:54 +00004111 child_is_deref_of_parent = false;
4112 bool tmp_child_is_deref_of_parent = false;
4113 return GetChildClangTypeAtIndex (exe_ctx,
4114 ast,
4115 parent_name,
4116 pointer_type->getPointeeType().getAsOpaquePtr(),
4117 idx,
4118 transparent_pointers,
4119 omit_empty_base_classes,
4120 ignore_array_bounds,
4121 child_name,
4122 child_byte_size,
4123 child_byte_offset,
4124 child_bitfield_bit_size,
4125 child_bitfield_bit_offset,
4126 child_is_base_class,
4127 tmp_child_is_deref_of_parent);
4128 }
4129 else
4130 {
4131 child_is_deref_of_parent = true;
4132 if (parent_name)
Greg Clayton960d6a42010-08-03 00:35:52 +00004133 {
Greg Claytonb9124572012-12-06 02:33:54 +00004134 child_name.assign(1, '*');
4135 child_name += parent_name;
Greg Clayton960d6a42010-08-03 00:35:52 +00004136 }
Greg Clayton960d6a42010-08-03 00:35:52 +00004137
Greg Claytonb9124572012-12-06 02:33:54 +00004138 // We have a pointer to an simple type
4139 if (idx == 0 && GetCompleteQualType(ast, pointee_type))
4140 {
4141 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
4142 assert(clang_type_info.first % 8 == 0);
4143 child_byte_size = clang_type_info.first / 8;
4144 child_byte_offset = 0;
4145 return pointee_type.getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +00004146 }
Greg Clayton9488b742010-07-28 02:04:09 +00004147 }
Greg Claytonb9124572012-12-06 02:33:54 +00004148 }
4149 break;
Greg Clayton9488b742010-07-28 02:04:09 +00004150
Greg Clayton1674b122010-07-21 22:12:05 +00004151 case clang::Type::ConstantArray:
Greg Claytonb9124572012-12-06 02:33:54 +00004152 case clang::Type::IncompleteArray:
4153 if (ignore_array_bounds || idx_is_valid)
Chris Lattner24943d22010-06-08 16:52:24 +00004154 {
Greg Claytonb9124572012-12-06 02:33:54 +00004155 const ArrayType *array = cast<ArrayType>(parent_qual_type.getTypePtr());
4156 if (array)
Chris Lattner24943d22010-06-08 16:52:24 +00004157 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004158 if (GetCompleteQualType (ast, array->getElementType()))
4159 {
4160 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Greg Claytonb9124572012-12-06 02:33:54 +00004161
Greg Claytonb01000f2011-01-17 03:46:26 +00004162 char element_name[64];
4163 ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
Greg Claytonb9124572012-12-06 02:33:54 +00004164
Greg Claytonb01000f2011-01-17 03:46:26 +00004165 child_name.assign(element_name);
4166 assert(field_type_info.first % 8 == 0);
4167 child_byte_size = field_type_info.first / 8;
Greg Clayton24b03102011-07-09 20:12:33 +00004168 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
Greg Claytonb01000f2011-01-17 03:46:26 +00004169 return array->getElementType().getAsOpaquePtr();
4170 }
Chris Lattner24943d22010-06-08 16:52:24 +00004171 }
4172 }
4173 break;
Greg Claytonb9124572012-12-06 02:33:54 +00004174
Chris Lattner24943d22010-06-08 16:52:24 +00004175
Greg Claytonb9124572012-12-06 02:33:54 +00004176 case clang::Type::Pointer:
4177 if (idx_is_valid)
4178 {
4179 const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
4180 QualType pointee_type = pointer_type->getPointeeType();
4181
4182 // Don't dereference "void *" pointers
4183 if (pointee_type->isVoidType())
4184 return NULL;
4185
4186 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
Chris Lattner24943d22010-06-08 16:52:24 +00004187 {
Greg Claytonb9124572012-12-06 02:33:54 +00004188 child_is_deref_of_parent = false;
4189 bool tmp_child_is_deref_of_parent = false;
4190 return GetChildClangTypeAtIndex (exe_ctx,
4191 ast,
4192 parent_name,
4193 pointer_type->getPointeeType().getAsOpaquePtr(),
4194 idx,
4195 transparent_pointers,
4196 omit_empty_base_classes,
4197 ignore_array_bounds,
4198 child_name,
4199 child_byte_size,
4200 child_byte_offset,
4201 child_bitfield_bit_size,
4202 child_bitfield_bit_offset,
4203 child_is_base_class,
4204 tmp_child_is_deref_of_parent);
4205 }
4206 else
4207 {
4208 child_is_deref_of_parent = true;
Chris Lattner24943d22010-06-08 16:52:24 +00004209
Greg Claytonb9124572012-12-06 02:33:54 +00004210 if (parent_name)
Chris Lattner24943d22010-06-08 16:52:24 +00004211 {
Greg Claytonb9124572012-12-06 02:33:54 +00004212 child_name.assign(1, '*');
4213 child_name += parent_name;
Chris Lattner24943d22010-06-08 16:52:24 +00004214 }
Greg Claytonb9124572012-12-06 02:33:54 +00004215
4216 // We have a pointer to an simple type
4217 if (idx == 0)
Chris Lattner24943d22010-06-08 16:52:24 +00004218 {
Greg Claytonb9124572012-12-06 02:33:54 +00004219 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
4220 assert(clang_type_info.first % 8 == 0);
4221 child_byte_size = clang_type_info.first / 8;
4222 child_byte_offset = 0;
4223 return pointee_type.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00004224 }
4225 }
Chris Lattner24943d22010-06-08 16:52:24 +00004226 }
Greg Claytonb9124572012-12-06 02:33:54 +00004227 break;
4228
4229 case clang::Type::LValueReference:
4230 case clang::Type::RValueReference:
4231 if (idx_is_valid)
4232 {
4233 const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
4234 QualType pointee_type(reference_type->getPointeeType());
4235 clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
4236 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
4237 {
4238 child_is_deref_of_parent = false;
4239 bool tmp_child_is_deref_of_parent = false;
4240 return GetChildClangTypeAtIndex (exe_ctx,
4241 ast,
4242 parent_name,
4243 pointee_clang_type,
4244 idx,
4245 transparent_pointers,
4246 omit_empty_base_classes,
4247 ignore_array_bounds,
4248 child_name,
4249 child_byte_size,
4250 child_byte_offset,
4251 child_bitfield_bit_size,
4252 child_bitfield_bit_offset,
4253 child_is_base_class,
4254 tmp_child_is_deref_of_parent);
4255 }
4256 else
4257 {
4258 if (parent_name)
4259 {
4260 child_name.assign(1, '&');
4261 child_name += parent_name;
4262 }
4263
4264 // We have a pointer to an simple type
4265 if (idx == 0)
4266 {
4267 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
4268 assert(clang_type_info.first % 8 == 0);
4269 child_byte_size = clang_type_info.first / 8;
4270 child_byte_offset = 0;
4271 return pointee_type.getAsOpaquePtr();
4272 }
4273 }
4274 }
4275 break;
4276
4277 case clang::Type::Typedef:
4278 return GetChildClangTypeAtIndex (exe_ctx,
4279 ast,
4280 parent_name,
4281 cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
4282 idx,
4283 transparent_pointers,
4284 omit_empty_base_classes,
4285 ignore_array_bounds,
4286 child_name,
4287 child_byte_size,
4288 child_byte_offset,
4289 child_bitfield_bit_size,
4290 child_bitfield_bit_offset,
4291 child_is_base_class,
4292 child_is_deref_of_parent);
4293 break;
4294
4295 case clang::Type::Elaborated:
4296 return GetChildClangTypeAtIndex (exe_ctx,
4297 ast,
4298 parent_name,
4299 cast<ElaboratedType>(parent_qual_type)->getNamedType().getAsOpaquePtr(),
4300 idx,
4301 transparent_pointers,
4302 omit_empty_base_classes,
4303 ignore_array_bounds,
4304 child_name,
4305 child_byte_size,
4306 child_byte_offset,
4307 child_bitfield_bit_size,
4308 child_bitfield_bit_offset,
4309 child_is_base_class,
4310 child_is_deref_of_parent);
4311
4312 default:
4313 break;
Chris Lattner24943d22010-06-08 16:52:24 +00004314 }
Greg Claytonf8e98a62010-07-23 15:37:46 +00004315 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00004316}
4317
4318static inline bool
4319BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
4320{
Greg Claytonb01000f2011-01-17 03:46:26 +00004321 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner24943d22010-06-08 16:52:24 +00004322}
4323
4324static uint32_t
4325GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
4326{
4327 uint32_t num_bases = 0;
4328 if (cxx_record_decl)
4329 {
4330 if (omit_empty_base_classes)
4331 {
4332 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4333 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4334 base_class != base_class_end;
4335 ++base_class)
4336 {
4337 // Skip empty base classes
4338 if (omit_empty_base_classes)
4339 {
4340 if (BaseSpecifierIsEmpty (base_class))
4341 continue;
4342 }
4343 ++num_bases;
4344 }
4345 }
4346 else
4347 num_bases = cxx_record_decl->getNumBases();
4348 }
4349 return num_bases;
4350}
4351
4352
4353static uint32_t
4354GetIndexForRecordBase
4355(
4356 const RecordDecl *record_decl,
4357 const CXXBaseSpecifier *base_spec,
4358 bool omit_empty_base_classes
4359)
4360{
4361 uint32_t child_idx = 0;
4362
4363 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4364
4365// const char *super_name = record_decl->getNameAsCString();
4366// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
4367// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
4368//
4369 if (cxx_record_decl)
4370 {
4371 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4372 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4373 base_class != base_class_end;
4374 ++base_class)
4375 {
4376 if (omit_empty_base_classes)
4377 {
4378 if (BaseSpecifierIsEmpty (base_class))
4379 continue;
4380 }
4381
4382// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
4383// child_idx,
4384// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
4385//
4386//
4387 if (base_class == base_spec)
4388 return child_idx;
4389 ++child_idx;
4390 }
4391 }
4392
4393 return UINT32_MAX;
4394}
4395
4396
4397static uint32_t
4398GetIndexForRecordChild
4399(
4400 const RecordDecl *record_decl,
4401 NamedDecl *canonical_decl,
4402 bool omit_empty_base_classes
4403)
4404{
4405 uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
4406
4407// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4408//
4409//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
4410// if (cxx_record_decl)
4411// {
4412// CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4413// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4414// base_class != base_class_end;
4415// ++base_class)
4416// {
4417// if (omit_empty_base_classes)
4418// {
4419// if (BaseSpecifierIsEmpty (base_class))
4420// continue;
4421// }
4422//
4423//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
4424//// record_decl->getNameAsCString(),
4425//// canonical_decl->getNameAsCString(),
4426//// child_idx,
4427//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
4428//
4429//
4430// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4431// if (curr_base_class_decl == canonical_decl)
4432// {
4433// return child_idx;
4434// }
4435// ++child_idx;
4436// }
4437// }
4438//
4439// const uint32_t num_bases = child_idx;
4440 RecordDecl::field_iterator field, field_end;
4441 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4442 field != field_end;
4443 ++field, ++child_idx)
4444 {
4445// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
4446// record_decl->getNameAsCString(),
4447// canonical_decl->getNameAsCString(),
4448// child_idx - num_bases,
4449// field->getNameAsCString());
4450
4451 if (field->getCanonicalDecl() == canonical_decl)
4452 return child_idx;
4453 }
4454
4455 return UINT32_MAX;
4456}
4457
4458// Look for a child member (doesn't include base classes, but it does include
4459// their members) in the type hierarchy. Returns an index path into "clang_type"
4460// on how to reach the appropriate member.
4461//
4462// class A
4463// {
4464// public:
4465// int m_a;
4466// int m_b;
4467// };
4468//
4469// class B
4470// {
4471// };
4472//
4473// class C :
4474// public B,
4475// public A
4476// {
4477// };
4478//
4479// If we have a clang type that describes "class C", and we wanted to looked
4480// "m_b" in it:
4481//
4482// With omit_empty_base_classes == false we would get an integer array back with:
4483// { 1, 1 }
4484// The first index 1 is the child index for "class A" within class C
4485// The second index 1 is the child index for "m_b" within class A
4486//
4487// With omit_empty_base_classes == true we would get an integer array back with:
4488// { 0, 1 }
4489// 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)
4490// The second index 1 is the child index for "m_b" within class A
4491
4492size_t
4493ClangASTContext::GetIndexOfChildMemberWithName
4494(
Greg Claytonb01000f2011-01-17 03:46:26 +00004495 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00004496 clang_type_t clang_type,
Chris Lattner24943d22010-06-08 16:52:24 +00004497 const char *name,
4498 bool omit_empty_base_classes,
4499 std::vector<uint32_t>& child_indexes
4500)
4501{
4502 if (clang_type && name && name[0])
4503 {
4504 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton03e0f972010-09-13 03:32:57 +00004505 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4506 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00004507 {
Greg Clayton1674b122010-07-21 22:12:05 +00004508 case clang::Type::Record:
Greg Clayton7a183dc2011-01-20 04:18:48 +00004509 if (GetCompleteQualType (ast, qual_type))
Chris Lattner24943d22010-06-08 16:52:24 +00004510 {
4511 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4512 const RecordDecl *record_decl = record_type->getDecl();
4513
4514 assert(record_decl);
4515 uint32_t child_idx = 0;
4516
4517 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4518
4519 // Try and find a field that matches NAME
4520 RecordDecl::field_iterator field, field_end;
4521 StringRef name_sref(name);
4522 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4523 field != field_end;
4524 ++field, ++child_idx)
4525 {
4526 if (field->getName().equals (name_sref))
4527 {
4528 // We have to add on the number of base classes to this index!
4529 child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
4530 return child_indexes.size();
4531 }
4532 }
4533
4534 if (cxx_record_decl)
4535 {
4536 const RecordDecl *parent_record_decl = cxx_record_decl;
4537
4538 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
4539
4540 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
4541 // Didn't find things easily, lets let clang do its thang...
Sean Callanan9b6898f2011-07-30 02:42:06 +00004542 IdentifierInfo & ident_ref = ast->Idents.get(name_sref);
Chris Lattner24943d22010-06-08 16:52:24 +00004543 DeclarationName decl_name(&ident_ref);
4544
4545 CXXBasePaths paths;
4546 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
4547 decl_name.getAsOpaquePtr(),
4548 paths))
4549 {
Chris Lattner24943d22010-06-08 16:52:24 +00004550 CXXBasePaths::const_paths_iterator path, path_end = paths.end();
4551 for (path = paths.begin(); path != path_end; ++path)
4552 {
4553 const size_t num_path_elements = path->size();
4554 for (size_t e=0; e<num_path_elements; ++e)
4555 {
4556 CXXBasePathElement elem = (*path)[e];
4557
4558 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
4559 if (child_idx == UINT32_MAX)
4560 {
4561 child_indexes.clear();
4562 return 0;
4563 }
4564 else
4565 {
4566 child_indexes.push_back (child_idx);
4567 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
4568 }
4569 }
4570 DeclContext::lookup_iterator named_decl_pos;
4571 for (named_decl_pos = path->Decls.first;
4572 named_decl_pos != path->Decls.second && parent_record_decl;
4573 ++named_decl_pos)
4574 {
Chris Lattner24943d22010-06-08 16:52:24 +00004575 child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
4576 if (child_idx == UINT32_MAX)
4577 {
4578 child_indexes.clear();
4579 return 0;
4580 }
4581 else
4582 {
4583 child_indexes.push_back (child_idx);
4584 }
4585 }
4586 }
4587 return child_indexes.size();
4588 }
4589 }
4590
4591 }
4592 break;
4593
Greg Clayton9488b742010-07-28 02:04:09 +00004594 case clang::Type::ObjCObject:
4595 case clang::Type::ObjCInterface:
Greg Clayton7a183dc2011-01-20 04:18:48 +00004596 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9488b742010-07-28 02:04:09 +00004597 {
4598 StringRef name_sref(name);
Sean Callanand5b3c352011-01-27 04:42:51 +00004599 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00004600 assert (objc_class_type);
4601 if (objc_class_type)
4602 {
4603 uint32_t child_idx = 0;
4604 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4605
4606 if (class_interface_decl)
4607 {
4608 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4609 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4610
Greg Clayton823533e2010-09-18 02:11:07 +00004611 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
Greg Clayton9488b742010-07-28 02:04:09 +00004612 {
4613 const ObjCIvarDecl* ivar_decl = *ivar_pos;
4614
4615 if (ivar_decl->getName().equals (name_sref))
4616 {
4617 if ((!omit_empty_base_classes && superclass_interface_decl) ||
4618 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
4619 ++child_idx;
4620
4621 child_indexes.push_back (child_idx);
4622 return child_indexes.size();
4623 }
4624 }
4625
4626 if (superclass_interface_decl)
4627 {
4628 // The super class index is always zero for ObjC classes,
4629 // so we push it onto the child indexes in case we find
4630 // an ivar in our superclass...
4631 child_indexes.push_back (0);
4632
Greg Claytonb01000f2011-01-17 03:46:26 +00004633 if (GetIndexOfChildMemberWithName (ast,
4634 ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
Greg Clayton9488b742010-07-28 02:04:09 +00004635 name,
4636 omit_empty_base_classes,
4637 child_indexes))
4638 {
4639 // We did find an ivar in a superclass so just
4640 // return the results!
4641 return child_indexes.size();
4642 }
4643
4644 // We didn't find an ivar matching "name" in our
4645 // superclass, pop the superclass zero index that
4646 // we pushed on above.
4647 child_indexes.pop_back();
4648 }
4649 }
4650 }
4651 }
4652 break;
4653
4654 case clang::Type::ObjCObjectPointer:
4655 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004656 return GetIndexOfChildMemberWithName (ast,
Greg Clayton9488b742010-07-28 02:04:09 +00004657 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
4658 name,
4659 omit_empty_base_classes,
4660 child_indexes);
4661 }
4662 break;
4663
4664
Greg Clayton1674b122010-07-21 22:12:05 +00004665 case clang::Type::ConstantArray:
Chris Lattner24943d22010-06-08 16:52:24 +00004666 {
4667// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4668// const uint64_t element_count = array->getSize().getLimitedValue();
4669//
4670// if (idx < element_count)
4671// {
Greg Claytonb01000f2011-01-17 03:46:26 +00004672// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner24943d22010-06-08 16:52:24 +00004673//
4674// char element_name[32];
4675// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
4676//
4677// child_name.assign(element_name);
4678// assert(field_type_info.first % 8 == 0);
4679// child_byte_size = field_type_info.first / 8;
4680// child_byte_offset = idx * child_byte_size;
4681// return array->getElementType().getAsOpaquePtr();
4682// }
4683 }
4684 break;
4685
Greg Clayton1674b122010-07-21 22:12:05 +00004686// case clang::Type::MemberPointerType:
Chris Lattner24943d22010-06-08 16:52:24 +00004687// {
4688// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
4689// QualType pointee_type = mem_ptr_type->getPointeeType();
4690//
4691// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4692// {
Greg Claytonb01000f2011-01-17 03:46:26 +00004693// return GetIndexOfChildWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004694// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
4695// name);
4696// }
4697// }
4698// break;
4699//
Greg Clayton1674b122010-07-21 22:12:05 +00004700 case clang::Type::LValueReference:
4701 case clang::Type::RValueReference:
Chris Lattner24943d22010-06-08 16:52:24 +00004702 {
Sean Callanand5b3c352011-01-27 04:42:51 +00004703 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00004704 QualType pointee_type = reference_type->getPointeeType();
4705
4706 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4707 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004708 return GetIndexOfChildMemberWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004709 reference_type->getPointeeType().getAsOpaquePtr(),
4710 name,
4711 omit_empty_base_classes,
4712 child_indexes);
4713 }
4714 }
4715 break;
4716
Greg Clayton1674b122010-07-21 22:12:05 +00004717 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00004718 {
Sean Callanand5b3c352011-01-27 04:42:51 +00004719 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00004720 QualType pointee_type = pointer_type->getPointeeType();
4721
4722 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4723 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004724 return GetIndexOfChildMemberWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004725 pointer_type->getPointeeType().getAsOpaquePtr(),
4726 name,
4727 omit_empty_base_classes,
4728 child_indexes);
4729 }
4730 else
4731 {
4732// if (parent_name)
4733// {
4734// child_name.assign(1, '*');
4735// child_name += parent_name;
4736// }
4737//
4738// // We have a pointer to an simple type
4739// if (idx == 0)
4740// {
Greg Claytonb01000f2011-01-17 03:46:26 +00004741// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner24943d22010-06-08 16:52:24 +00004742// assert(clang_type_info.first % 8 == 0);
4743// child_byte_size = clang_type_info.first / 8;
4744// child_byte_offset = 0;
4745// return pointee_type.getAsOpaquePtr();
4746// }
4747 }
4748 }
4749 break;
4750
Greg Clayton1674b122010-07-21 22:12:05 +00004751 case clang::Type::Typedef:
Greg Claytonb01000f2011-01-17 03:46:26 +00004752 return GetIndexOfChildMemberWithName (ast,
Sean Callanan9e7958e2010-12-13 01:26:27 +00004753 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner24943d22010-06-08 16:52:24 +00004754 name,
4755 omit_empty_base_classes,
4756 child_indexes);
4757
4758 default:
4759 break;
4760 }
4761 }
4762 return 0;
4763}
4764
4765
4766// Get the index of the child of "clang_type" whose name matches. This function
4767// doesn't descend into the children, but only looks one level deep and name
4768// matches can include base class names.
4769
4770uint32_t
4771ClangASTContext::GetIndexOfChildWithName
4772(
Greg Claytonb01000f2011-01-17 03:46:26 +00004773 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00004774 clang_type_t clang_type,
Chris Lattner24943d22010-06-08 16:52:24 +00004775 const char *name,
4776 bool omit_empty_base_classes
4777)
4778{
4779 if (clang_type && name && name[0])
4780 {
4781 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9488b742010-07-28 02:04:09 +00004782
Greg Clayton03e0f972010-09-13 03:32:57 +00004783 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
Greg Clayton9488b742010-07-28 02:04:09 +00004784
Greg Clayton03e0f972010-09-13 03:32:57 +00004785 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00004786 {
Greg Clayton1674b122010-07-21 22:12:05 +00004787 case clang::Type::Record:
Greg Clayton7a183dc2011-01-20 04:18:48 +00004788 if (GetCompleteQualType (ast, qual_type))
Chris Lattner24943d22010-06-08 16:52:24 +00004789 {
4790 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4791 const RecordDecl *record_decl = record_type->getDecl();
4792
4793 assert(record_decl);
4794 uint32_t child_idx = 0;
4795
4796 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4797
4798 if (cxx_record_decl)
4799 {
4800 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4801 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4802 base_class != base_class_end;
4803 ++base_class)
4804 {
4805 // Skip empty base classes
4806 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4807 if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
4808 continue;
4809
Greg Claytondc0a38c2012-03-26 23:03:23 +00004810 std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(ast, base_class->getType()));
Greg Claytonb302b2f2011-06-30 02:28:26 +00004811 if (base_class_type_name.compare (name) == 0)
Chris Lattner24943d22010-06-08 16:52:24 +00004812 return child_idx;
4813 ++child_idx;
4814 }
4815 }
4816
4817 // Try and find a field that matches NAME
4818 RecordDecl::field_iterator field, field_end;
4819 StringRef name_sref(name);
4820 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4821 field != field_end;
4822 ++field, ++child_idx)
4823 {
4824 if (field->getName().equals (name_sref))
4825 return child_idx;
4826 }
4827
4828 }
4829 break;
4830
Greg Clayton9488b742010-07-28 02:04:09 +00004831 case clang::Type::ObjCObject:
4832 case clang::Type::ObjCInterface:
Greg Clayton7a183dc2011-01-20 04:18:48 +00004833 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9488b742010-07-28 02:04:09 +00004834 {
4835 StringRef name_sref(name);
Sean Callanand5b3c352011-01-27 04:42:51 +00004836 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00004837 assert (objc_class_type);
4838 if (objc_class_type)
4839 {
4840 uint32_t child_idx = 0;
4841 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4842
4843 if (class_interface_decl)
4844 {
4845 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4846 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4847
Jim Ingham58146a92012-10-04 22:22:16 +00004848 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
Greg Clayton9488b742010-07-28 02:04:09 +00004849 {
4850 const ObjCIvarDecl* ivar_decl = *ivar_pos;
4851
4852 if (ivar_decl->getName().equals (name_sref))
4853 {
4854 if ((!omit_empty_base_classes && superclass_interface_decl) ||
4855 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
4856 ++child_idx;
4857
4858 return child_idx;
4859 }
4860 }
4861
4862 if (superclass_interface_decl)
4863 {
4864 if (superclass_interface_decl->getName().equals (name_sref))
4865 return 0;
4866 }
4867 }
4868 }
4869 }
4870 break;
4871
4872 case clang::Type::ObjCObjectPointer:
4873 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004874 return GetIndexOfChildWithName (ast,
Greg Clayton9488b742010-07-28 02:04:09 +00004875 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
4876 name,
4877 omit_empty_base_classes);
4878 }
4879 break;
4880
Greg Clayton1674b122010-07-21 22:12:05 +00004881 case clang::Type::ConstantArray:
Chris Lattner24943d22010-06-08 16:52:24 +00004882 {
4883// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4884// const uint64_t element_count = array->getSize().getLimitedValue();
4885//
4886// if (idx < element_count)
4887// {
Greg Claytonb01000f2011-01-17 03:46:26 +00004888// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner24943d22010-06-08 16:52:24 +00004889//
4890// char element_name[32];
4891// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
4892//
4893// child_name.assign(element_name);
4894// assert(field_type_info.first % 8 == 0);
4895// child_byte_size = field_type_info.first / 8;
4896// child_byte_offset = idx * child_byte_size;
4897// return array->getElementType().getAsOpaquePtr();
4898// }
4899 }
4900 break;
4901
Greg Clayton1674b122010-07-21 22:12:05 +00004902// case clang::Type::MemberPointerType:
Chris Lattner24943d22010-06-08 16:52:24 +00004903// {
4904// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
4905// QualType pointee_type = mem_ptr_type->getPointeeType();
4906//
4907// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4908// {
Greg Claytonb01000f2011-01-17 03:46:26 +00004909// return GetIndexOfChildWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004910// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
4911// name);
4912// }
4913// }
4914// break;
4915//
Greg Clayton1674b122010-07-21 22:12:05 +00004916 case clang::Type::LValueReference:
4917 case clang::Type::RValueReference:
Chris Lattner24943d22010-06-08 16:52:24 +00004918 {
Sean Callanand5b3c352011-01-27 04:42:51 +00004919 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00004920 QualType pointee_type = reference_type->getPointeeType();
4921
4922 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4923 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004924 return GetIndexOfChildWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004925 reference_type->getPointeeType().getAsOpaquePtr(),
4926 name,
4927 omit_empty_base_classes);
4928 }
4929 }
4930 break;
4931
Greg Clayton1674b122010-07-21 22:12:05 +00004932 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00004933 {
Sean Callanand5b3c352011-01-27 04:42:51 +00004934 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00004935 QualType pointee_type = pointer_type->getPointeeType();
4936
4937 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4938 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004939 return GetIndexOfChildWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004940 pointer_type->getPointeeType().getAsOpaquePtr(),
4941 name,
4942 omit_empty_base_classes);
4943 }
4944 else
4945 {
4946// if (parent_name)
4947// {
4948// child_name.assign(1, '*');
4949// child_name += parent_name;
4950// }
4951//
4952// // We have a pointer to an simple type
4953// if (idx == 0)
4954// {
Greg Claytonb01000f2011-01-17 03:46:26 +00004955// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner24943d22010-06-08 16:52:24 +00004956// assert(clang_type_info.first % 8 == 0);
4957// child_byte_size = clang_type_info.first / 8;
4958// child_byte_offset = 0;
4959// return pointee_type.getAsOpaquePtr();
4960// }
4961 }
4962 }
4963 break;
4964
Greg Clayton1674b122010-07-21 22:12:05 +00004965 case clang::Type::Typedef:
Greg Claytonb01000f2011-01-17 03:46:26 +00004966 return GetIndexOfChildWithName (ast,
Sean Callanan9e7958e2010-12-13 01:26:27 +00004967 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner24943d22010-06-08 16:52:24 +00004968 name,
4969 omit_empty_base_classes);
4970
4971 default:
4972 break;
4973 }
4974 }
4975 return UINT32_MAX;
4976}
4977
4978#pragma mark TagType
4979
4980bool
Greg Clayton462d4142010-09-29 01:12:09 +00004981ClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
Chris Lattner24943d22010-06-08 16:52:24 +00004982{
4983 if (tag_clang_type)
4984 {
4985 QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
Sean Callanand5b3c352011-01-27 04:42:51 +00004986 const clang::Type *clang_type = tag_qual_type.getTypePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00004987 if (clang_type)
4988 {
Sean Callanand5b3c352011-01-27 04:42:51 +00004989 const TagType *tag_type = dyn_cast<TagType>(clang_type);
Chris Lattner24943d22010-06-08 16:52:24 +00004990 if (tag_type)
4991 {
4992 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
4993 if (tag_decl)
4994 {
4995 tag_decl->setTagKind ((TagDecl::TagKind)kind);
4996 return true;
4997 }
4998 }
4999 }
5000 }
5001 return false;
5002}
5003
5004
5005#pragma mark DeclContext Functions
5006
5007DeclContext *
Greg Clayton462d4142010-09-29 01:12:09 +00005008ClangASTContext::GetDeclContextForType (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005009{
5010 if (clang_type == NULL)
5011 return NULL;
5012
5013 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton03e0f972010-09-13 03:32:57 +00005014 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5015 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00005016 {
Sean Callanan9b6898f2011-07-30 02:42:06 +00005017 case clang::Type::UnaryTransform: break;
Greg Clayton9488b742010-07-28 02:04:09 +00005018 case clang::Type::FunctionNoProto: break;
5019 case clang::Type::FunctionProto: break;
5020 case clang::Type::IncompleteArray: break;
5021 case clang::Type::VariableArray: break;
5022 case clang::Type::ConstantArray: break;
Sean Callanan279584c2011-03-15 00:17:19 +00005023 case clang::Type::DependentSizedArray: break;
Greg Clayton9488b742010-07-28 02:04:09 +00005024 case clang::Type::ExtVector: break;
Sean Callanan279584c2011-03-15 00:17:19 +00005025 case clang::Type::DependentSizedExtVector: break;
Greg Clayton9488b742010-07-28 02:04:09 +00005026 case clang::Type::Vector: break;
5027 case clang::Type::Builtin: break;
5028 case clang::Type::BlockPointer: break;
5029 case clang::Type::Pointer: break;
5030 case clang::Type::LValueReference: break;
5031 case clang::Type::RValueReference: break;
5032 case clang::Type::MemberPointer: break;
5033 case clang::Type::Complex: break;
5034 case clang::Type::ObjCObject: break;
5035 case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
5036 case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
5037 case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl();
5038 case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl();
Sean Callanan9e7958e2010-12-13 01:26:27 +00005039 case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00005040 case clang::Type::Elaborated: return ClangASTContext::GetDeclContextForType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00005041 case clang::Type::TypeOfExpr: break;
5042 case clang::Type::TypeOf: break;
5043 case clang::Type::Decltype: break;
5044 //case clang::Type::QualifiedName: break;
5045 case clang::Type::TemplateSpecialization: break;
Sean Callanan279584c2011-03-15 00:17:19 +00005046 case clang::Type::DependentTemplateSpecialization: break;
5047 case clang::Type::TemplateTypeParm: break;
5048 case clang::Type::SubstTemplateTypeParm: break;
5049 case clang::Type::SubstTemplateTypeParmPack:break;
5050 case clang::Type::PackExpansion: break;
5051 case clang::Type::UnresolvedUsing: break;
5052 case clang::Type::Paren: break;
Sean Callanan279584c2011-03-15 00:17:19 +00005053 case clang::Type::Attributed: break;
5054 case clang::Type::Auto: break;
5055 case clang::Type::InjectedClassName: break;
5056 case clang::Type::DependentName: break;
Greg Claytonbc36a862011-10-08 00:49:15 +00005057 case clang::Type::Atomic: break;
Chris Lattner24943d22010-06-08 16:52:24 +00005058 }
5059 // No DeclContext in this type...
5060 return NULL;
5061}
5062
5063#pragma mark Namespace Declarations
5064
5065NamespaceDecl *
Greg Clayton63643042011-10-14 21:34:45 +00005066ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner24943d22010-06-08 16:52:24 +00005067{
Greg Clayton63643042011-10-14 21:34:45 +00005068 NamespaceDecl *namespace_decl = NULL;
Greg Claytonb5169392011-10-31 23:51:19 +00005069 ASTContext *ast = getASTContext();
5070 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
5071 if (decl_ctx == NULL)
5072 decl_ctx = translation_unit_decl;
5073
Chris Lattner24943d22010-06-08 16:52:24 +00005074 if (name)
5075 {
Greg Clayton63643042011-10-14 21:34:45 +00005076 IdentifierInfo &identifier_info = ast->Idents.get(name);
5077 DeclarationName decl_name (&identifier_info);
5078 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
5079 for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos)
5080 {
5081 namespace_decl = dyn_cast<clang::NamespaceDecl>(*pos);
5082 if (namespace_decl)
5083 return namespace_decl;
5084 }
5085
Sean Callanan8f2e3922012-02-04 08:49:35 +00005086 namespace_decl = NamespaceDecl::Create(*ast,
5087 decl_ctx,
5088 false,
5089 SourceLocation(),
5090 SourceLocation(),
5091 &identifier_info,
5092 NULL);
Greg Clayton63643042011-10-14 21:34:45 +00005093
Greg Claytonb5169392011-10-31 23:51:19 +00005094 decl_ctx->addDecl (namespace_decl);
Chris Lattner24943d22010-06-08 16:52:24 +00005095 }
Greg Claytonb5169392011-10-31 23:51:19 +00005096 else
5097 {
5098 if (decl_ctx == translation_unit_decl)
5099 {
5100 namespace_decl = translation_unit_decl->getAnonymousNamespace();
5101 if (namespace_decl)
5102 return namespace_decl;
5103
Sean Callanan8f2e3922012-02-04 08:49:35 +00005104 namespace_decl = NamespaceDecl::Create(*ast,
5105 decl_ctx,
5106 false,
5107 SourceLocation(),
5108 SourceLocation(),
5109 NULL,
5110 NULL);
Greg Claytonb5169392011-10-31 23:51:19 +00005111 translation_unit_decl->setAnonymousNamespace (namespace_decl);
5112 translation_unit_decl->addDecl (namespace_decl);
5113 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
5114 }
5115 else
5116 {
5117 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
5118 if (parent_namespace_decl)
5119 {
5120 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
5121 if (namespace_decl)
5122 return namespace_decl;
Sean Callanan8f2e3922012-02-04 08:49:35 +00005123 namespace_decl = NamespaceDecl::Create(*ast,
5124 decl_ctx,
5125 false,
5126 SourceLocation(),
5127 SourceLocation(),
5128 NULL,
5129 NULL);
Greg Claytonb5169392011-10-31 23:51:19 +00005130 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
5131 parent_namespace_decl->addDecl (namespace_decl);
5132 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
5133 }
5134 else
5135 {
5136 // BAD!!!
5137 }
5138 }
5139
5140
5141 if (namespace_decl)
5142 {
5143 // If we make it here, we are creating the anonymous namespace decl
5144 // for the first time, so we need to do the using directive magic
5145 // like SEMA does
5146 UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast,
5147 decl_ctx,
5148 SourceLocation(),
5149 SourceLocation(),
5150 NestedNameSpecifierLoc(),
5151 SourceLocation(),
5152 namespace_decl,
5153 decl_ctx);
5154 using_directive_decl->setImplicit();
5155 decl_ctx->addDecl(using_directive_decl);
5156 }
5157 }
5158#ifdef LLDB_CONFIGURATION_DEBUG
5159 VerifyDecl(namespace_decl);
5160#endif
Greg Clayton63643042011-10-14 21:34:45 +00005161 return namespace_decl;
Chris Lattner24943d22010-06-08 16:52:24 +00005162}
5163
5164
5165#pragma mark Function Types
5166
5167FunctionDecl *
Greg Clayton5f24c502011-10-14 22:47:18 +00005168ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx, const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
Chris Lattner24943d22010-06-08 16:52:24 +00005169{
Greg Clayton5f24c502011-10-14 22:47:18 +00005170 FunctionDecl *func_decl = NULL;
5171 ASTContext *ast = getASTContext();
5172 if (decl_ctx == NULL)
5173 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner24943d22010-06-08 16:52:24 +00005174
Greg Clayton5f24c502011-10-14 22:47:18 +00005175 if (name && name[0])
5176 {
5177 func_decl = FunctionDecl::Create (*ast,
5178 decl_ctx,
5179 SourceLocation(),
5180 SourceLocation(),
5181 DeclarationName (&ast->Idents.get(name)),
5182 QualType::getFromOpaquePtr(function_clang_type),
5183 NULL,
5184 (FunctionDecl::StorageClass)storage,
5185 (FunctionDecl::StorageClass)storage,
5186 is_inline);
Chris Lattner24943d22010-06-08 16:52:24 +00005187 }
Greg Clayton5f24c502011-10-14 22:47:18 +00005188 else
5189 {
5190 func_decl = FunctionDecl::Create (*ast,
5191 decl_ctx,
5192 SourceLocation(),
5193 SourceLocation(),
5194 DeclarationName (),
5195 QualType::getFromOpaquePtr(function_clang_type),
5196 NULL,
5197 (FunctionDecl::StorageClass)storage,
5198 (FunctionDecl::StorageClass)storage,
5199 is_inline);
5200 }
5201 if (func_decl)
5202 decl_ctx->addDecl (func_decl);
Sean Callananc6d161e2011-10-26 01:06:27 +00005203
5204#ifdef LLDB_CONFIGURATION_DEBUG
5205 VerifyDecl(func_decl);
5206#endif
5207
Greg Clayton5f24c502011-10-14 22:47:18 +00005208 return func_decl;
Chris Lattner24943d22010-06-08 16:52:24 +00005209}
5210
Greg Clayton462d4142010-09-29 01:12:09 +00005211clang_type_t
Greg Claytonb01000f2011-01-17 03:46:26 +00005212ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00005213 clang_type_t result_type,
5214 clang_type_t *args,
Sean Callanan2ea8f272010-09-16 20:40:25 +00005215 unsigned num_args,
5216 bool is_variadic,
5217 unsigned type_quals)
Chris Lattner24943d22010-06-08 16:52:24 +00005218{
Greg Claytonb01000f2011-01-17 03:46:26 +00005219 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +00005220 std::vector<QualType> qual_type_args;
5221 for (unsigned i=0; i<num_args; ++i)
5222 qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
5223
5224 // TODO: Detect calling convention in DWARF?
Sean Callananad293092011-01-18 23:32:05 +00005225 FunctionProtoType::ExtProtoInfo proto_info;
5226 proto_info.Variadic = is_variadic;
Sean Callanan279584c2011-03-15 00:17:19 +00005227 proto_info.ExceptionSpecType = EST_None;
Sean Callananad293092011-01-18 23:32:05 +00005228 proto_info.TypeQuals = type_quals;
Sean Callanan279584c2011-03-15 00:17:19 +00005229 proto_info.RefQualifier = RQ_None;
Sean Callananad293092011-01-18 23:32:05 +00005230 proto_info.NumExceptions = 0;
5231 proto_info.Exceptions = NULL;
5232
Greg Clayton5f24c502011-10-14 22:47:18 +00005233 return ast->getFunctionType (QualType::getFromOpaquePtr(result_type),
5234 qual_type_args.empty() ? NULL : &qual_type_args.front(),
5235 qual_type_args.size(),
5236 proto_info).getAsOpaquePtr(); // NoReturn);
Chris Lattner24943d22010-06-08 16:52:24 +00005237}
5238
5239ParmVarDecl *
Greg Clayton462d4142010-09-29 01:12:09 +00005240ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
Chris Lattner24943d22010-06-08 16:52:24 +00005241{
Greg Claytonb01000f2011-01-17 03:46:26 +00005242 ASTContext *ast = getASTContext();
5243 assert (ast != NULL);
5244 return ParmVarDecl::Create(*ast,
5245 ast->getTranslationUnitDecl(),
Chris Lattner24943d22010-06-08 16:52:24 +00005246 SourceLocation(),
Sean Callanan279584c2011-03-15 00:17:19 +00005247 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00005248 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callanan2ea8f272010-09-16 20:40:25 +00005249 QualType::getFromOpaquePtr(param_type),
Chris Lattner24943d22010-06-08 16:52:24 +00005250 NULL,
5251 (VarDecl::StorageClass)storage,
5252 (VarDecl::StorageClass)storage,
5253 0);
5254}
5255
5256void
5257ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
5258{
5259 if (function_decl)
Sean Callananc1535182011-10-07 23:18:13 +00005260 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner24943d22010-06-08 16:52:24 +00005261}
5262
5263
5264#pragma mark Array Types
5265
Greg Clayton462d4142010-09-29 01:12:09 +00005266clang_type_t
Greg Claytonb9124572012-12-06 02:33:54 +00005267ClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count)
Chris Lattner24943d22010-06-08 16:52:24 +00005268{
5269 if (element_type)
5270 {
Greg Claytonb01000f2011-01-17 03:46:26 +00005271 ASTContext *ast = getASTContext();
5272 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +00005273 llvm::APInt ap_element_count (64, element_count);
Greg Claytonb9124572012-12-06 02:33:54 +00005274 if (element_count == 0)
5275 {
5276 return ast->getIncompleteArrayType(QualType::getFromOpaquePtr(element_type),
5277 ArrayType::Normal,
5278 0).getAsOpaquePtr();
5279
5280 }
5281 else
5282 {
5283 return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
5284 ap_element_count,
5285 ArrayType::Normal,
5286 0).getAsOpaquePtr(); // ElemQuals
5287 }
Chris Lattner24943d22010-06-08 16:52:24 +00005288 }
5289 return NULL;
5290}
5291
5292
5293#pragma mark TagDecl
5294
5295bool
Greg Clayton462d4142010-09-29 01:12:09 +00005296ClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005297{
5298 if (clang_type)
5299 {
5300 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Sean Callanand5b3c352011-01-27 04:42:51 +00005301 const clang::Type *t = qual_type.getTypePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005302 if (t)
5303 {
Sean Callanand5b3c352011-01-27 04:42:51 +00005304 const TagType *tag_type = dyn_cast<TagType>(t);
Chris Lattner24943d22010-06-08 16:52:24 +00005305 if (tag_type)
5306 {
5307 TagDecl *tag_decl = tag_type->getDecl();
5308 if (tag_decl)
5309 {
5310 tag_decl->startDefinition();
5311 return true;
5312 }
5313 }
Sean Callanan8f2e3922012-02-04 08:49:35 +00005314
5315 const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(t);
5316 if (object_type)
5317 {
5318 ObjCInterfaceDecl *interface_decl = object_type->getInterface();
5319 if (interface_decl)
5320 {
5321 interface_decl->startDefinition();
5322 return true;
5323 }
5324 }
Chris Lattner24943d22010-06-08 16:52:24 +00005325 }
5326 }
5327 return false;
5328}
5329
5330bool
Greg Clayton462d4142010-09-29 01:12:09 +00005331ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005332{
5333 if (clang_type)
5334 {
5335 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton55b6c532010-09-29 03:44:17 +00005336
5337 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5338
5339 if (cxx_record_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00005340 {
Greg Clayton55b6c532010-09-29 03:44:17 +00005341 cxx_record_decl->completeDefinition();
5342
5343 return true;
5344 }
5345
5346 const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
5347
5348 if (enum_type)
5349 {
5350 EnumDecl *enum_decl = enum_type->getDecl();
5351
5352 if (enum_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00005353 {
Greg Clayton55b6c532010-09-29 03:44:17 +00005354 /// TODO This really needs to be fixed.
5355
5356 unsigned NumPositiveBits = 1;
5357 unsigned NumNegativeBits = 0;
5358
Greg Claytonb01000f2011-01-17 03:46:26 +00005359 ASTContext *ast = getASTContext();
Greg Clayton48fbdf72010-10-12 04:29:14 +00005360
5361 QualType promotion_qual_type;
5362 // If the enum integer type is less than an integer in bit width,
5363 // then we must promote it to an integer size.
Greg Claytonb01000f2011-01-17 03:46:26 +00005364 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
Greg Clayton48fbdf72010-10-12 04:29:14 +00005365 {
5366 if (enum_decl->getIntegerType()->isSignedIntegerType())
Greg Claytonb01000f2011-01-17 03:46:26 +00005367 promotion_qual_type = ast->IntTy;
Greg Clayton48fbdf72010-10-12 04:29:14 +00005368 else
Greg Claytonb01000f2011-01-17 03:46:26 +00005369 promotion_qual_type = ast->UnsignedIntTy;
Greg Clayton48fbdf72010-10-12 04:29:14 +00005370 }
5371 else
5372 promotion_qual_type = enum_decl->getIntegerType();
5373
5374 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Clayton55b6c532010-09-29 03:44:17 +00005375 return true;
Chris Lattner24943d22010-06-08 16:52:24 +00005376 }
5377 }
5378 }
5379 return false;
5380}
5381
5382
5383#pragma mark Enumeration Types
5384
Greg Clayton462d4142010-09-29 01:12:09 +00005385clang_type_t
Greg Clayton0d62dfd2011-01-14 04:54:56 +00005386ClangASTContext::CreateEnumerationType
5387(
5388 const char *name,
5389 DeclContext *decl_ctx,
5390 const Declaration &decl,
5391 clang_type_t integer_qual_type
5392)
Chris Lattner24943d22010-06-08 16:52:24 +00005393{
5394 // TODO: Do something intelligent with the Declaration object passed in
5395 // like maybe filling in the SourceLocation with it...
Greg Claytonb01000f2011-01-17 03:46:26 +00005396 ASTContext *ast = getASTContext();
5397 assert (ast != NULL);
Greg Clayton48fbdf72010-10-12 04:29:14 +00005398
5399 // TODO: ask about these...
5400// const bool IsScoped = false;
5401// const bool IsFixed = false;
5402
Greg Claytonb01000f2011-01-17 03:46:26 +00005403 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Clayton0d62dfd2011-01-14 04:54:56 +00005404 decl_ctx,
Greg Clayton48fbdf72010-10-12 04:29:14 +00005405 SourceLocation(),
Greg Clayton48fbdf72010-10-12 04:29:14 +00005406 SourceLocation(),
Sean Callanan279584c2011-03-15 00:17:19 +00005407 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callanan9e7958e2010-12-13 01:26:27 +00005408 NULL,
5409 false, // IsScoped
5410 false, // IsScopedUsingClassTag
5411 false); // IsFixed
Sean Callanan864bfdb2011-01-18 01:03:44 +00005412
5413
Chris Lattner24943d22010-06-08 16:52:24 +00005414 if (enum_decl)
Greg Claytone37f23c2010-09-12 23:17:56 +00005415 {
5416 // TODO: check if we should be setting the promotion type too?
5417 enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
Sean Callanan864bfdb2011-01-18 01:03:44 +00005418
5419 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
5420
Greg Claytonb01000f2011-01-17 03:46:26 +00005421 return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
Greg Claytone37f23c2010-09-12 23:17:56 +00005422 }
Chris Lattner24943d22010-06-08 16:52:24 +00005423 return NULL;
5424}
5425
Greg Clayton462d4142010-09-29 01:12:09 +00005426clang_type_t
5427ClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
5428{
5429 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
5430
Sean Callanand5b3c352011-01-27 04:42:51 +00005431 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Greg Clayton462d4142010-09-29 01:12:09 +00005432 if (clang_type)
5433 {
5434 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5435 if (enum_type)
5436 {
5437 EnumDecl *enum_decl = enum_type->getDecl();
5438 if (enum_decl)
5439 return enum_decl->getIntegerType().getAsOpaquePtr();
5440 }
5441 }
5442 return NULL;
5443}
Chris Lattner24943d22010-06-08 16:52:24 +00005444bool
5445ClangASTContext::AddEnumerationValueToEnumerationType
5446(
Greg Clayton462d4142010-09-29 01:12:09 +00005447 clang_type_t enum_clang_type,
5448 clang_type_t enumerator_clang_type,
Chris Lattner24943d22010-06-08 16:52:24 +00005449 const Declaration &decl,
5450 const char *name,
5451 int64_t enum_value,
5452 uint32_t enum_value_bit_size
5453)
5454{
5455 if (enum_clang_type && enumerator_clang_type && name)
5456 {
5457 // TODO: Do something intelligent with the Declaration object passed in
5458 // like maybe filling in the SourceLocation with it...
Greg Claytonb01000f2011-01-17 03:46:26 +00005459 ASTContext *ast = getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00005460 IdentifierTable *identifier_table = getIdentifierTable();
5461
Greg Claytonb01000f2011-01-17 03:46:26 +00005462 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +00005463 assert (identifier_table != NULL);
5464 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
5465
Sean Callanand5b3c352011-01-27 04:42:51 +00005466 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005467 if (clang_type)
5468 {
5469 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5470
5471 if (enum_type)
5472 {
5473 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
5474 enum_llvm_apsint = enum_value;
5475 EnumConstantDecl *enumerator_decl =
Greg Claytonb01000f2011-01-17 03:46:26 +00005476 EnumConstantDecl::Create (*ast,
5477 enum_type->getDecl(),
5478 SourceLocation(),
5479 name ? &identifier_table->get(name) : NULL, // Identifier
5480 QualType::getFromOpaquePtr(enumerator_clang_type),
5481 NULL,
5482 enum_llvm_apsint);
5483
Chris Lattner24943d22010-06-08 16:52:24 +00005484 if (enumerator_decl)
5485 {
5486 enum_type->getDecl()->addDecl(enumerator_decl);
Sean Callananc6d161e2011-10-26 01:06:27 +00005487
5488#ifdef LLDB_CONFIGURATION_DEBUG
5489 VerifyDecl(enumerator_decl);
5490#endif
5491
Chris Lattner24943d22010-06-08 16:52:24 +00005492 return true;
5493 }
5494 }
5495 }
5496 }
5497 return false;
5498}
5499
5500#pragma mark Pointers & References
5501
Greg Clayton462d4142010-09-29 01:12:09 +00005502clang_type_t
5503ClangASTContext::CreatePointerType (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005504{
Greg Clayton427f2902010-12-14 02:59:59 +00005505 return CreatePointerType (getASTContext(), clang_type);
5506}
5507
5508clang_type_t
5509ClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
5510{
5511 if (ast && clang_type)
Greg Clayton7b541032010-07-29 20:06:32 +00005512 {
5513 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5514
Greg Clayton03e0f972010-09-13 03:32:57 +00005515 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5516 switch (type_class)
Greg Clayton7b541032010-07-29 20:06:32 +00005517 {
5518 case clang::Type::ObjCObject:
5519 case clang::Type::ObjCInterface:
Greg Clayton427f2902010-12-14 02:59:59 +00005520 return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
Greg Clayton7b541032010-07-29 20:06:32 +00005521
Greg Clayton7b541032010-07-29 20:06:32 +00005522 default:
Greg Clayton427f2902010-12-14 02:59:59 +00005523 return ast->getPointerType(qual_type).getAsOpaquePtr();
Greg Clayton7b541032010-07-29 20:06:32 +00005524 }
5525 }
Chris Lattner24943d22010-06-08 16:52:24 +00005526 return NULL;
5527}
5528
Greg Clayton462d4142010-09-29 01:12:09 +00005529clang_type_t
Sean Callanan6a925532011-01-13 08:53:35 +00005530ClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
5531 clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005532{
5533 if (clang_type)
Sean Callanan6a925532011-01-13 08:53:35 +00005534 return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005535 return NULL;
5536}
5537
Greg Clayton462d4142010-09-29 01:12:09 +00005538clang_type_t
Sean Callanan6a925532011-01-13 08:53:35 +00005539ClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
5540 clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005541{
5542 if (clang_type)
Sean Callanan6a925532011-01-13 08:53:35 +00005543 return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005544 return NULL;
5545}
5546
Greg Clayton462d4142010-09-29 01:12:09 +00005547clang_type_t
5548ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
Greg Claytonfa970692010-06-12 01:20:30 +00005549{
5550 if (clang_pointee_type && clang_pointee_type)
5551 return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
5552 QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
5553 return NULL;
5554}
5555
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00005556uint32_t
Chris Lattner24943d22010-06-08 16:52:24 +00005557ClangASTContext::GetPointerBitSize ()
5558{
Greg Claytonb01000f2011-01-17 03:46:26 +00005559 ASTContext *ast = getASTContext();
5560 return ast->getTypeSize(ast->VoidPtrTy);
Chris Lattner24943d22010-06-08 16:52:24 +00005561}
5562
5563bool
Greg Clayton3356d4f2012-03-30 00:51:13 +00005564ClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast,
5565 clang_type_t clang_type,
5566 clang_type_t *dynamic_pointee_type,
5567 bool check_cplusplus,
5568 bool check_objc)
Greg Clayton917c0002011-06-29 22:09:02 +00005569{
5570 QualType pointee_qual_type;
5571 if (clang_type)
5572 {
5573 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5574 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5575 bool success = false;
5576 switch (type_class)
5577 {
5578 case clang::Type::Builtin:
Greg Clayton3356d4f2012-03-30 00:51:13 +00005579 if (check_objc && cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
Greg Clayton917c0002011-06-29 22:09:02 +00005580 {
5581 if (dynamic_pointee_type)
5582 *dynamic_pointee_type = clang_type;
5583 return true;
5584 }
5585 break;
5586
5587 case clang::Type::ObjCObjectPointer:
Greg Clayton3356d4f2012-03-30 00:51:13 +00005588 if (check_objc)
5589 {
5590 if (dynamic_pointee_type)
5591 *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5592 return true;
5593 }
5594 break;
Greg Clayton917c0002011-06-29 22:09:02 +00005595
5596 case clang::Type::Pointer:
5597 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
5598 success = true;
5599 break;
5600
5601 case clang::Type::LValueReference:
5602 case clang::Type::RValueReference:
5603 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
5604 success = true;
5605 break;
5606
5607 case clang::Type::Typedef:
Greg Clayton9b90e872012-08-31 18:56:24 +00005608 return ClangASTContext::IsPossibleDynamicType (ast,
5609 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
5610 dynamic_pointee_type,
5611 check_cplusplus,
5612 check_objc);
Sean Callananc6139712011-08-11 23:56:13 +00005613
5614 case clang::Type::Elaborated:
Greg Clayton9b90e872012-08-31 18:56:24 +00005615 return ClangASTContext::IsPossibleDynamicType (ast,
5616 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
5617 dynamic_pointee_type,
5618 check_cplusplus,
5619 check_objc);
Sean Callananc6139712011-08-11 23:56:13 +00005620
Greg Clayton917c0002011-06-29 22:09:02 +00005621 default:
5622 break;
5623 }
5624
5625 if (success)
5626 {
5627 // Check to make sure what we are pointing too is a possible dynamic C++ type
5628 // We currently accept any "void *" (in case we have a class that has been
5629 // watered down to an opaque pointer) and virtual C++ classes.
5630 const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
5631 switch (pointee_type_class)
5632 {
5633 case clang::Type::Builtin:
5634 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
5635 {
5636 case clang::BuiltinType::UnknownAny:
5637 case clang::BuiltinType::Void:
5638 if (dynamic_pointee_type)
5639 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5640 return true;
5641
5642 case clang::BuiltinType::NullPtr:
5643 case clang::BuiltinType::Bool:
5644 case clang::BuiltinType::Char_U:
5645 case clang::BuiltinType::UChar:
5646 case clang::BuiltinType::WChar_U:
5647 case clang::BuiltinType::Char16:
5648 case clang::BuiltinType::Char32:
5649 case clang::BuiltinType::UShort:
5650 case clang::BuiltinType::UInt:
5651 case clang::BuiltinType::ULong:
5652 case clang::BuiltinType::ULongLong:
5653 case clang::BuiltinType::UInt128:
5654 case clang::BuiltinType::Char_S:
5655 case clang::BuiltinType::SChar:
5656 case clang::BuiltinType::WChar_S:
5657 case clang::BuiltinType::Short:
5658 case clang::BuiltinType::Int:
5659 case clang::BuiltinType::Long:
5660 case clang::BuiltinType::LongLong:
5661 case clang::BuiltinType::Int128:
5662 case clang::BuiltinType::Float:
5663 case clang::BuiltinType::Double:
5664 case clang::BuiltinType::LongDouble:
5665 case clang::BuiltinType::Dependent:
5666 case clang::BuiltinType::Overload:
5667 case clang::BuiltinType::ObjCId:
5668 case clang::BuiltinType::ObjCClass:
5669 case clang::BuiltinType::ObjCSel:
5670 case clang::BuiltinType::BoundMember:
Greg Claytonf6a5bd72011-10-22 03:33:13 +00005671 case clang::BuiltinType::Half:
5672 case clang::BuiltinType::ARCUnbridgedCast:
Greg Clayton32e25642011-11-09 19:04:58 +00005673 case clang::BuiltinType::PseudoObject:
Sean Callanan06dc17f2012-09-24 22:25:51 +00005674 case clang::BuiltinType::BuiltinFn:
Greg Clayton917c0002011-06-29 22:09:02 +00005675 break;
5676 }
5677 break;
5678
5679 case clang::Type::Record:
Greg Clayton3356d4f2012-03-30 00:51:13 +00005680 if (check_cplusplus)
Greg Clayton917c0002011-06-29 22:09:02 +00005681 {
5682 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
5683 if (cxx_record_decl)
5684 {
Greg Clayton9b90e872012-08-31 18:56:24 +00005685 bool is_complete = cxx_record_decl->isCompleteDefinition();
5686 if (!is_complete)
Sean Callanan62182012012-09-08 00:49:45 +00005687 is_complete = ClangASTContext::GetCompleteType (ast, pointee_qual_type.getAsOpaquePtr());
Greg Clayton9b90e872012-08-31 18:56:24 +00005688
5689 if (is_complete)
Greg Clayton917c0002011-06-29 22:09:02 +00005690 {
5691 success = cxx_record_decl->isDynamicClass();
5692 }
5693 else
5694 {
Greg Clayton9b90e872012-08-31 18:56:24 +00005695 success = false;
Greg Clayton917c0002011-06-29 22:09:02 +00005696 }
Greg Clayton9b90e872012-08-31 18:56:24 +00005697
Greg Clayton917c0002011-06-29 22:09:02 +00005698 if (success)
5699 {
5700 if (dynamic_pointee_type)
5701 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5702 return true;
5703 }
5704 }
5705 }
5706 break;
5707
5708 case clang::Type::ObjCObject:
5709 case clang::Type::ObjCInterface:
Greg Clayton3356d4f2012-03-30 00:51:13 +00005710 if (check_objc)
5711 {
5712 if (dynamic_pointee_type)
5713 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5714 return true;
5715 }
5716 break;
Greg Clayton917c0002011-06-29 22:09:02 +00005717
5718 default:
5719 break;
5720 }
5721 }
5722 }
5723 if (dynamic_pointee_type)
5724 *dynamic_pointee_type = NULL;
5725 return false;
5726}
5727
5728
5729bool
Greg Clayton82f07462011-05-30 00:49:24 +00005730ClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
5731{
Greg Clayton3356d4f2012-03-30 00:51:13 +00005732 return IsPossibleDynamicType (ast,
5733 clang_type,
5734 dynamic_pointee_type,
5735 true, // Check for dynamic C++ types
5736 false); // Check for dynamic ObjC types
Greg Clayton82f07462011-05-30 00:49:24 +00005737}
5738
Sean Callanan6f3bde72011-10-27 19:41:13 +00005739bool
5740ClangASTContext::IsReferenceType (clang_type_t clang_type, clang_type_t *target_type)
5741{
5742 if (clang_type == NULL)
5743 return false;
5744
5745 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5746 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5747
5748 switch (type_class)
5749 {
5750 case clang::Type::LValueReference:
5751 if (target_type)
5752 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5753 return true;
5754 case clang::Type::RValueReference:
5755 if (target_type)
5756 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5757 return true;
5758 case clang::Type::Typedef:
5759 return ClangASTContext::IsReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5760 case clang::Type::Elaborated:
5761 return ClangASTContext::IsReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5762 default:
5763 break;
5764 }
5765
5766 return false;
5767}
Greg Clayton82f07462011-05-30 00:49:24 +00005768
5769bool
Greg Clayton462d4142010-09-29 01:12:09 +00005770ClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005771{
5772 if (clang_type == NULL)
5773 return false;
5774
5775 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton03e0f972010-09-13 03:32:57 +00005776 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5777 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00005778 {
Sean Callanan04325062010-10-25 00:29:48 +00005779 case clang::Type::Builtin:
5780 switch (cast<clang::BuiltinType>(qual_type)->getKind())
5781 {
5782 default:
5783 break;
5784 case clang::BuiltinType::ObjCId:
5785 case clang::BuiltinType::ObjCClass:
Sean Callanan04325062010-10-25 00:29:48 +00005786 return true;
5787 }
5788 return false;
Greg Clayton1674b122010-07-21 22:12:05 +00005789 case clang::Type::ObjCObjectPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00005790 if (target_type)
5791 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5792 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005793 case clang::Type::BlockPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00005794 if (target_type)
5795 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5796 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005797 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00005798 if (target_type)
5799 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5800 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005801 case clang::Type::MemberPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00005802 if (target_type)
5803 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5804 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005805 case clang::Type::LValueReference:
Chris Lattner24943d22010-06-08 16:52:24 +00005806 if (target_type)
5807 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5808 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005809 case clang::Type::RValueReference:
Chris Lattner24943d22010-06-08 16:52:24 +00005810 if (target_type)
5811 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5812 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005813 case clang::Type::Typedef:
Sean Callanan9e7958e2010-12-13 01:26:27 +00005814 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00005815 case clang::Type::Elaborated:
5816 return ClangASTContext::IsPointerOrReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00005817 default:
5818 break;
5819 }
5820 return false;
5821}
5822
Chris Lattner24943d22010-06-08 16:52:24 +00005823bool
Greg Clayton462d4142010-09-29 01:12:09 +00005824ClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
Chris Lattner24943d22010-06-08 16:52:24 +00005825{
5826 if (!clang_type)
5827 return false;
5828
5829 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5830 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
5831
5832 if (builtin_type)
5833 {
5834 if (builtin_type->isInteger())
Jim Ingham016ef882011-12-22 19:12:40 +00005835 {
Chris Lattner24943d22010-06-08 16:52:24 +00005836 is_signed = builtin_type->isSignedInteger();
Jim Ingham016ef882011-12-22 19:12:40 +00005837 return true;
5838 }
Chris Lattner24943d22010-06-08 16:52:24 +00005839 }
5840
5841 return false;
5842}
5843
5844bool
Greg Clayton19c0d582011-07-08 18:27:39 +00005845ClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t *target_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005846{
Greg Clayton19c0d582011-07-08 18:27:39 +00005847 if (target_type)
5848 *target_type = NULL;
5849
Chris Lattner24943d22010-06-08 16:52:24 +00005850 if (clang_type)
5851 {
5852 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton03e0f972010-09-13 03:32:57 +00005853 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5854 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00005855 {
Sean Callanan04325062010-10-25 00:29:48 +00005856 case clang::Type::Builtin:
5857 switch (cast<clang::BuiltinType>(qual_type)->getKind())
5858 {
5859 default:
5860 break;
5861 case clang::BuiltinType::ObjCId:
5862 case clang::BuiltinType::ObjCClass:
Sean Callanan04325062010-10-25 00:29:48 +00005863 return true;
5864 }
5865 return false;
Greg Clayton1674b122010-07-21 22:12:05 +00005866 case clang::Type::ObjCObjectPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00005867 if (target_type)
5868 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5869 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005870 case clang::Type::BlockPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00005871 if (target_type)
5872 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5873 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005874 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00005875 if (target_type)
5876 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5877 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005878 case clang::Type::MemberPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00005879 if (target_type)
5880 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5881 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00005882 case clang::Type::Typedef:
Greg Clayton19c0d582011-07-08 18:27:39 +00005883 return ClangASTContext::IsPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
Sean Callananc6139712011-08-11 23:56:13 +00005884 case clang::Type::Elaborated:
5885 return ClangASTContext::IsPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), target_type);
Chris Lattner24943d22010-06-08 16:52:24 +00005886 default:
5887 break;
5888 }
5889 }
5890 return false;
5891}
5892
5893bool
Greg Clayton462d4142010-09-29 01:12:09 +00005894ClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
Chris Lattner24943d22010-06-08 16:52:24 +00005895{
5896 if (clang_type)
5897 {
5898 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5899
5900 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
5901 {
5902 clang::BuiltinType::Kind kind = BT->getKind();
5903 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
5904 {
5905 count = 1;
5906 is_complex = false;
5907 return true;
5908 }
5909 }
5910 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
5911 {
5912 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
5913 {
5914 count = 2;
5915 is_complex = true;
5916 return true;
5917 }
5918 }
5919 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
5920 {
5921 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
5922 {
5923 count = VT->getNumElements();
5924 is_complex = false;
5925 return true;
5926 }
5927 }
5928 }
5929 return false;
5930}
5931
Enrico Granata9762e102011-07-06 02:13:41 +00005932bool
5933ClangASTContext::IsScalarType (lldb::clang_type_t clang_type)
5934{
5935 bool is_signed;
5936 if (ClangASTContext::IsIntegerType(clang_type, is_signed))
5937 return true;
5938
5939 uint32_t count;
5940 bool is_complex;
5941 return ClangASTContext::IsFloatingPointType(clang_type, count, is_complex) && !is_complex;
5942}
5943
5944bool
5945ClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type)
5946{
5947 if (!IsPointerType(clang_type))
5948 return false;
5949
5950 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5951 lldb::clang_type_t pointee_type = qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr();
5952 return IsScalarType(pointee_type);
5953}
5954
5955bool
5956ClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type)
5957{
Greg Claytonb9124572012-12-06 02:33:54 +00005958 clang_type = GetAsArrayType(clang_type, NULL, NULL, NULL);
Sean Callananebad95d2012-01-19 23:54:24 +00005959
5960 if (clang_type == 0)
Enrico Granata9762e102011-07-06 02:13:41 +00005961 return false;
5962
5963 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5964 lldb::clang_type_t item_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
5965 return IsScalarType(item_type);
5966}
5967
Greg Claytonbf8e42b2010-10-14 22:52:14 +00005968
5969bool
5970ClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
5971{
5972 if (clang_type)
5973 {
5974 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5975
5976 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5977 if (cxx_record_decl)
5978 {
5979 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
5980 return true;
5981 }
5982 }
5983 class_name.clear();
5984 return false;
5985}
5986
5987
Greg Clayton1d8173f2010-09-24 05:15:53 +00005988bool
Greg Clayton462d4142010-09-29 01:12:09 +00005989ClangASTContext::IsCXXClassType (clang_type_t clang_type)
Greg Clayton1d8173f2010-09-24 05:15:53 +00005990{
5991 if (clang_type)
5992 {
5993 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5994 if (qual_type->getAsCXXRecordDecl() != NULL)
5995 return true;
5996 }
5997 return false;
5998}
5999
Greg Clayton9f54ab72011-10-13 23:13:20 +00006000bool
6001ClangASTContext::IsBeingDefined (lldb::clang_type_t clang_type)
6002{
6003 if (clang_type)
6004 {
6005 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6006 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type);
6007 if (tag_type)
6008 return tag_type->isBeingDefined();
6009 }
6010 return false;
6011}
6012
Greg Clayton1d8173f2010-09-24 05:15:53 +00006013bool
Greg Clayton462d4142010-09-29 01:12:09 +00006014ClangASTContext::IsObjCClassType (clang_type_t clang_type)
Greg Clayton1d8173f2010-09-24 05:15:53 +00006015{
6016 if (clang_type)
6017 {
6018 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6019 if (qual_type->isObjCObjectOrInterfaceType())
6020 return true;
6021 }
6022 return false;
6023}
6024
Sean Callanan931acec2012-02-22 23:57:45 +00006025bool
6026ClangASTContext::IsObjCObjectPointerType (lldb::clang_type_t clang_type, clang_type_t *class_type)
6027{
6028 if (clang_type)
6029 {
6030 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6031 if (qual_type->isObjCObjectPointerType())
6032 {
6033 if (class_type)
6034 {
6035 *class_type = NULL;
6036
6037 if (!qual_type->isObjCClassType() &&
6038 !qual_type->isObjCIdType())
6039 {
6040 const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type);
Sean Callananfe1e5ec2012-03-10 01:59:11 +00006041 if (!obj_pointer_type)
6042 *class_type = NULL;
Sean Callanan9a357a42012-03-10 02:00:32 +00006043 else
6044 *class_type = QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr();
Sean Callanan931acec2012-02-22 23:57:45 +00006045 }
6046 }
6047 return true;
6048 }
6049 }
6050 return false;
6051}
6052
6053bool
6054ClangASTContext::GetObjCClassName (lldb::clang_type_t clang_type,
6055 std::string &class_name)
6056{
6057 if (!clang_type)
6058 return false;
6059
6060 const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(QualType::getFromOpaquePtr(clang_type));
6061 if (!object_type)
6062 return false;
6063
6064 const ObjCInterfaceDecl *interface = object_type->getInterface();
6065 if (!interface)
6066 return false;
6067
6068 class_name = interface->getNameAsString();
6069 return true;
6070}
Greg Clayton1d8173f2010-09-24 05:15:53 +00006071
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006072bool
6073ClangASTContext::IsCharType (clang_type_t clang_type)
6074{
6075 if (clang_type)
6076 return QualType::getFromOpaquePtr(clang_type)->isCharType();
6077 return false;
6078}
Chris Lattner24943d22010-06-08 16:52:24 +00006079
6080bool
Greg Clayton462d4142010-09-29 01:12:09 +00006081ClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
Chris Lattner24943d22010-06-08 16:52:24 +00006082{
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006083 clang_type_t pointee_or_element_clang_type = NULL;
6084 Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
6085
6086 if (pointee_or_element_clang_type == NULL)
6087 return false;
6088
6089 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
Chris Lattner24943d22010-06-08 16:52:24 +00006090 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006091 QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
6092
6093 if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
Chris Lattner24943d22010-06-08 16:52:24 +00006094 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006095 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6096 if (type_flags.Test (eTypeIsArray))
Chris Lattner24943d22010-06-08 16:52:24 +00006097 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006098 // We know the size of the array and it could be a C string
6099 // since it is an array of characters
6100 length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
6101 return true;
Chris Lattner24943d22010-06-08 16:52:24 +00006102 }
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006103 else
Chris Lattner24943d22010-06-08 16:52:24 +00006104 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006105 length = 0;
6106 return true;
Chris Lattner24943d22010-06-08 16:52:24 +00006107 }
Chris Lattner24943d22010-06-08 16:52:24 +00006108
Chris Lattner24943d22010-06-08 16:52:24 +00006109 }
6110 }
6111 return false;
6112}
6113
6114bool
Greg Clayton462d4142010-09-29 01:12:09 +00006115ClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
Greg Clayton03e0f972010-09-13 03:32:57 +00006116{
6117 if (clang_type)
6118 {
6119 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6120
6121 if (qual_type->isFunctionPointerType())
6122 return true;
6123
6124 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6125 switch (type_class)
6126 {
Sean Callanan279584c2011-03-15 00:17:19 +00006127 default:
6128 break;
Greg Clayton03e0f972010-09-13 03:32:57 +00006129 case clang::Type::Typedef:
Sean Callanan9e7958e2010-12-13 01:26:27 +00006130 return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00006131 case clang::Type::Elaborated:
6132 return ClangASTContext::IsFunctionPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton03e0f972010-09-13 03:32:57 +00006133
6134 case clang::Type::LValueReference:
6135 case clang::Type::RValueReference:
6136 {
Sean Callanand5b3c352011-01-27 04:42:51 +00006137 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton03e0f972010-09-13 03:32:57 +00006138 if (reference_type)
6139 return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
6140 }
6141 break;
6142 }
6143 }
6144 return false;
6145}
6146
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006147size_t
6148ClangASTContext::GetArraySize (clang_type_t clang_type)
6149{
6150 if (clang_type)
6151 {
Greg Clayton59e093d2011-07-09 17:12:27 +00006152 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
6153 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6154 switch (type_class)
6155 {
6156 case clang::Type::ConstantArray:
6157 {
6158 const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
6159 if (array)
6160 return array->getSize().getLimitedValue();
6161 }
6162 break;
6163
6164 case clang::Type::Typedef:
6165 return ClangASTContext::GetArraySize(cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00006166
6167 case clang::Type::Elaborated:
6168 return ClangASTContext::GetArraySize(cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Enrico Granata1a102082011-07-12 00:18:11 +00006169
6170 default:
6171 break;
Greg Clayton59e093d2011-07-09 17:12:27 +00006172 }
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006173 }
6174 return 0;
6175}
Greg Clayton03e0f972010-09-13 03:32:57 +00006176
Sean Callananebad95d2012-01-19 23:54:24 +00006177clang_type_t
Greg Claytonb9124572012-12-06 02:33:54 +00006178ClangASTContext::GetAsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size, bool *is_incomplete)
Chris Lattner24943d22010-06-08 16:52:24 +00006179{
Greg Claytonb9124572012-12-06 02:33:54 +00006180 if (is_incomplete)
6181 *is_incomplete = false;
Chris Lattner24943d22010-06-08 16:52:24 +00006182 if (!clang_type)
Sean Callananebad95d2012-01-19 23:54:24 +00006183 return 0;
Chris Lattner24943d22010-06-08 16:52:24 +00006184
6185 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6186
Greg Clayton03e0f972010-09-13 03:32:57 +00006187 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6188 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00006189 {
Sean Callanan279584c2011-03-15 00:17:19 +00006190 default:
6191 break;
Greg Clayton59e093d2011-07-09 17:12:27 +00006192
Greg Clayton1674b122010-07-21 22:12:05 +00006193 case clang::Type::ConstantArray:
Chris Lattner24943d22010-06-08 16:52:24 +00006194 if (member_type)
6195 *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6196 if (size)
Greg Clayton381f9682011-04-01 18:14:08 +00006197 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
Sean Callananebad95d2012-01-19 23:54:24 +00006198 return clang_type;
Greg Clayton59e093d2011-07-09 17:12:27 +00006199
Greg Clayton1674b122010-07-21 22:12:05 +00006200 case clang::Type::IncompleteArray:
Chris Lattner24943d22010-06-08 16:52:24 +00006201 if (member_type)
6202 *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6203 if (size)
6204 *size = 0;
Greg Claytonb9124572012-12-06 02:33:54 +00006205 if (is_incomplete)
6206 *is_incomplete = true;
Sean Callananebad95d2012-01-19 23:54:24 +00006207 return clang_type;
Greg Clayton59e093d2011-07-09 17:12:27 +00006208
Greg Clayton1674b122010-07-21 22:12:05 +00006209 case clang::Type::VariableArray:
Chris Lattner24943d22010-06-08 16:52:24 +00006210 if (member_type)
6211 *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6212 if (size)
6213 *size = 0;
Sean Callananebad95d2012-01-19 23:54:24 +00006214 return clang_type;
Greg Clayton59e093d2011-07-09 17:12:27 +00006215
Greg Clayton1674b122010-07-21 22:12:05 +00006216 case clang::Type::DependentSizedArray:
Chris Lattner24943d22010-06-08 16:52:24 +00006217 if (member_type)
6218 *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6219 if (size)
6220 *size = 0;
Sean Callananebad95d2012-01-19 23:54:24 +00006221 return clang_type;
Greg Clayton59e093d2011-07-09 17:12:27 +00006222
6223 case clang::Type::Typedef:
Sean Callananebad95d2012-01-19 23:54:24 +00006224 return ClangASTContext::GetAsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
6225 member_type,
Greg Claytonb9124572012-12-06 02:33:54 +00006226 size,
6227 is_incomplete);
Sean Callananc6139712011-08-11 23:56:13 +00006228
6229 case clang::Type::Elaborated:
Sean Callananebad95d2012-01-19 23:54:24 +00006230 return ClangASTContext::GetAsArrayType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
6231 member_type,
Greg Claytonb9124572012-12-06 02:33:54 +00006232 size,
6233 is_incomplete);
Chris Lattner24943d22010-06-08 16:52:24 +00006234 }
Sean Callananebad95d2012-01-19 23:54:24 +00006235 return 0;
Chris Lattner24943d22010-06-08 16:52:24 +00006236}
6237
6238
6239#pragma mark Typedefs
6240
Greg Clayton462d4142010-09-29 01:12:09 +00006241clang_type_t
6242ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
Chris Lattner24943d22010-06-08 16:52:24 +00006243{
6244 if (clang_type)
6245 {
6246 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Claytonb01000f2011-01-17 03:46:26 +00006247 ASTContext *ast = getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00006248 IdentifierTable *identifier_table = getIdentifierTable();
Greg Claytonb01000f2011-01-17 03:46:26 +00006249 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +00006250 assert (identifier_table != NULL);
6251 if (decl_ctx == NULL)
Greg Claytonb01000f2011-01-17 03:46:26 +00006252 decl_ctx = ast->getTranslationUnitDecl();
6253 TypedefDecl *decl = TypedefDecl::Create (*ast,
6254 decl_ctx,
6255 SourceLocation(),
Sean Callanan279584c2011-03-15 00:17:19 +00006256 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00006257 name ? &identifier_table->get(name) : NULL, // Identifier
6258 ast->CreateTypeSourceInfo(qual_type));
Sean Callanan864bfdb2011-01-18 01:03:44 +00006259
Greg Clayton5f24c502011-10-14 22:47:18 +00006260 //decl_ctx->addDecl (decl);
6261
Sean Callanan864bfdb2011-01-18 01:03:44 +00006262 decl->setAccess(AS_public); // TODO respect proper access specifier
Chris Lattner24943d22010-06-08 16:52:24 +00006263
6264 // Get a uniqued QualType for the typedef decl type
Greg Claytonb01000f2011-01-17 03:46:26 +00006265 return ast->getTypedefType (decl).getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00006266 }
6267 return NULL;
6268}
6269
Chris Lattner24943d22010-06-08 16:52:24 +00006270// Disable this for now since I can't seem to get a nicely formatted float
6271// out of the APFloat class without just getting the float, double or quad
6272// and then using a formatted print on it which defeats the purpose. We ideally
6273// would like to get perfect string values for any kind of float semantics
6274// so we can support remote targets. The code below also requires a patch to
6275// llvm::APInt.
6276//bool
Greg Claytonb01000f2011-01-17 03:46:26 +00006277//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 Lattner24943d22010-06-08 16:52:24 +00006278//{
6279// uint32_t count = 0;
6280// bool is_complex = false;
6281// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
6282// {
6283// unsigned num_bytes_per_float = byte_size / count;
6284// unsigned num_bits_per_float = num_bytes_per_float * 8;
6285//
6286// float_str.clear();
6287// uint32_t i;
6288// for (i=0; i<count; i++)
6289// {
6290// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
6291// bool is_ieee = false;
6292// APFloat ap_float(ap_int, is_ieee);
6293// char s[1024];
6294// unsigned int hex_digits = 0;
6295// bool upper_case = false;
6296//
6297// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
6298// {
6299// if (i > 0)
6300// float_str.append(", ");
6301// float_str.append(s);
6302// if (i == 1 && is_complex)
6303// float_str.append(1, 'i');
6304// }
6305// }
6306// return !float_str.empty();
6307// }
6308// return false;
6309//}
6310
6311size_t
Greg Claytonb01000f2011-01-17 03:46:26 +00006312ClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
Chris Lattner24943d22010-06-08 16:52:24 +00006313{
6314 if (clang_type)
6315 {
6316 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6317 uint32_t count = 0;
6318 bool is_complex = false;
6319 if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
6320 {
6321 // TODO: handle complex and vector types
6322 if (count != 1)
6323 return false;
6324
6325 StringRef s_sref(s);
Greg Claytonb01000f2011-01-17 03:46:26 +00006326 APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
Chris Lattner24943d22010-06-08 16:52:24 +00006327
Greg Claytonb01000f2011-01-17 03:46:26 +00006328 const uint64_t bit_size = ast->getTypeSize (qual_type);
Chris Lattner24943d22010-06-08 16:52:24 +00006329 const uint64_t byte_size = bit_size / 8;
6330 if (dst_size >= byte_size)
6331 {
6332 if (bit_size == sizeof(float)*8)
6333 {
6334 float float32 = ap_float.convertToFloat();
6335 ::memcpy (dst, &float32, byte_size);
6336 return byte_size;
6337 }
6338 else if (bit_size >= 64)
6339 {
6340 llvm::APInt ap_int(ap_float.bitcastToAPInt());
6341 ::memcpy (dst, ap_int.getRawData(), byte_size);
6342 return byte_size;
6343 }
6344 }
6345 }
6346 }
6347 return 0;
6348}
Sean Callanana751f7b2010-09-17 02:24:29 +00006349
6350unsigned
Greg Clayton462d4142010-09-29 01:12:09 +00006351ClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
Sean Callanana751f7b2010-09-17 02:24:29 +00006352{
6353 assert (clang_type);
6354
6355 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6356
6357 return qual_type.getQualifiers().getCVRQualifiers();
6358}
Greg Claytonb01000f2011-01-17 03:46:26 +00006359
6360bool
6361ClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
6362{
6363 if (clang_type == NULL)
6364 return false;
6365
Greg Clayton7a183dc2011-01-20 04:18:48 +00006366 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
Greg Claytonb01000f2011-01-17 03:46:26 +00006367}
6368
6369
6370bool
6371ClangASTContext::GetCompleteType (clang_type_t clang_type)
6372{
6373 return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
6374}
6375
Greg Claytone6d72ca2011-06-25 00:44:06 +00006376bool
Enrico Granatad44c9d32012-03-24 01:11:14 +00006377ClangASTContext::IsCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
6378{
6379 if (clang_type == NULL)
6380 return false;
6381
6382 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type), false); // just check but don't let it actually complete
6383}
6384
6385
6386bool
6387ClangASTContext::IsCompleteType (clang_type_t clang_type)
6388{
6389 return ClangASTContext::IsCompleteType (getASTContext(), clang_type);
6390}
6391
6392bool
Greg Claytone6d72ca2011-06-25 00:44:06 +00006393ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
6394 clang::Decl *decl)
6395{
6396 if (!decl)
6397 return false;
6398
6399 ExternalASTSource *ast_source = ast->getExternalSource();
6400
6401 if (!ast_source)
6402 return false;
6403
6404 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
6405 {
Greg Clayton3356d4f2012-03-30 00:51:13 +00006406 if (tag_decl->isCompleteDefinition())
Greg Claytone6d72ca2011-06-25 00:44:06 +00006407 return true;
6408
6409 if (!tag_decl->hasExternalLexicalStorage())
6410 return false;
6411
6412 ast_source->CompleteType(tag_decl);
6413
6414 return !tag_decl->getTypeForDecl()->isIncompleteType();
6415 }
6416 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
6417 {
Sean Callanan8f2e3922012-02-04 08:49:35 +00006418 if (objc_interface_decl->getDefinition())
Greg Claytone6d72ca2011-06-25 00:44:06 +00006419 return true;
6420
6421 if (!objc_interface_decl->hasExternalLexicalStorage())
6422 return false;
6423
6424 ast_source->CompleteType(objc_interface_decl);
6425
Sean Callanan8f2e3922012-02-04 08:49:35 +00006426 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytone6d72ca2011-06-25 00:44:06 +00006427 }
6428 else
6429 {
6430 return false;
6431 }
6432}
6433
Sean Callananfafffe02012-04-13 00:10:03 +00006434void
Jim Inghama32c5a52012-10-27 02:54:13 +00006435ClangASTContext::SetMetadataAsUserID (uintptr_t object,
6436 user_id_t user_id)
6437{
6438 ClangASTMetadata meta_data;
6439 meta_data.SetUserID (user_id);
6440 SetMetadata (object, meta_data);
6441}
6442
6443void
Sean Callananfafffe02012-04-13 00:10:03 +00006444ClangASTContext::SetMetadata (clang::ASTContext *ast,
6445 uintptr_t object,
Jim Inghama32c5a52012-10-27 02:54:13 +00006446 ClangASTMetadata &metadata)
Sean Callananfafffe02012-04-13 00:10:03 +00006447{
6448 ClangExternalASTSourceCommon *external_source =
6449 static_cast<ClangExternalASTSourceCommon*>(ast->getExternalSource());
6450
6451 if (external_source)
6452 external_source->SetMetadata(object, metadata);
6453}
6454
Jim Inghama32c5a52012-10-27 02:54:13 +00006455ClangASTMetadata *
Sean Callananfafffe02012-04-13 00:10:03 +00006456ClangASTContext::GetMetadata (clang::ASTContext *ast,
6457 uintptr_t object)
6458{
6459 ClangExternalASTSourceCommon *external_source =
6460 static_cast<ClangExternalASTSourceCommon*>(ast->getExternalSource());
6461
6462 if (external_source && external_source->HasMetadata(object))
6463 return external_source->GetMetadata(object);
6464 else
Jim Inghama32c5a52012-10-27 02:54:13 +00006465 return NULL;
Sean Callananfafffe02012-04-13 00:10:03 +00006466}
6467
Greg Claytona83f8772011-08-04 21:02:57 +00006468clang::DeclContext *
6469ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
6470{
Sean Callanancbfc0ea2011-08-19 06:19:25 +00006471 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Claytona83f8772011-08-04 21:02:57 +00006472}
6473
6474clang::DeclContext *
6475ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
6476{
Sean Callanancbfc0ea2011-08-19 06:19:25 +00006477 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Claytona83f8772011-08-04 21:02:57 +00006478}
6479
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00006480
6481bool
6482ClangASTContext::GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx,
6483 lldb::LanguageType &language,
6484 bool &is_instance_method,
6485 ConstString &language_object_name)
6486{
6487 language_object_name.Clear();
6488 language = eLanguageTypeUnknown;
6489 is_instance_method = false;
6490
6491 if (decl_ctx)
6492 {
6493 if (clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
6494 {
6495 if (method_decl->isStatic())
6496 {
6497 is_instance_method = false;
6498 }
6499 else
6500 {
6501 language_object_name.SetCString("this");
6502 is_instance_method = true;
6503 }
6504 language = eLanguageTypeC_plus_plus;
6505 return true;
6506 }
6507 else if (clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
6508 {
6509 // Both static and instance methods have a "self" object in objective C
6510 language_object_name.SetCString("self");
6511 if (method_decl->isInstanceMethod())
6512 {
6513 is_instance_method = true;
6514 }
6515 else
6516 {
6517 is_instance_method = false;
6518 }
6519 language = eLanguageTypeObjC;
6520 return true;
6521 }
Jim Inghama32c5a52012-10-27 02:54:13 +00006522 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
6523 {
6524 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), (uintptr_t) function_decl);
6525 if (metadata && metadata->HasObjectPtr())
6526 {
6527 language_object_name.SetCString (metadata->GetObjectPtrName());
6528 language = eLanguageTypeObjC;
6529 is_instance_method = true;
6530 }
6531 return true;
6532 }
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00006533 }
6534 return false;
6535}
6536