blob: b2e98c26a8d6d4a721b95794bcc4620ff84c6965 [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:
Sean Callanan756bed42013-04-30 00:20:10 +000088 case clang::Type::IncompleteArray:
89 case clang::Type::VariableArray:
Sean Callanan8f2e3922012-02-04 08:49:35 +000090 {
91 const clang::ArrayType *array_type = dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
92
93 if (array_type)
Enrico Granatad44c9d32012-03-24 01:11:14 +000094 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
Sean Callanan8f2e3922012-02-04 08:49:35 +000095 }
96 break;
97
Greg Claytonb01000f2011-01-17 03:46:26 +000098 case clang::Type::Record:
99 case clang::Type::Enum:
100 {
Sean Callanand5b3c352011-01-27 04:42:51 +0000101 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
Greg Claytonb01000f2011-01-17 03:46:26 +0000102 if (tag_type)
103 {
104 clang::TagDecl *tag_decl = tag_type->getDecl();
105 if (tag_decl)
106 {
Greg Clayton3356d4f2012-03-30 00:51:13 +0000107 if (tag_decl->isCompleteDefinition())
Greg Claytonb01000f2011-01-17 03:46:26 +0000108 return true;
Enrico Granatad44c9d32012-03-24 01:11:14 +0000109
110 if (!allow_completion)
111 return false;
Greg Claytonb01000f2011-01-17 03:46:26 +0000112
113 if (tag_decl->hasExternalLexicalStorage())
114 {
Greg Clayton82f07462011-05-30 00:49:24 +0000115 if (ast)
Greg Claytonb01000f2011-01-17 03:46:26 +0000116 {
Greg Clayton82f07462011-05-30 00:49:24 +0000117 ExternalASTSource *external_ast_source = ast->getExternalSource();
118 if (external_ast_source)
119 {
120 external_ast_source->CompleteType(tag_decl);
121 return !tag_type->isIncompleteType();
122 }
Greg Claytonb01000f2011-01-17 03:46:26 +0000123 }
124 }
125 return false;
126 }
127 }
128
129 }
130 break;
131
132 case clang::Type::ObjCObject:
133 case clang::Type::ObjCInterface:
134 {
Sean Callanand5b3c352011-01-27 04:42:51 +0000135 const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
Greg Claytonb01000f2011-01-17 03:46:26 +0000136 if (objc_class_type)
137 {
138 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
139 // We currently can't complete objective C types through the newly added ASTContext
140 // because it only supports TagDecl objects right now...
Enrico Granata90d207e2011-07-15 23:30:15 +0000141 if (class_interface_decl)
Greg Claytonb01000f2011-01-17 03:46:26 +0000142 {
Sean Callanan8f2e3922012-02-04 08:49:35 +0000143 if (class_interface_decl->getDefinition())
144 return true;
145
Enrico Granatad44c9d32012-03-24 01:11:14 +0000146 if (!allow_completion)
147 return false;
Greg Claytonc17d2ed2012-03-30 23:48:28 +0000148
Sean Callanan8f2e3922012-02-04 08:49:35 +0000149 if (class_interface_decl->hasExternalLexicalStorage())
Greg Claytonb01000f2011-01-17 03:46:26 +0000150 {
Enrico Granata886bc3e2011-07-02 00:25:22 +0000151 if (ast)
Greg Clayton82f07462011-05-30 00:49:24 +0000152 {
Enrico Granata886bc3e2011-07-02 00:25:22 +0000153 ExternalASTSource *external_ast_source = ast->getExternalSource();
154 if (external_ast_source)
155 {
156 external_ast_source->CompleteType (class_interface_decl);
Sean Callanan8f2e3922012-02-04 08:49:35 +0000157 return !objc_class_type->isIncompleteType();
Enrico Granata886bc3e2011-07-02 00:25:22 +0000158 }
Greg Clayton82f07462011-05-30 00:49:24 +0000159 }
Greg Claytonb01000f2011-01-17 03:46:26 +0000160 }
Enrico Granata886bc3e2011-07-02 00:25:22 +0000161 return false;
Sean Callanan8f2e3922012-02-04 08:49:35 +0000162 }
Greg Claytonb01000f2011-01-17 03:46:26 +0000163 }
164 }
165 break;
166
167 case clang::Type::Typedef:
Enrico Granatad44c9d32012-03-24 01:11:14 +0000168 return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
Sean Callananc6139712011-08-11 23:56:13 +0000169
170 case clang::Type::Elaborated:
Enrico Granatad44c9d32012-03-24 01:11:14 +0000171 return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType(), allow_completion);
Greg Claytonb01000f2011-01-17 03:46:26 +0000172
173 default:
174 break;
175 }
176
177 return true;
178}
179
Greg Clayton84f80752010-07-22 18:30:50 +0000180static AccessSpecifier
Greg Clayton585660c2010-08-05 01:57:25 +0000181ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton84f80752010-07-22 18:30:50 +0000182{
183 switch (access)
184 {
Greg Clayton585660c2010-08-05 01:57:25 +0000185 default: break;
186 case eAccessNone: return AS_none;
187 case eAccessPublic: return AS_public;
188 case eAccessPrivate: return AS_private;
189 case eAccessProtected: return AS_protected;
Greg Clayton84f80752010-07-22 18:30:50 +0000190 }
191 return AS_none;
192}
193
194static ObjCIvarDecl::AccessControl
Greg Clayton585660c2010-08-05 01:57:25 +0000195ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
Greg Clayton84f80752010-07-22 18:30:50 +0000196{
197 switch (access)
198 {
Greg Clayton585660c2010-08-05 01:57:25 +0000199 case eAccessNone: return ObjCIvarDecl::None;
200 case eAccessPublic: return ObjCIvarDecl::Public;
201 case eAccessPrivate: return ObjCIvarDecl::Private;
202 case eAccessProtected: return ObjCIvarDecl::Protected;
203 case eAccessPackage: return ObjCIvarDecl::Package;
Greg Clayton84f80752010-07-22 18:30:50 +0000204 }
205 return ObjCIvarDecl::None;
206}
207
208
Chris Lattner24943d22010-06-08 16:52:24 +0000209static void
210ParseLangArgs
211(
212 LangOptions &Opts,
Greg Claytone41c4b22010-06-13 17:34:29 +0000213 InputKind IK
Chris Lattner24943d22010-06-08 16:52:24 +0000214)
215{
216 // FIXME: Cleanup per-file based stuff.
217
218 // Set some properties which depend soley on the input kind; it would be nice
219 // to move these to the language standard, and have the driver resolve the
220 // input kind + language standard.
Greg Claytone41c4b22010-06-13 17:34:29 +0000221 if (IK == IK_Asm) {
Chris Lattner24943d22010-06-08 16:52:24 +0000222 Opts.AsmPreprocessor = 1;
Greg Claytone41c4b22010-06-13 17:34:29 +0000223 } else if (IK == IK_ObjC ||
224 IK == IK_ObjCXX ||
225 IK == IK_PreprocessedObjC ||
226 IK == IK_PreprocessedObjCXX) {
Chris Lattner24943d22010-06-08 16:52:24 +0000227 Opts.ObjC1 = Opts.ObjC2 = 1;
228 }
229
230 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
231
232 if (LangStd == LangStandard::lang_unspecified) {
233 // Based on the base language, pick one.
234 switch (IK) {
Greg Claytone41c4b22010-06-13 17:34:29 +0000235 case IK_None:
236 case IK_AST:
Sean Callanan279584c2011-03-15 00:17:19 +0000237 case IK_LLVM_IR:
Greg Claytonb01000f2011-01-17 03:46:26 +0000238 assert (!"Invalid input kind!");
Greg Claytone41c4b22010-06-13 17:34:29 +0000239 case IK_OpenCL:
Chris Lattner24943d22010-06-08 16:52:24 +0000240 LangStd = LangStandard::lang_opencl;
241 break;
Sean Callanan279584c2011-03-15 00:17:19 +0000242 case IK_CUDA:
243 LangStd = LangStandard::lang_cuda;
244 break;
Greg Claytone41c4b22010-06-13 17:34:29 +0000245 case IK_Asm:
246 case IK_C:
247 case IK_PreprocessedC:
248 case IK_ObjC:
249 case IK_PreprocessedObjC:
Chris Lattner24943d22010-06-08 16:52:24 +0000250 LangStd = LangStandard::lang_gnu99;
251 break;
Greg Claytone41c4b22010-06-13 17:34:29 +0000252 case IK_CXX:
253 case IK_PreprocessedCXX:
254 case IK_ObjCXX:
255 case IK_PreprocessedObjCXX:
Chris Lattner24943d22010-06-08 16:52:24 +0000256 LangStd = LangStandard::lang_gnucxx98;
257 break;
258 }
259 }
260
261 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
Filipe Cabecinhas9bb15b62012-11-12 21:26:32 +0000262 Opts.LineComment = Std.hasLineComments();
Chris Lattner24943d22010-06-08 16:52:24 +0000263 Opts.C99 = Std.isC99();
264 Opts.CPlusPlus = Std.isCPlusPlus();
Chandler Carruthc6fe5812013-01-02 12:55:00 +0000265 Opts.CPlusPlus11 = Std.isCPlusPlus11();
Chris Lattner24943d22010-06-08 16:52:24 +0000266 Opts.Digraphs = Std.hasDigraphs();
267 Opts.GNUMode = Std.isGNUMode();
268 Opts.GNUInline = !Std.isC99();
269 Opts.HexFloats = Std.hasHexFloats();
270 Opts.ImplicitInt = Std.hasImplicitInt();
Enrico Granata63d67ed2013-01-10 02:37:22 +0000271
272 Opts.WChar = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000273
274 // OpenCL has some additional defaults.
275 if (LangStd == LangStandard::lang_opencl) {
276 Opts.OpenCL = 1;
277 Opts.AltiVec = 1;
278 Opts.CXXOperatorNames = 1;
279 Opts.LaxVectorConversions = 1;
280 }
281
282 // OpenCL and C++ both have bool, true, false keywords.
283 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
284
285// if (Opts.CPlusPlus)
286// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
287//
288// if (Args.hasArg(OPT_fobjc_gc_only))
289// Opts.setGCMode(LangOptions::GCOnly);
290// else if (Args.hasArg(OPT_fobjc_gc))
291// Opts.setGCMode(LangOptions::HybridGC);
292//
293// if (Args.hasArg(OPT_print_ivar_layout))
294// Opts.ObjCGCBitmapPrint = 1;
295//
296// if (Args.hasArg(OPT_faltivec))
297// Opts.AltiVec = 1;
298//
299// if (Args.hasArg(OPT_pthread))
300// Opts.POSIXThreads = 1;
301//
302// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
303// "default");
304// if (Vis == "default")
Sean Callanan874378d2013-02-19 19:16:37 +0000305 Opts.setValueVisibilityMode(DefaultVisibility);
Chris Lattner24943d22010-06-08 16:52:24 +0000306// else if (Vis == "hidden")
307// Opts.setVisibilityMode(LangOptions::Hidden);
308// else if (Vis == "protected")
309// Opts.setVisibilityMode(LangOptions::Protected);
310// else
311// Diags.Report(diag::err_drv_invalid_value)
312// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
313
314// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
315
316 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
317 // is specified, or -std is set to a conforming mode.
318 Opts.Trigraphs = !Opts.GNUMode;
319// if (Args.hasArg(OPT_trigraphs))
320// Opts.Trigraphs = 1;
321//
322// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
323// OPT_fno_dollars_in_identifiers,
324// !Opts.AsmPreprocessor);
325// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
326// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
327// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
328// if (Args.hasArg(OPT_fno_lax_vector_conversions))
329// Opts.LaxVectorConversions = 0;
330// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
331// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
332// Opts.Blocks = Args.hasArg(OPT_fblocks);
333// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
334// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
335// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
336// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
337// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
338// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
339// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
340// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
341// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
342// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
343// Diags);
344// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
345// Opts.ObjCConstantStringClass = getLastArgValue(Args,
346// OPT_fconstant_string_class);
347// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
348// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
349// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
350// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
351// Opts.Static = Args.hasArg(OPT_static_define);
352 Opts.OptimizeSize = 0;
353
354 // FIXME: Eliminate this dependency.
355// unsigned Opt =
356// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
357// Opts.Optimize = Opt != 0;
358 unsigned Opt = 0;
359
360 // This is the __NO_INLINE__ define, which just depends on things like the
361 // optimization level and -fno-inline, not actually whether the backend has
362 // inlining enabled.
363 //
364 // FIXME: This is affected by other options (-fno-inline).
Sean Callanan06dc17f2012-09-24 22:25:51 +0000365 Opts.NoInlineDefine = !Opt;
Chris Lattner24943d22010-06-08 16:52:24 +0000366
367// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
368// switch (SSP) {
369// default:
370// Diags.Report(diag::err_drv_invalid_value)
371// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
372// break;
373// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
374// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
375// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
376// }
377}
378
Chris Lattner24943d22010-06-08 16:52:24 +0000379
Greg Claytonb01000f2011-01-17 03:46:26 +0000380ClangASTContext::ClangASTContext (const char *target_triple) :
Chris Lattner24943d22010-06-08 16:52:24 +0000381 m_target_triple(),
Greg Claytonb01000f2011-01-17 03:46:26 +0000382 m_ast_ap(),
Chris Lattner24943d22010-06-08 16:52:24 +0000383 m_language_options_ap(),
384 m_source_manager_ap(),
Sean Callananc1535182011-10-07 23:18:13 +0000385 m_diagnostics_engine_ap(),
Sean Callanan6a97d422012-10-17 22:11:14 +0000386 m_target_options_rp(),
Chris Lattner24943d22010-06-08 16:52:24 +0000387 m_target_info_ap(),
388 m_identifier_table_ap(),
389 m_selector_table_ap(),
Greg Claytonb01000f2011-01-17 03:46:26 +0000390 m_builtins_ap(),
391 m_callback_tag_decl (NULL),
392 m_callback_objc_decl (NULL),
393 m_callback_baton (NULL)
394
Chris Lattner24943d22010-06-08 16:52:24 +0000395{
396 if (target_triple && target_triple[0])
Greg Claytondcc59f02011-07-30 01:26:02 +0000397 SetTargetTriple (target_triple);
Chris Lattner24943d22010-06-08 16:52:24 +0000398}
399
400//----------------------------------------------------------------------
401// Destructor
402//----------------------------------------------------------------------
403ClangASTContext::~ClangASTContext()
404{
405 m_builtins_ap.reset();
406 m_selector_table_ap.reset();
407 m_identifier_table_ap.reset();
408 m_target_info_ap.reset();
Sean Callanan6a97d422012-10-17 22:11:14 +0000409 m_target_options_rp.reset();
Sean Callananc1535182011-10-07 23:18:13 +0000410 m_diagnostics_engine_ap.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000411 m_source_manager_ap.reset();
412 m_language_options_ap.reset();
Greg Claytonb01000f2011-01-17 03:46:26 +0000413 m_ast_ap.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000414}
415
416
417void
418ClangASTContext::Clear()
419{
Greg Claytonb01000f2011-01-17 03:46:26 +0000420 m_ast_ap.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000421 m_language_options_ap.reset();
422 m_source_manager_ap.reset();
Sean Callananc1535182011-10-07 23:18:13 +0000423 m_diagnostics_engine_ap.reset();
Sean Callanan6a97d422012-10-17 22:11:14 +0000424 m_target_options_rp.reset();
Chris Lattner24943d22010-06-08 16:52:24 +0000425 m_target_info_ap.reset();
426 m_identifier_table_ap.reset();
427 m_selector_table_ap.reset();
428 m_builtins_ap.reset();
429}
430
431const char *
432ClangASTContext::GetTargetTriple ()
433{
434 return m_target_triple.c_str();
435}
436
437void
438ClangASTContext::SetTargetTriple (const char *target_triple)
439{
440 Clear();
441 m_target_triple.assign(target_triple);
442}
443
Greg Clayton395fc332011-02-15 21:59:32 +0000444void
445ClangASTContext::SetArchitecture (const ArchSpec &arch)
446{
Greg Claytondcc59f02011-07-30 01:26:02 +0000447 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton395fc332011-02-15 21:59:32 +0000448}
449
Greg Claytonb01000f2011-01-17 03:46:26 +0000450bool
451ClangASTContext::HasExternalSource ()
452{
453 ASTContext *ast = getASTContext();
454 if (ast)
455 return ast->getExternalSource () != NULL;
456 return false;
457}
458
459void
460ClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
461{
462 ASTContext *ast = getASTContext();
463 if (ast)
464 {
465 ast->setExternalSource (ast_source_ap);
466 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
467 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
468 }
469}
470
471void
472ClangASTContext::RemoveExternalSource ()
473{
474 ASTContext *ast = getASTContext();
475
476 if (ast)
477 {
478 llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
479 ast->setExternalSource (empty_ast_source_ap);
480 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
481 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
482 }
483}
484
485
Chris Lattner24943d22010-06-08 16:52:24 +0000486
487ASTContext *
488ClangASTContext::getASTContext()
489{
Greg Claytonb01000f2011-01-17 03:46:26 +0000490 if (m_ast_ap.get() == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +0000491 {
Greg Claytonb01000f2011-01-17 03:46:26 +0000492 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
493 *getSourceManager(),
Sean Callananc1535182011-10-07 23:18:13 +0000494 getTargetInfo(),
Greg Claytonb01000f2011-01-17 03:46:26 +0000495 *getIdentifierTable(),
496 *getSelectorTable(),
497 *getBuiltinContext(),
498 0));
Sean Callanan887d2512010-12-11 00:08:56 +0000499
Greg Claytonb01000f2011-01-17 03:46:26 +0000500 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
501 {
502 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
503 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
504 }
505
Sean Callananc1535182011-10-07 23:18:13 +0000506 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Chris Lattner24943d22010-06-08 16:52:24 +0000507 }
Greg Claytonb01000f2011-01-17 03:46:26 +0000508 return m_ast_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000509}
510
511Builtin::Context *
512ClangASTContext::getBuiltinContext()
513{
514 if (m_builtins_ap.get() == NULL)
Sean Callananc1535182011-10-07 23:18:13 +0000515 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner24943d22010-06-08 16:52:24 +0000516 return m_builtins_ap.get();
517}
518
519IdentifierTable *
520ClangASTContext::getIdentifierTable()
521{
522 if (m_identifier_table_ap.get() == NULL)
523 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
524 return m_identifier_table_ap.get();
525}
526
527LangOptions *
528ClangASTContext::getLanguageOptions()
529{
530 if (m_language_options_ap.get() == NULL)
531 {
532 m_language_options_ap.reset(new LangOptions());
Greg Claytone41c4b22010-06-13 17:34:29 +0000533 ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
534// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner24943d22010-06-08 16:52:24 +0000535 }
536 return m_language_options_ap.get();
537}
538
539SelectorTable *
540ClangASTContext::getSelectorTable()
541{
542 if (m_selector_table_ap.get() == NULL)
543 m_selector_table_ap.reset (new SelectorTable());
544 return m_selector_table_ap.get();
545}
546
Sean Callanan8a3b0a82010-11-18 02:56:27 +0000547clang::FileManager *
548ClangASTContext::getFileManager()
549{
550 if (m_file_manager_ap.get() == NULL)
Greg Clayton22defe82010-12-02 23:20:03 +0000551 {
552 clang::FileSystemOptions file_system_options;
553 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
554 }
Sean Callanan8a3b0a82010-11-18 02:56:27 +0000555 return m_file_manager_ap.get();
556}
557
Greg Clayton1674b122010-07-21 22:12:05 +0000558clang::SourceManager *
Chris Lattner24943d22010-06-08 16:52:24 +0000559ClangASTContext::getSourceManager()
560{
561 if (m_source_manager_ap.get() == NULL)
Sean Callananc1535182011-10-07 23:18:13 +0000562 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner24943d22010-06-08 16:52:24 +0000563 return m_source_manager_ap.get();
564}
565
Sean Callananc1535182011-10-07 23:18:13 +0000566clang::DiagnosticsEngine *
567ClangASTContext::getDiagnosticsEngine()
Chris Lattner24943d22010-06-08 16:52:24 +0000568{
Sean Callananc1535182011-10-07 23:18:13 +0000569 if (m_diagnostics_engine_ap.get() == NULL)
Greg Claytoneae91242010-11-19 21:46:54 +0000570 {
571 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callanancbe707c2012-10-25 01:00:25 +0000572 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
Greg Claytoneae91242010-11-19 21:46:54 +0000573 }
Sean Callananc1535182011-10-07 23:18:13 +0000574 return m_diagnostics_engine_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000575}
576
Sean Callananc1535182011-10-07 23:18:13 +0000577class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan887d2512010-12-11 00:08:56 +0000578{
579public:
Sean Callananc1535182011-10-07 23:18:13 +0000580 NullDiagnosticConsumer ()
Sean Callanan887d2512010-12-11 00:08:56 +0000581 {
582 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
583 }
584
Sean Callananc1535182011-10-07 23:18:13 +0000585 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan887d2512010-12-11 00:08:56 +0000586 {
587 if (m_log)
588 {
Sean Callanan8f2e3922012-02-04 08:49:35 +0000589 llvm::SmallVector<char, 32> diag_str(10);
Sean Callanan887d2512010-12-11 00:08:56 +0000590 info.FormatDiagnostic(diag_str);
591 diag_str.push_back('\0');
592 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
593 }
594 }
Sean Callananc1535182011-10-07 23:18:13 +0000595
596 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
597 {
598 return new NullDiagnosticConsumer ();
599 }
Sean Callanan887d2512010-12-11 00:08:56 +0000600private:
Greg Clayton952e9dc2013-03-27 23:08:40 +0000601 Log * m_log;
Sean Callanan887d2512010-12-11 00:08:56 +0000602};
603
Sean Callananc1535182011-10-07 23:18:13 +0000604DiagnosticConsumer *
605ClangASTContext::getDiagnosticConsumer()
Sean Callanan887d2512010-12-11 00:08:56 +0000606{
Sean Callananc1535182011-10-07 23:18:13 +0000607 if (m_diagnostic_consumer_ap.get() == NULL)
608 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan887d2512010-12-11 00:08:56 +0000609
Sean Callananc1535182011-10-07 23:18:13 +0000610 return m_diagnostic_consumer_ap.get();
Sean Callanan887d2512010-12-11 00:08:56 +0000611}
612
Chris Lattner24943d22010-06-08 16:52:24 +0000613TargetOptions *
614ClangASTContext::getTargetOptions()
615{
Sean Callanan6a97d422012-10-17 22:11:14 +0000616 if (m_target_options_rp.getPtr() == NULL && !m_target_triple.empty())
Chris Lattner24943d22010-06-08 16:52:24 +0000617 {
Sean Callanan6a97d422012-10-17 22:11:14 +0000618 m_target_options_rp.reset ();
619 m_target_options_rp = new TargetOptions();
620 if (m_target_options_rp.getPtr() != NULL)
621 m_target_options_rp->Triple = m_target_triple;
Chris Lattner24943d22010-06-08 16:52:24 +0000622 }
Sean Callanan6a97d422012-10-17 22:11:14 +0000623 return m_target_options_rp.getPtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000624}
625
626
627TargetInfo *
628ClangASTContext::getTargetInfo()
629{
Greg Claytonb170aee2012-05-08 01:45:38 +0000630 // target_triple should be something like "x86_64-apple-macosx"
Chris Lattner24943d22010-06-08 16:52:24 +0000631 if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
Greg Claytonb4fadde2012-11-16 21:35:22 +0000632 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), getTargetOptions()));
Chris Lattner24943d22010-06-08 16:52:24 +0000633 return m_target_info_ap.get();
634}
635
636#pragma mark Basic Types
637
638static inline bool
Greg Claytonb01000f2011-01-17 03:46:26 +0000639QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner24943d22010-06-08 16:52:24 +0000640{
Greg Claytonb01000f2011-01-17 03:46:26 +0000641 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner24943d22010-06-08 16:52:24 +0000642 if (qual_type_bit_size == bit_size)
643 return true;
644 return false;
645}
646
Greg Clayton462d4142010-09-29 01:12:09 +0000647clang_type_t
Greg Clayton585660c2010-08-05 01:57:25 +0000648ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
Chris Lattner24943d22010-06-08 16:52:24 +0000649{
Greg Claytonb01000f2011-01-17 03:46:26 +0000650 ASTContext *ast = getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +0000651
Greg Claytonb01000f2011-01-17 03:46:26 +0000652 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000653
Greg Claytonb01000f2011-01-17 03:46:26 +0000654 return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
Chris Lattner24943d22010-06-08 16:52:24 +0000655}
656
Greg Clayton462d4142010-09-29 01:12:09 +0000657clang_type_t
Greg Claytonb01000f2011-01-17 03:46:26 +0000658ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner24943d22010-06-08 16:52:24 +0000659{
Greg Claytonb01000f2011-01-17 03:46:26 +0000660 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +0000661 return NULL;
662
663 switch (encoding)
664 {
Greg Clayton585660c2010-08-05 01:57:25 +0000665 case eEncodingInvalid:
Greg Claytonb01000f2011-01-17 03:46:26 +0000666 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
667 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000668 break;
669
Greg Clayton585660c2010-08-05 01:57:25 +0000670 case eEncodingUint:
Greg Claytonb01000f2011-01-17 03:46:26 +0000671 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
672 return ast->UnsignedCharTy.getAsOpaquePtr();
673 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
674 return ast->UnsignedShortTy.getAsOpaquePtr();
675 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
676 return ast->UnsignedIntTy.getAsOpaquePtr();
677 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
678 return ast->UnsignedLongTy.getAsOpaquePtr();
679 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
680 return ast->UnsignedLongLongTy.getAsOpaquePtr();
681 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
682 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000683 break;
684
Greg Clayton585660c2010-08-05 01:57:25 +0000685 case eEncodingSint:
Greg Claytonb01000f2011-01-17 03:46:26 +0000686 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
687 return ast->CharTy.getAsOpaquePtr();
688 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
689 return ast->ShortTy.getAsOpaquePtr();
690 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
691 return ast->IntTy.getAsOpaquePtr();
692 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
693 return ast->LongTy.getAsOpaquePtr();
694 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
695 return ast->LongLongTy.getAsOpaquePtr();
696 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
697 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000698 break;
699
Greg Clayton585660c2010-08-05 01:57:25 +0000700 case eEncodingIEEE754:
Greg Claytonb01000f2011-01-17 03:46:26 +0000701 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
702 return ast->FloatTy.getAsOpaquePtr();
703 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
704 return ast->DoubleTy.getAsOpaquePtr();
705 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
706 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000707 break;
708
Greg Clayton585660c2010-08-05 01:57:25 +0000709 case eEncodingVector:
Johnny Chen1bc1cad2012-03-07 01:12:24 +0000710 // Sanity check that bit_size is a multiple of 8's.
711 if (bit_size && !(bit_size & 0x7u))
712 return ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8).getAsOpaquePtr();
713 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000714 }
715
716 return NULL;
717}
718
Greg Clayton462d4142010-09-29 01:12:09 +0000719clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +0000720ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
721{
Greg Claytonb01000f2011-01-17 03:46:26 +0000722 ASTContext *ast = getASTContext();
Sean Callanane4b3d632012-04-03 01:10:10 +0000723
724#define streq(a,b) strcmp(a,b) == 0
Greg Claytonb01000f2011-01-17 03:46:26 +0000725 assert (ast != NULL);
726 if (ast)
Chris Lattner24943d22010-06-08 16:52:24 +0000727 {
728 switch (dw_ate)
729 {
Sean Callanane4b3d632012-04-03 01:10:10 +0000730 default:
731 break;
Greg Claytonca541932011-10-28 23:06:08 +0000732
Sean Callanane4b3d632012-04-03 01:10:10 +0000733 case DW_ATE_address:
734 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
735 return ast->VoidPtrTy.getAsOpaquePtr();
736 break;
737
738 case DW_ATE_boolean:
739 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
740 return ast->BoolTy.getAsOpaquePtr();
741 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
742 return ast->UnsignedCharTy.getAsOpaquePtr();
743 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
744 return ast->UnsignedShortTy.getAsOpaquePtr();
745 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
746 return ast->UnsignedIntTy.getAsOpaquePtr();
747 break;
748
749 case DW_ATE_lo_user:
750 // This has been seen to mean DW_AT_complex_integer
751 if (type_name)
Greg Claytonca541932011-10-28 23:06:08 +0000752 {
Sean Callanane4b3d632012-04-03 01:10:10 +0000753 if (::strstr(type_name, "complex"))
754 {
755 clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
756 return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
757 }
Greg Claytonca541932011-10-28 23:06:08 +0000758 }
Sean Callanane4b3d632012-04-03 01:10:10 +0000759 break;
760
761 case DW_ATE_complex_float:
762 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
763 return ast->FloatComplexTy.getAsOpaquePtr();
764 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
765 return ast->DoubleComplexTy.getAsOpaquePtr();
766 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
767 return ast->LongDoubleComplexTy.getAsOpaquePtr();
768 else
Greg Claytonca541932011-10-28 23:06:08 +0000769 {
Sean Callanane4b3d632012-04-03 01:10:10 +0000770 clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
771 return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
Greg Claytonca541932011-10-28 23:06:08 +0000772 }
Sean Callanane4b3d632012-04-03 01:10:10 +0000773 break;
774
775 case DW_ATE_float:
776 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
777 return ast->FloatTy.getAsOpaquePtr();
778 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
779 return ast->DoubleTy.getAsOpaquePtr();
780 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
781 return ast->LongDoubleTy.getAsOpaquePtr();
782 break;
783
784 case DW_ATE_signed:
785 if (type_name)
786 {
787 if (streq(type_name, "wchar_t") &&
788 QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
789 return ast->WCharTy.getAsOpaquePtr();
790 if (streq(type_name, "void") &&
791 QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
792 return ast->VoidTy.getAsOpaquePtr();
793 if (strstr(type_name, "long long") &&
794 QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
795 return ast->LongLongTy.getAsOpaquePtr();
796 if (strstr(type_name, "long") &&
797 QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
798 return ast->LongTy.getAsOpaquePtr();
799 if (strstr(type_name, "short") &&
800 QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
801 return ast->ShortTy.getAsOpaquePtr();
802 if (strstr(type_name, "char"))
803 {
804 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
805 return ast->CharTy.getAsOpaquePtr();
806 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
807 return ast->SignedCharTy.getAsOpaquePtr();
808 }
809 if (strstr(type_name, "int"))
810 {
811 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
812 return ast->IntTy.getAsOpaquePtr();
813 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
814 return ast->Int128Ty.getAsOpaquePtr();
815 }
816 }
817 // We weren't able to match up a type name, just search by size
818 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
819 return ast->CharTy.getAsOpaquePtr();
820 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
821 return ast->ShortTy.getAsOpaquePtr();
822 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
823 return ast->IntTy.getAsOpaquePtr();
824 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
825 return ast->LongTy.getAsOpaquePtr();
826 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
827 return ast->LongLongTy.getAsOpaquePtr();
828 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
829 return ast->Int128Ty.getAsOpaquePtr();
830 break;
831
832 case DW_ATE_signed_char:
833 if (type_name)
834 {
835 if (streq(type_name, "signed char"))
836 {
837 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
838 return ast->SignedCharTy.getAsOpaquePtr();
839 }
840 }
841 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
842 return ast->CharTy.getAsOpaquePtr();
843 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
844 return ast->SignedCharTy.getAsOpaquePtr();
845 break;
846
847 case DW_ATE_unsigned:
848 if (type_name)
849 {
850 if (strstr(type_name, "long long"))
851 {
852 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
853 return ast->UnsignedLongLongTy.getAsOpaquePtr();
854 }
855 else if (strstr(type_name, "long"))
856 {
857 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
858 return ast->UnsignedLongTy.getAsOpaquePtr();
859 }
860 else if (strstr(type_name, "short"))
861 {
862 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
863 return ast->UnsignedShortTy.getAsOpaquePtr();
864 }
865 else if (strstr(type_name, "char"))
866 {
867 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
868 return ast->UnsignedCharTy.getAsOpaquePtr();
869 }
870 else if (strstr(type_name, "int"))
871 {
872 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
873 return ast->UnsignedIntTy.getAsOpaquePtr();
874 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
875 return ast->UnsignedInt128Ty.getAsOpaquePtr();
876 }
877 }
878 // We weren't able to match up a type name, just search by size
879 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
880 return ast->UnsignedCharTy.getAsOpaquePtr();
881 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
882 return ast->UnsignedShortTy.getAsOpaquePtr();
883 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
884 return ast->UnsignedIntTy.getAsOpaquePtr();
885 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
886 return ast->UnsignedLongTy.getAsOpaquePtr();
887 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
888 return ast->UnsignedLongLongTy.getAsOpaquePtr();
889 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
890 return ast->UnsignedInt128Ty.getAsOpaquePtr();
891 break;
892
893 case DW_ATE_unsigned_char:
894 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
895 return ast->UnsignedCharTy.getAsOpaquePtr();
896 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
897 return ast->UnsignedShortTy.getAsOpaquePtr();
898 break;
899
900 case DW_ATE_imaginary_float:
901 break;
902
903 case DW_ATE_UTF:
904 if (type_name)
905 {
906 if (streq(type_name, "char16_t"))
907 {
908 return ast->Char16Ty.getAsOpaquePtr();
909 }
910 else if (streq(type_name, "char32_t"))
911 {
912 return ast->Char32Ty.getAsOpaquePtr();
913 }
914 }
915 break;
Chris Lattner24943d22010-06-08 16:52:24 +0000916 }
917 }
918 // This assert should fire for anything that we don't catch above so we know
919 // to fix any issues we run into.
Greg Clayton5a570902011-05-17 18:15:05 +0000920 if (type_name)
921 {
Greg Claytondf6dc882012-01-05 03:57:59 +0000922 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 +0000923 }
924 else
925 {
Greg Claytondf6dc882012-01-05 03:57:59 +0000926 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 +0000927 }
Chris Lattner24943d22010-06-08 16:52:24 +0000928 return NULL;
929}
930
Greg Clayton462d4142010-09-29 01:12:09 +0000931clang_type_t
Greg Claytonb01000f2011-01-17 03:46:26 +0000932ClangASTContext::GetBuiltInType_void(ASTContext *ast)
Chris Lattner24943d22010-06-08 16:52:24 +0000933{
Greg Claytonb01000f2011-01-17 03:46:26 +0000934 return ast->VoidTy.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +0000935}
936
Greg Clayton462d4142010-09-29 01:12:09 +0000937clang_type_t
Sean Callanana91dd992010-11-19 02:52:21 +0000938ClangASTContext::GetBuiltInType_bool()
939{
940 return getASTContext()->BoolTy.getAsOpaquePtr();
941}
942
943clang_type_t
Greg Clayton960d6a42010-08-03 00:35:52 +0000944ClangASTContext::GetBuiltInType_objc_id()
945{
Sean Callanane6ea5fe2011-11-15 02:11:17 +0000946 return getASTContext()->getObjCIdType().getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +0000947}
948
Enrico Granata3dc2a5b2013-03-20 19:04:28 +0000949lldb::clang_type_t
950ClangASTContext::GetBuiltInType_objc_id(clang::ASTContext *ast)
951{
952 return ast->getObjCIdType().getAsOpaquePtr();
953}
954
Greg Clayton462d4142010-09-29 01:12:09 +0000955clang_type_t
Greg Clayton960d6a42010-08-03 00:35:52 +0000956ClangASTContext::GetBuiltInType_objc_Class()
957{
Sean Callanane6ea5fe2011-11-15 02:11:17 +0000958 return getASTContext()->getObjCClassType().getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +0000959}
960
Greg Clayton462d4142010-09-29 01:12:09 +0000961clang_type_t
Greg Clayton960d6a42010-08-03 00:35:52 +0000962ClangASTContext::GetBuiltInType_objc_selector()
963{
Sean Callanane6ea5fe2011-11-15 02:11:17 +0000964 return getASTContext()->getObjCSelType().getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +0000965}
966
Greg Clayton462d4142010-09-29 01:12:09 +0000967clang_type_t
Sean Callananfb3058e2011-05-12 23:54:16 +0000968ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
969{
970 return ast->UnknownAnyTy.getAsOpaquePtr();
971}
972
973clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +0000974ClangASTContext::GetCStringType (bool is_const)
975{
976 QualType char_type(getASTContext()->CharTy);
977
978 if (is_const)
979 char_type.addConst();
980
981 return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
982}
983
Greg Clayton462d4142010-09-29 01:12:09 +0000984clang_type_t
Sean Callanan8d611562012-04-05 00:12:52 +0000985ClangASTContext::GetVoidType()
986{
987 return GetVoidType(getASTContext());
988}
989
990clang_type_t
991ClangASTContext::GetVoidType(ASTContext *ast)
992{
993 return ast->VoidTy.getAsOpaquePtr();
994}
995
996clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +0000997ClangASTContext::GetVoidPtrType (bool is_const)
998{
999 return GetVoidPtrType(getASTContext(), is_const);
1000}
1001
Greg Clayton462d4142010-09-29 01:12:09 +00001002clang_type_t
Greg Claytonb01000f2011-01-17 03:46:26 +00001003ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
Chris Lattner24943d22010-06-08 16:52:24 +00001004{
Greg Claytonb01000f2011-01-17 03:46:26 +00001005 QualType void_ptr_type(ast->VoidPtrTy);
Chris Lattner24943d22010-06-08 16:52:24 +00001006
1007 if (is_const)
1008 void_ptr_type.addConst();
1009
1010 return void_ptr_type.getAsOpaquePtr();
1011}
1012
Sean Callanan673f3db2011-11-30 22:11:59 +00001013clang::DeclContext *
1014ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
1015{
1016 return ast->getTranslationUnitDecl();
1017}
1018
Greg Clayton462d4142010-09-29 01:12:09 +00001019clang_type_t
Greg Clayton22defe82010-12-02 23:20:03 +00001020ClangASTContext::CopyType (ASTContext *dst_ast,
1021 ASTContext *src_ast,
Greg Clayton462d4142010-09-29 01:12:09 +00001022 clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00001023{
Sean Callanan8a3b0a82010-11-18 02:56:27 +00001024 FileSystemOptions file_system_options;
Greg Clayton22defe82010-12-02 23:20:03 +00001025 FileManager file_manager (file_system_options);
1026 ASTImporter importer(*dst_ast, file_manager,
Sean Callananad293092011-01-18 23:32:05 +00001027 *src_ast, file_manager,
1028 false);
Sean Callanancf18faa2010-11-09 22:37:10 +00001029
Greg Clayton22defe82010-12-02 23:20:03 +00001030 QualType src (QualType::getFromOpaquePtr(clang_type));
1031 QualType dst (importer.Import(src));
Sean Callanancf18faa2010-11-09 22:37:10 +00001032
1033 return dst.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00001034}
1035
Greg Clayton6916e352010-11-13 03:52:47 +00001036
1037clang::Decl *
Greg Clayton22defe82010-12-02 23:20:03 +00001038ClangASTContext::CopyDecl (ASTContext *dst_ast,
1039 ASTContext *src_ast,
Greg Clayton6916e352010-11-13 03:52:47 +00001040 clang::Decl *source_decl)
Sean Callanan887d2512010-12-11 00:08:56 +00001041{
Sean Callanan8a3b0a82010-11-18 02:56:27 +00001042 FileSystemOptions file_system_options;
Greg Clayton22defe82010-12-02 23:20:03 +00001043 FileManager file_manager (file_system_options);
1044 ASTImporter importer(*dst_ast, file_manager,
Sean Callananad293092011-01-18 23:32:05 +00001045 *src_ast, file_manager,
1046 false);
Greg Clayton6916e352010-11-13 03:52:47 +00001047
1048 return importer.Import(source_decl);
1049}
1050
Sean Callanan8d825062010-07-16 00:00:27 +00001051bool
Greg Claytondc0a38c2012-03-26 23:03:23 +00001052ClangASTContext::AreTypesSame (ASTContext *ast,
1053 clang_type_t type1,
1054 clang_type_t type2,
1055 bool ignore_qualifiers)
Sean Callanan5510ddd2010-07-15 22:30:52 +00001056{
Greg Claytone2f71a32012-04-06 17:38:55 +00001057 if (type1 == type2)
1058 return true;
1059
Sean Callanan70c6cf42012-02-18 02:01:03 +00001060 QualType type1_qual = QualType::getFromOpaquePtr(type1);
1061 QualType type2_qual = QualType::getFromOpaquePtr(type2);
1062
1063 if (ignore_qualifiers)
1064 {
1065 type1_qual = type1_qual.getUnqualifiedType();
1066 type2_qual = type2_qual.getUnqualifiedType();
1067 }
1068
1069 return ast->hasSameType (type1_qual,
1070 type2_qual);
Sean Callanan5510ddd2010-07-15 22:30:52 +00001071}
1072
Chris Lattner24943d22010-06-08 16:52:24 +00001073#pragma mark CVR modifiers
1074
Greg Clayton462d4142010-09-29 01:12:09 +00001075clang_type_t
1076ClangASTContext::AddConstModifier (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00001077{
1078 if (clang_type)
1079 {
1080 QualType result(QualType::getFromOpaquePtr(clang_type));
1081 result.addConst();
1082 return result.getAsOpaquePtr();
1083 }
1084 return NULL;
1085}
1086
Greg Clayton462d4142010-09-29 01:12:09 +00001087clang_type_t
1088ClangASTContext::AddRestrictModifier (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00001089{
1090 if (clang_type)
1091 {
1092 QualType result(QualType::getFromOpaquePtr(clang_type));
1093 result.getQualifiers().setRestrict (true);
1094 return result.getAsOpaquePtr();
1095 }
1096 return NULL;
1097}
1098
Greg Clayton462d4142010-09-29 01:12:09 +00001099clang_type_t
1100ClangASTContext::AddVolatileModifier (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00001101{
1102 if (clang_type)
1103 {
1104 QualType result(QualType::getFromOpaquePtr(clang_type));
1105 result.getQualifiers().setVolatile (true);
1106 return result.getAsOpaquePtr();
1107 }
1108 return NULL;
1109}
1110
Greg Claytonb01000f2011-01-17 03:46:26 +00001111
1112clang_type_t
1113ClangASTContext::GetTypeForDecl (TagDecl *decl)
1114{
1115 // No need to call the getASTContext() accessor (which can create the AST
1116 // if it isn't created yet, because we can't have created a decl in this
1117 // AST if our AST didn't already exist...
1118 if (m_ast_ap.get())
1119 return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1120 return NULL;
1121}
1122
1123clang_type_t
1124ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1125{
1126 // No need to call the getASTContext() accessor (which can create the AST
1127 // if it isn't created yet, because we can't have created a decl in this
1128 // AST if our AST didn't already exist...
1129 if (m_ast_ap.get())
1130 return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1131 return NULL;
1132}
1133
Chris Lattner24943d22010-06-08 16:52:24 +00001134#pragma mark Structure, Unions, Classes
1135
Greg Clayton462d4142010-09-29 01:12:09 +00001136clang_type_t
Greg Clayton9c091812013-03-08 01:37:30 +00001137ClangASTContext::CreateRecordType (DeclContext *decl_ctx,
1138 AccessType access_type,
1139 const char *name,
1140 int kind,
1141 LanguageType language,
1142 ClangASTMetadata *metadata)
Chris Lattner24943d22010-06-08 16:52:24 +00001143{
Greg Claytonb01000f2011-01-17 03:46:26 +00001144 ASTContext *ast = getASTContext();
1145 assert (ast != NULL);
Sean Callanana4974db2012-04-18 01:06:17 +00001146
Chris Lattner24943d22010-06-08 16:52:24 +00001147 if (decl_ctx == NULL)
Greg Claytonb01000f2011-01-17 03:46:26 +00001148 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner24943d22010-06-08 16:52:24 +00001149
Greg Clayton9488b742010-07-28 02:04:09 +00001150
Greg Clayton32b4f142011-08-24 23:50:00 +00001151 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9488b742010-07-28 02:04:09 +00001152 {
Greg Clayton306edca2010-10-11 02:25:34 +00001153 bool isForwardDecl = true;
Greg Clayton9488b742010-07-28 02:04:09 +00001154 bool isInternal = false;
Sean Callanana4974db2012-04-18 01:06:17 +00001155 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
Greg Clayton9488b742010-07-28 02:04:09 +00001156 }
1157
Chris Lattner24943d22010-06-08 16:52:24 +00001158 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1159 // we will need to update this code. I was told to currently always use
1160 // the CXXRecordDecl class since we often don't know from debug information
1161 // if something is struct or a class, so we default to always use the more
1162 // complete definition just in case.
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001163 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1164 (TagDecl::TagKind)kind,
1165 decl_ctx,
1166 SourceLocation(),
1167 SourceLocation(),
1168 name && name[0] ? &ast->Idents.get(name) : NULL);
Sean Callanand0d73722012-01-13 22:10:18 +00001169
Greg Clayton9c091812013-03-08 01:37:30 +00001170 if (decl)
Greg Clayton5e8eb5c2011-10-26 03:31:36 +00001171 {
Greg Clayton9c091812013-03-08 01:37:30 +00001172 if (metadata)
Greg Clayton017c16a2013-03-27 01:48:02 +00001173 SetMetadata(ast, decl, *metadata);
Greg Clayton9c091812013-03-08 01:37:30 +00001174
Greg Clayton5e8eb5c2011-10-26 03:31:36 +00001175 if (access_type != eAccessNone)
1176 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Clayton9c091812013-03-08 01:37:30 +00001177
1178 if (decl_ctx)
1179 decl_ctx->addDecl (decl);
1180
1181 return ast->getTagDeclType(decl).getAsOpaquePtr();
Greg Clayton5e8eb5c2011-10-26 03:31:36 +00001182 }
Greg Clayton9c091812013-03-08 01:37:30 +00001183 return NULL;
Greg Claytonb01000f2011-01-17 03:46:26 +00001184}
1185
Greg Claytonb7fad952012-02-06 06:42:51 +00001186static TemplateParameterList *
1187CreateTemplateParameterList (ASTContext *ast,
Sean Callanan06dc17f2012-09-24 22:25:51 +00001188 const ClangASTContext::TemplateParameterInfos &template_param_infos,
Greg Claytonb7fad952012-02-06 06:42:51 +00001189 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1190{
1191 const bool parameter_pack = false;
1192 const bool is_typename = false;
1193 const unsigned depth = 0;
1194 const size_t num_template_params = template_param_infos.GetSize();
1195 for (size_t i=0; i<num_template_params; ++i)
1196 {
1197 const char *name = template_param_infos.names[i];
Greg Clayton764bca52013-04-23 22:38:02 +00001198
1199 IdentifierInfo *identifier_info = NULL;
1200 if (name && name[0])
1201 identifier_info = &ast->Idents.get(name);
Sean Callanan06dc17f2012-09-24 22:25:51 +00001202 if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
Greg Claytonb7fad952012-02-06 06:42:51 +00001203 {
1204 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1205 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1206 SourceLocation(),
1207 SourceLocation(),
1208 depth,
1209 i,
Greg Clayton764bca52013-04-23 22:38:02 +00001210 identifier_info,
Greg Claytonb7fad952012-02-06 06:42:51 +00001211 template_param_infos.args[i].getIntegralType(),
1212 parameter_pack,
1213 NULL));
1214
1215 }
1216 else
1217 {
1218 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1219 ast->getTranslationUnitDecl(), // Is this the right decl context?
1220 SourceLocation(),
1221 SourceLocation(),
1222 depth,
1223 i,
Greg Clayton764bca52013-04-23 22:38:02 +00001224 identifier_info,
Greg Claytonb7fad952012-02-06 06:42:51 +00001225 is_typename,
1226 parameter_pack));
1227 }
1228 }
1229
1230 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1231 SourceLocation(),
1232 SourceLocation(),
1233 &template_param_decls.front(),
1234 template_param_decls.size(),
1235 SourceLocation());
1236 return template_param_list;
1237}
1238
1239clang::FunctionTemplateDecl *
1240ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1241 clang::FunctionDecl *func_decl,
1242 const char *name,
1243 const TemplateParameterInfos &template_param_infos)
1244{
1245// /// \brief Create a function template node.
1246 ASTContext *ast = getASTContext();
1247
1248 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1249
1250 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1251 template_param_infos,
1252 template_param_decls);
1253 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1254 decl_ctx,
1255 func_decl->getLocation(),
1256 func_decl->getDeclName(),
1257 template_param_list,
1258 func_decl);
1259
1260 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1261 i < template_param_decl_count;
1262 ++i)
1263 {
1264 // TODO: verify which decl context we should put template_param_decls into..
1265 template_param_decls[i]->setDeclContext (func_decl);
1266 }
1267
1268 return func_tmpl_decl;
1269}
1270
1271void
1272ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1273 clang::FunctionTemplateDecl *func_tmpl_decl,
1274 const TemplateParameterInfos &infos)
1275{
1276 TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1277 infos.args.data(),
1278 infos.args.size());
1279
1280 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1281 &template_args,
1282 NULL);
1283}
1284
1285
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001286ClassTemplateDecl *
1287ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton5e8eb5c2011-10-26 03:31:36 +00001288 lldb::AccessType access_type,
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001289 const char *class_name,
1290 int kind,
1291 const TemplateParameterInfos &template_param_infos)
1292{
1293 ASTContext *ast = getASTContext();
1294
1295 ClassTemplateDecl *class_template_decl = NULL;
1296 if (decl_ctx == NULL)
1297 decl_ctx = ast->getTranslationUnitDecl();
1298
1299 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1300 DeclarationName decl_name (&identifier_info);
1301
1302 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callananca8fb172012-12-21 21:34:42 +00001303
1304 for (NamedDecl *decl : result)
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001305 {
Sean Callananca8fb172012-12-21 21:34:42 +00001306 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001307 if (class_template_decl)
1308 return class_template_decl;
1309 }
1310
1311 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001312
Greg Claytonb7fad952012-02-06 06:42:51 +00001313 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1314 template_param_infos,
1315 template_param_decls);
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001316
1317 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1318 (TagDecl::TagKind)kind,
1319 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1320 SourceLocation(),
1321 SourceLocation(),
1322 &identifier_info);
Greg Clayton4b9cf3d2011-12-02 02:09:28 +00001323
1324 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1325 i < template_param_decl_count;
1326 ++i)
1327 {
1328 template_param_decls[i]->setDeclContext (template_cxx_decl);
1329 }
1330
Sean Callanand9b79852011-11-19 01:35:08 +00001331 // With templated classes, we say that a class is templated with
1332 // specializations, but that the bare class has no functions.
Sean Callanandbf2fb02013-02-01 06:55:48 +00001333 //template_cxx_decl->startDefinition();
1334 //template_cxx_decl->completeDefinition();
Sean Callanand9b79852011-11-19 01:35:08 +00001335
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001336 class_template_decl = ClassTemplateDecl::Create (*ast,
1337 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1338 SourceLocation(),
1339 decl_name,
1340 template_param_list,
1341 template_cxx_decl,
1342 NULL);
1343
1344 if (class_template_decl)
Sean Callananc6d161e2011-10-26 01:06:27 +00001345 {
Greg Clayton5e8eb5c2011-10-26 03:31:36 +00001346 if (access_type != eAccessNone)
1347 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan8f2e3922012-02-04 08:49:35 +00001348
1349 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1350 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1351
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001352 decl_ctx->addDecl (class_template_decl);
Sean Callananc6d161e2011-10-26 01:06:27 +00001353
1354#ifdef LLDB_CONFIGURATION_DEBUG
1355 VerifyDecl(class_template_decl);
1356#endif
1357 }
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001358
1359 return class_template_decl;
1360}
1361
1362
1363ClassTemplateSpecializationDecl *
1364ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1365 ClassTemplateDecl *class_template_decl,
1366 int kind,
1367 const TemplateParameterInfos &template_param_infos)
1368{
1369 ASTContext *ast = getASTContext();
1370 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1371 (TagDecl::TagKind)kind,
1372 decl_ctx,
1373 SourceLocation(),
1374 SourceLocation(),
1375 class_template_decl,
1376 &template_param_infos.args.front(),
1377 template_param_infos.args.size(),
1378 NULL);
1379
Sean Callanandbf2fb02013-02-01 06:55:48 +00001380 class_template_specialization_decl->setSpecializationKind(TSK_ExplicitSpecialization);
1381
Greg Claytonf6a5bd72011-10-22 03:33:13 +00001382 return class_template_specialization_decl;
1383}
1384
1385lldb::clang_type_t
1386ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1387{
1388 if (class_template_specialization_decl)
1389 {
1390 ASTContext *ast = getASTContext();
1391 if (ast)
1392 return ast->getTagDeclType(class_template_specialization_decl).getAsOpaquePtr();
1393 }
1394 return NULL;
1395}
1396
Greg Claytonb01000f2011-01-17 03:46:26 +00001397bool
1398ClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1399{
1400 if (clang_type == NULL)
1401 return false;
1402
1403 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1404
1405 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1406 switch (type_class)
1407 {
1408 case clang::Type::Record:
1409 {
1410 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1411 if (cxx_record_decl)
1412 {
1413 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
Greg Clayton7a183dc2011-01-20 04:18:48 +00001414 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
Greg Claytonb01000f2011-01-17 03:46:26 +00001415 return true;
1416 }
1417 }
1418 break;
1419
1420 case clang::Type::Enum:
1421 {
1422 EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1423 if (enum_decl)
1424 {
1425 enum_decl->setHasExternalLexicalStorage (has_extern);
Greg Clayton7a183dc2011-01-20 04:18:48 +00001426 enum_decl->setHasExternalVisibleStorage (has_extern);
Greg Claytonb01000f2011-01-17 03:46:26 +00001427 return true;
1428 }
1429 }
1430 break;
1431
1432 case clang::Type::ObjCObject:
1433 case clang::Type::ObjCInterface:
1434 {
Sean Callanand5b3c352011-01-27 04:42:51 +00001435 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Claytonb01000f2011-01-17 03:46:26 +00001436 assert (objc_class_type);
1437 if (objc_class_type)
1438 {
1439 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1440
1441 if (class_interface_decl)
1442 {
Greg Claytonb01000f2011-01-17 03:46:26 +00001443 class_interface_decl->setHasExternalLexicalStorage (has_extern);
Greg Clayton7a183dc2011-01-20 04:18:48 +00001444 class_interface_decl->setHasExternalVisibleStorage (has_extern);
Greg Claytonb01000f2011-01-17 03:46:26 +00001445 return true;
1446 }
1447 }
1448 }
1449 break;
1450
1451 case clang::Type::Typedef:
1452 return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Sean Callananc6139712011-08-11 23:56:13 +00001453
1454 case clang::Type::Elaborated:
1455 return ClangASTContext::SetHasExternalStorage (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
Greg Claytonb01000f2011-01-17 03:46:26 +00001456
1457 default:
1458 break;
1459 }
1460 return false;
Chris Lattner24943d22010-06-08 16:52:24 +00001461}
1462
Greg Claytondbf26152010-10-01 23:13:49 +00001463static bool
1464IsOperator (const char *name, OverloadedOperatorKind &op_kind)
1465{
1466 if (name == NULL || name[0] == '\0')
1467 return false;
1468
Sean Callanan494735d2010-12-10 19:51:54 +00001469#define OPERATOR_PREFIX "operator"
Greg Clayton427f2902010-12-14 02:59:59 +00001470#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
Sean Callananc2c9a142010-12-10 02:15:55 +00001471
1472 const char *post_op_name = NULL;
1473
Sean Callanan494735d2010-12-10 19:51:54 +00001474 bool no_space = true;
Sean Callananc2c9a142010-12-10 02:15:55 +00001475
Greg Clayton427f2902010-12-14 02:59:59 +00001476 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
Greg Claytondbf26152010-10-01 23:13:49 +00001477 return false;
1478
Greg Clayton427f2902010-12-14 02:59:59 +00001479 post_op_name = name + OPERATOR_PREFIX_LENGTH;
1480
Sean Callanan494735d2010-12-10 19:51:54 +00001481 if (post_op_name[0] == ' ')
1482 {
1483 post_op_name++;
1484 no_space = false;
1485 }
1486
1487#undef OPERATOR_PREFIX
Greg Clayton427f2902010-12-14 02:59:59 +00001488#undef OPERATOR_PREFIX_LENGTH
Sean Callanan494735d2010-12-10 19:51:54 +00001489
Greg Claytondbf26152010-10-01 23:13:49 +00001490 // This is an operator, set the overloaded operator kind to invalid
1491 // in case this is a conversion operator...
1492 op_kind = NUM_OVERLOADED_OPERATORS;
1493
1494 switch (post_op_name[0])
1495 {
Sean Callananc2c9a142010-12-10 02:15:55 +00001496 default:
1497 if (no_space)
1498 return false;
1499 break;
Greg Claytondbf26152010-10-01 23:13:49 +00001500 case 'n':
Sean Callananc2c9a142010-12-10 02:15:55 +00001501 if (no_space)
1502 return false;
Greg Claytondbf26152010-10-01 23:13:49 +00001503 if (strcmp (post_op_name, "new") == 0)
1504 op_kind = OO_New;
1505 else if (strcmp (post_op_name, "new[]") == 0)
1506 op_kind = OO_Array_New;
1507 break;
1508
1509 case 'd':
Sean Callananc2c9a142010-12-10 02:15:55 +00001510 if (no_space)
1511 return false;
Greg Claytondbf26152010-10-01 23:13:49 +00001512 if (strcmp (post_op_name, "delete") == 0)
1513 op_kind = OO_Delete;
1514 else if (strcmp (post_op_name, "delete[]") == 0)
1515 op_kind = OO_Array_Delete;
1516 break;
1517
1518 case '+':
1519 if (post_op_name[1] == '\0')
1520 op_kind = OO_Plus;
1521 else if (post_op_name[2] == '\0')
1522 {
1523 if (post_op_name[1] == '=')
1524 op_kind = OO_PlusEqual;
1525 else if (post_op_name[1] == '+')
1526 op_kind = OO_PlusPlus;
1527 }
1528 break;
1529
1530 case '-':
1531 if (post_op_name[1] == '\0')
1532 op_kind = OO_Minus;
1533 else if (post_op_name[2] == '\0')
1534 {
1535 switch (post_op_name[1])
1536 {
1537 case '=': op_kind = OO_MinusEqual; break;
1538 case '-': op_kind = OO_MinusMinus; break;
1539 case '>': op_kind = OO_Arrow; break;
1540 }
1541 }
1542 else if (post_op_name[3] == '\0')
1543 {
1544 if (post_op_name[2] == '*')
1545 op_kind = OO_ArrowStar; break;
1546 }
1547 break;
1548
1549 case '*':
1550 if (post_op_name[1] == '\0')
1551 op_kind = OO_Star;
1552 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1553 op_kind = OO_StarEqual;
1554 break;
1555
1556 case '/':
1557 if (post_op_name[1] == '\0')
1558 op_kind = OO_Slash;
1559 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1560 op_kind = OO_SlashEqual;
1561 break;
1562
1563 case '%':
1564 if (post_op_name[1] == '\0')
1565 op_kind = OO_Percent;
1566 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1567 op_kind = OO_PercentEqual;
1568 break;
1569
1570
1571 case '^':
1572 if (post_op_name[1] == '\0')
1573 op_kind = OO_Caret;
1574 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1575 op_kind = OO_CaretEqual;
1576 break;
1577
1578 case '&':
1579 if (post_op_name[1] == '\0')
1580 op_kind = OO_Amp;
1581 else if (post_op_name[2] == '\0')
1582 {
1583 switch (post_op_name[1])
1584 {
1585 case '=': op_kind = OO_AmpEqual; break;
1586 case '&': op_kind = OO_AmpAmp; break;
1587 }
1588 }
1589 break;
1590
1591 case '|':
1592 if (post_op_name[1] == '\0')
1593 op_kind = OO_Pipe;
1594 else if (post_op_name[2] == '\0')
1595 {
1596 switch (post_op_name[1])
1597 {
1598 case '=': op_kind = OO_PipeEqual; break;
1599 case '|': op_kind = OO_PipePipe; break;
1600 }
1601 }
1602 break;
1603
1604 case '~':
1605 if (post_op_name[1] == '\0')
1606 op_kind = OO_Tilde;
1607 break;
1608
1609 case '!':
1610 if (post_op_name[1] == '\0')
1611 op_kind = OO_Exclaim;
1612 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1613 op_kind = OO_ExclaimEqual;
1614 break;
1615
1616 case '=':
1617 if (post_op_name[1] == '\0')
1618 op_kind = OO_Equal;
1619 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1620 op_kind = OO_EqualEqual;
1621 break;
1622
1623 case '<':
1624 if (post_op_name[1] == '\0')
1625 op_kind = OO_Less;
1626 else if (post_op_name[2] == '\0')
1627 {
1628 switch (post_op_name[1])
1629 {
1630 case '<': op_kind = OO_LessLess; break;
1631 case '=': op_kind = OO_LessEqual; break;
1632 }
1633 }
1634 else if (post_op_name[3] == '\0')
1635 {
1636 if (post_op_name[2] == '=')
1637 op_kind = OO_LessLessEqual;
1638 }
1639 break;
1640
1641 case '>':
1642 if (post_op_name[1] == '\0')
1643 op_kind = OO_Greater;
1644 else if (post_op_name[2] == '\0')
1645 {
1646 switch (post_op_name[1])
1647 {
1648 case '>': op_kind = OO_GreaterGreater; break;
1649 case '=': op_kind = OO_GreaterEqual; break;
1650 }
1651 }
1652 else if (post_op_name[1] == '>' &&
1653 post_op_name[2] == '=' &&
1654 post_op_name[3] == '\0')
1655 {
1656 op_kind = OO_GreaterGreaterEqual;
1657 }
1658 break;
1659
1660 case ',':
1661 if (post_op_name[1] == '\0')
1662 op_kind = OO_Comma;
1663 break;
1664
1665 case '(':
1666 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1667 op_kind = OO_Call;
1668 break;
1669
1670 case '[':
1671 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1672 op_kind = OO_Subscript;
1673 break;
1674 }
1675
1676 return true;
1677}
Greg Claytonb01000f2011-01-17 03:46:26 +00001678
Greg Clayton8c6907c2011-06-19 03:43:27 +00001679static inline bool
Sean Callanan37e27832011-10-15 01:15:07 +00001680check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton8c6907c2011-06-19 03:43:27 +00001681{
Sean Callanan37e27832011-10-15 01:15:07 +00001682 // Special-case call since it can take any number of operands
1683 if(op_kind == OO_Call)
1684 return true;
1685
Greg Clayton8c6907c2011-06-19 03:43:27 +00001686 // The parameter count doens't include "this"
1687 if (num_params == 0)
1688 return unary;
1689 if (num_params == 1)
1690 return binary;
Sean Callanan37e27832011-10-15 01:15:07 +00001691 else
Greg Clayton8c6907c2011-06-19 03:43:27 +00001692 return false;
1693}
Daniel Dunbar354ffde2011-10-31 22:50:57 +00001694
Greg Clayton8c6907c2011-06-19 03:43:27 +00001695bool
1696ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1697{
Sean Callanan8f2e3922012-02-04 08:49:35 +00001698 switch (op_kind)
1699 {
1700 default:
1701 break;
1702 // C++ standard allows any number of arguments to new/delete
1703 case OO_New:
1704 case OO_Array_New:
1705 case OO_Delete:
1706 case OO_Array_Delete:
1707 return true;
1708 }
1709
Sean Callanan37e27832011-10-15 01:15:07 +00001710#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 +00001711 switch (op_kind)
1712 {
1713#include "clang/Basic/OperatorKinds.def"
1714 default: break;
1715 }
1716 return false;
1717}
1718
Greg Clayton412440a2010-09-23 01:09:21 +00001719CXXMethodDecl *
Sean Callanan79523002010-09-17 02:58:26 +00001720ClangASTContext::AddMethodToCXXRecordType
1721(
Greg Claytonb01000f2011-01-17 03:46:26 +00001722 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00001723 clang_type_t record_opaque_type,
Greg Clayton412440a2010-09-23 01:09:21 +00001724 const char *name,
Greg Clayton462d4142010-09-29 01:12:09 +00001725 clang_type_t method_opaque_type,
Greg Clayton412440a2010-09-23 01:09:21 +00001726 lldb::AccessType access,
Greg Clayton1d8173f2010-09-24 05:15:53 +00001727 bool is_virtual,
1728 bool is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00001729 bool is_inline,
Sean Callanan716e3f02011-11-01 18:07:13 +00001730 bool is_explicit,
Sean Callanan2581dbf2011-11-02 01:38:59 +00001731 bool is_attr_used,
1732 bool is_artificial
Greg Clayton412440a2010-09-23 01:09:21 +00001733)
Sean Callanan79523002010-09-17 02:58:26 +00001734{
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001735 if (!record_opaque_type || !method_opaque_type || !name)
Johnny Chen974fddb2010-09-28 16:10:54 +00001736 return NULL;
Sean Callanan79523002010-09-17 02:58:26 +00001737
Greg Claytonb01000f2011-01-17 03:46:26 +00001738 assert(ast);
Sean Callanan79523002010-09-17 02:58:26 +00001739
Greg Claytonb01000f2011-01-17 03:46:26 +00001740 IdentifierTable *identifier_table = &ast->Idents;
Sean Callanan79523002010-09-17 02:58:26 +00001741
1742 assert(identifier_table);
1743
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001744 QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
Greg Clayton1d8173f2010-09-24 05:15:53 +00001745
Greg Claytonb01000f2011-01-17 03:46:26 +00001746 CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
Sean Callanan79523002010-09-17 02:58:26 +00001747
Greg Clayton1d8173f2010-09-24 05:15:53 +00001748 if (cxx_record_decl == NULL)
Greg Clayton412440a2010-09-23 01:09:21 +00001749 return NULL;
Sean Callanan79523002010-09-17 02:58:26 +00001750
Greg Clayton1d8173f2010-09-24 05:15:53 +00001751 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001752
Greg Clayton30449d52010-10-01 02:31:07 +00001753 CXXMethodDecl *cxx_method_decl = NULL;
Sean Callanan79523002010-09-17 02:58:26 +00001754
Greg Clayton30449d52010-10-01 02:31:07 +00001755 DeclarationName decl_name (&identifier_table->get(name));
Greg Clayton90e325d2010-10-01 03:45:20 +00001756
Sean Callanand5b3c352011-01-27 04:42:51 +00001757 const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
Greg Clayton90e325d2010-10-01 03:45:20 +00001758
Greg Clayton5325a362010-10-02 01:40:05 +00001759 if (function_Type == NULL)
Greg Clayton90e325d2010-10-01 03:45:20 +00001760 return NULL;
1761
Sean Callanand5b3c352011-01-27 04:42:51 +00001762 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
Greg Clayton90e325d2010-10-01 03:45:20 +00001763
1764 if (!method_function_prototype)
1765 return NULL;
1766
1767 unsigned int num_params = method_function_prototype->getNumArgs();
1768
Sean Callanan2581dbf2011-11-02 01:38:59 +00001769 CXXDestructorDecl *cxx_dtor_decl(NULL);
1770 CXXConstructorDecl *cxx_ctor_decl(NULL);
1771
Sean Callananbb53fe52013-05-01 23:18:34 +00001772 if (is_artificial)
1773 return NULL; // skip everything artificial
1774
Greg Clayton90e325d2010-10-01 03:45:20 +00001775 if (name[0] == '~')
Greg Clayton30449d52010-10-01 02:31:07 +00001776 {
Sean Callanan2581dbf2011-11-02 01:38:59 +00001777 cxx_dtor_decl = CXXDestructorDecl::Create (*ast,
1778 cxx_record_decl,
1779 SourceLocation(),
1780 DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1781 method_qual_type,
1782 NULL,
1783 is_inline,
1784 is_artificial);
1785 cxx_method_decl = cxx_dtor_decl;
Greg Clayton90e325d2010-10-01 03:45:20 +00001786 }
Greg Claytonb01000f2011-01-17 03:46:26 +00001787 else if (decl_name == cxx_record_decl->getDeclName())
Greg Clayton90e325d2010-10-01 03:45:20 +00001788 {
Sean Callanan2581dbf2011-11-02 01:38:59 +00001789 cxx_ctor_decl = CXXConstructorDecl::Create (*ast,
1790 cxx_record_decl,
1791 SourceLocation(),
1792 DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1793 method_qual_type,
1794 NULL, // TypeSourceInfo *
1795 is_explicit,
1796 is_inline,
1797 is_artificial,
1798 false /*is_constexpr*/);
1799 cxx_method_decl = cxx_ctor_decl;
Greg Clayton30449d52010-10-01 02:31:07 +00001800 }
1801 else
Greg Clayton90e325d2010-10-01 03:45:20 +00001802 {
Ashok Thirumurthi4cdf7052013-04-17 21:36:33 +00001803 clang::StorageClass SC = is_static ? SC_Static : SC_None;
Greg Claytondbf26152010-10-01 23:13:49 +00001804 OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
Ashok Thirumurthi4cdf7052013-04-17 21:36:33 +00001805
Greg Claytondbf26152010-10-01 23:13:49 +00001806 if (IsOperator (name, op_kind))
Greg Clayton90e325d2010-10-01 03:45:20 +00001807 {
Greg Claytondbf26152010-10-01 23:13:49 +00001808 if (op_kind != NUM_OVERLOADED_OPERATORS)
1809 {
Greg Clayton8c6907c2011-06-19 03:43:27 +00001810 // Check the number of operator parameters. Sometimes we have
1811 // seen bad DWARF that doesn't correctly describe operators and
1812 // if we try to create a methed and add it to the class, clang
1813 // will assert and crash, so we need to make sure things are
1814 // acceptable.
1815 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
1816 return NULL;
Greg Claytonb01000f2011-01-17 03:46:26 +00001817 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton90e325d2010-10-01 03:45:20 +00001818 cxx_record_decl,
Sean Callanan279584c2011-03-15 00:17:19 +00001819 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00001820 DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
Greg Clayton90e325d2010-10-01 03:45:20 +00001821 method_qual_type,
1822 NULL, // TypeSourceInfo *
Ashok Thirumurthi4cdf7052013-04-17 21:36:33 +00001823 SC,
Sean Callanan279584c2011-03-15 00:17:19 +00001824 is_inline,
Sean Callananc1535182011-10-07 23:18:13 +00001825 false /*is_constexpr*/,
Sean Callanan279584c2011-03-15 00:17:19 +00001826 SourceLocation());
Greg Claytondbf26152010-10-01 23:13:49 +00001827 }
1828 else if (num_params == 0)
1829 {
1830 // Conversion operators don't take params...
Greg Claytonb01000f2011-01-17 03:46:26 +00001831 cxx_method_decl = CXXConversionDecl::Create (*ast,
Greg Claytondbf26152010-10-01 23:13:49 +00001832 cxx_record_decl,
Sean Callanan279584c2011-03-15 00:17:19 +00001833 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00001834 DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
Greg Claytondbf26152010-10-01 23:13:49 +00001835 method_qual_type,
1836 NULL, // TypeSourceInfo *
1837 is_inline,
Sean Callanan279584c2011-03-15 00:17:19 +00001838 is_explicit,
Sean Callananc1535182011-10-07 23:18:13 +00001839 false /*is_constexpr*/,
Sean Callanan279584c2011-03-15 00:17:19 +00001840 SourceLocation());
Greg Claytondbf26152010-10-01 23:13:49 +00001841 }
Greg Clayton90e325d2010-10-01 03:45:20 +00001842 }
Greg Claytondbf26152010-10-01 23:13:49 +00001843
1844 if (cxx_method_decl == NULL)
Greg Clayton90e325d2010-10-01 03:45:20 +00001845 {
Greg Claytonb01000f2011-01-17 03:46:26 +00001846 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton90e325d2010-10-01 03:45:20 +00001847 cxx_record_decl,
Sean Callanan279584c2011-03-15 00:17:19 +00001848 SourceLocation(),
Greg Claytondbf26152010-10-01 23:13:49 +00001849 DeclarationNameInfo (decl_name, SourceLocation()),
Greg Clayton90e325d2010-10-01 03:45:20 +00001850 method_qual_type,
1851 NULL, // TypeSourceInfo *
Ashok Thirumurthi4cdf7052013-04-17 21:36:33 +00001852 SC,
Sean Callanan279584c2011-03-15 00:17:19 +00001853 is_inline,
Sean Callananc1535182011-10-07 23:18:13 +00001854 false /*is_constexpr*/,
Sean Callanan279584c2011-03-15 00:17:19 +00001855 SourceLocation());
Greg Clayton90e325d2010-10-01 03:45:20 +00001856 }
Greg Clayton30449d52010-10-01 02:31:07 +00001857 }
Greg Claytondbf26152010-10-01 23:13:49 +00001858
Greg Clayton462d4142010-09-29 01:12:09 +00001859 AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
Greg Clayton1d8173f2010-09-24 05:15:53 +00001860
1861 cxx_method_decl->setAccess (access_specifier);
1862 cxx_method_decl->setVirtualAsWritten (is_virtual);
Sean Callanan47a5c4c2010-09-23 03:01:22 +00001863
Sean Callanan716e3f02011-11-01 18:07:13 +00001864 if (is_attr_used)
1865 cxx_method_decl->addAttr(::new (*ast) UsedAttr(SourceRange(), *ast));
1866
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001867 // Populate the method decl with parameter decls
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001868
Charles Davisa71464f2011-05-19 23:33:46 +00001869 llvm::SmallVector<ParmVarDecl *, 12> params;
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001870
1871 for (int param_index = 0;
1872 param_index < num_params;
1873 ++param_index)
1874 {
Charles Davisa71464f2011-05-19 23:33:46 +00001875 params.push_back (ParmVarDecl::Create (*ast,
1876 cxx_method_decl,
1877 SourceLocation(),
1878 SourceLocation(),
1879 NULL, // anonymous
1880 method_function_prototype->getArgType(param_index),
1881 NULL,
1882 SC_None,
Charles Davisa71464f2011-05-19 23:33:46 +00001883 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001884 }
1885
Sean Callananc1535182011-10-07 23:18:13 +00001886 cxx_method_decl->setParams (ArrayRef<ParmVarDecl*>(params));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001887
Greg Clayton1d8173f2010-09-24 05:15:53 +00001888 cxx_record_decl->addDecl (cxx_method_decl);
Sean Callananc6d161e2011-10-26 01:06:27 +00001889
Greg Claytonf84d4dd2011-11-02 02:06:20 +00001890 // Sometimes the debug info will mention a constructor (default/copy/move),
1891 // destructor, or assignment operator (copy/move) but there won't be any
1892 // version of this in the code. So we check if the function was artificially
1893 // generated and if it is trivial and this lets the compiler/backend know
1894 // that it can inline the IR for these when it needs to and we can avoid a
1895 // "missing function" error when running expressions.
1896
Sean Callanan2581dbf2011-11-02 01:38:59 +00001897 if (is_artificial)
1898 {
Greg Claytonf84d4dd2011-11-02 02:06:20 +00001899 if (cxx_ctor_decl &&
1900 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
1901 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
1902 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
Sean Callanan2581dbf2011-11-02 01:38:59 +00001903 {
1904 cxx_ctor_decl->setDefaulted();
1905 cxx_ctor_decl->setTrivial(true);
1906 }
Greg Claytonf84d4dd2011-11-02 02:06:20 +00001907 else if (cxx_dtor_decl)
Sean Callanan2581dbf2011-11-02 01:38:59 +00001908 {
Greg Claytonf84d4dd2011-11-02 02:06:20 +00001909 if (cxx_record_decl->hasTrivialDestructor())
1910 {
1911 cxx_dtor_decl->setDefaulted();
1912 cxx_dtor_decl->setTrivial(true);
1913 }
1914 }
1915 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
1916 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
1917 {
1918 cxx_method_decl->setDefaulted();
1919 cxx_method_decl->setTrivial(true);
Sean Callanan2581dbf2011-11-02 01:38:59 +00001920 }
1921 }
1922
Sean Callananc6d161e2011-10-26 01:06:27 +00001923#ifdef LLDB_CONFIGURATION_DEBUG
1924 VerifyDecl(cxx_method_decl);
1925#endif
Greg Clayton7a183dc2011-01-20 04:18:48 +00001926
1927// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
1928// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
1929// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
1930// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
1931// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
1932// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
1933// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
1934// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
1935// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
Greg Clayton412440a2010-09-23 01:09:21 +00001936 return cxx_method_decl;
Sean Callanan79523002010-09-17 02:58:26 +00001937}
1938
Jim Ingham2546fd22011-11-12 01:36:43 +00001939clang::FieldDecl *
Greg Clayton84f80752010-07-22 18:30:50 +00001940ClangASTContext::AddFieldToRecordType
1941(
Greg Claytonb01000f2011-01-17 03:46:26 +00001942 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00001943 clang_type_t record_clang_type,
Greg Clayton84f80752010-07-22 18:30:50 +00001944 const char *name,
Greg Clayton462d4142010-09-29 01:12:09 +00001945 clang_type_t field_type,
Greg Clayton84f80752010-07-22 18:30:50 +00001946 AccessType access,
1947 uint32_t bitfield_bit_size
1948)
Chris Lattner24943d22010-06-08 16:52:24 +00001949{
1950 if (record_clang_type == NULL || field_type == NULL)
Jim Ingham2546fd22011-11-12 01:36:43 +00001951 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001952
Jim Ingham2546fd22011-11-12 01:36:43 +00001953 FieldDecl *field = NULL;
Greg Claytonb01000f2011-01-17 03:46:26 +00001954 IdentifierTable *identifier_table = &ast->Idents;
Chris Lattner24943d22010-06-08 16:52:24 +00001955
Greg Claytonb01000f2011-01-17 03:46:26 +00001956 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +00001957 assert (identifier_table != NULL);
1958
1959 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
1960
Sean Callanand5b3c352011-01-27 04:42:51 +00001961 const clang::Type *clang_type = record_qual_type.getTypePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00001962 if (clang_type)
1963 {
1964 const RecordType *record_type = dyn_cast<RecordType>(clang_type);
1965
1966 if (record_type)
1967 {
1968 RecordDecl *record_decl = record_type->getDecl();
1969
Chris Lattner24943d22010-06-08 16:52:24 +00001970 clang::Expr *bit_width = NULL;
1971 if (bitfield_bit_size != 0)
1972 {
Greg Claytonb01000f2011-01-17 03:46:26 +00001973 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1974 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Chris Lattner24943d22010-06-08 16:52:24 +00001975 }
Jim Ingham2546fd22011-11-12 01:36:43 +00001976 field = FieldDecl::Create (*ast,
Sean Callanan06dc17f2012-09-24 22:25:51 +00001977 record_decl,
1978 SourceLocation(),
1979 SourceLocation(),
1980 name ? &identifier_table->get(name) : NULL, // Identifier
1981 QualType::getFromOpaquePtr(field_type), // Field type
1982 NULL, // TInfo *
1983 bit_width, // BitWidth
1984 false, // Mutable
1985 ICIS_NoInit); // HasInit
Sean Callanan3552ed02012-03-02 01:03:45 +00001986
Sean Callanane9fcfd92012-07-13 20:01:02 +00001987 if (!name) {
1988 // Determine whether this field corresponds to an anonymous
1989 // struct or union.
1990 if (const TagType *TagT = field->getType()->getAs<TagType>()) {
1991 if (RecordDecl *Rec = dyn_cast<RecordDecl>(TagT->getDecl()))
1992 if (!Rec->getDeclName()) {
1993 Rec->setAnonymousStructOrUnion(true);
1994 field->setImplicit();
1995
1996 }
1997 }
1998 }
Chris Lattner24943d22010-06-08 16:52:24 +00001999
Chris Lattner24943d22010-06-08 16:52:24 +00002000 if (field)
2001 {
Greg Clayton35255762013-04-11 16:57:51 +00002002 field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
2003
Chris Lattner24943d22010-06-08 16:52:24 +00002004 record_decl->addDecl(field);
Sean Callananc6d161e2011-10-26 01:06:27 +00002005
2006#ifdef LLDB_CONFIGURATION_DEBUG
2007 VerifyDecl(field);
2008#endif
Chris Lattner24943d22010-06-08 16:52:24 +00002009 }
2010 }
Greg Clayton9488b742010-07-28 02:04:09 +00002011 else
2012 {
Sean Callanand5b3c352011-01-27 04:42:51 +00002013 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
Greg Clayton9488b742010-07-28 02:04:09 +00002014 if (objc_class_type)
2015 {
Greg Clayton1d8173f2010-09-24 05:15:53 +00002016 bool is_synthesized = false;
Jim Ingham2546fd22011-11-12 01:36:43 +00002017 field = ClangASTContext::AddObjCClassIVar (ast,
Greg Clayton35255762013-04-11 16:57:51 +00002018 record_clang_type,
2019 name,
2020 field_type,
2021 access,
2022 bitfield_bit_size,
2023 is_synthesized);
Greg Clayton9488b742010-07-28 02:04:09 +00002024 }
2025 }
Chris Lattner24943d22010-06-08 16:52:24 +00002026 }
Jim Ingham2546fd22011-11-12 01:36:43 +00002027 return field;
Chris Lattner24943d22010-06-08 16:52:24 +00002028}
2029
Greg Clayton35255762013-04-11 16:57:51 +00002030clang::VarDecl *
2031ClangASTContext::AddVariableToRecordType (clang::ASTContext *ast,
2032 lldb::clang_type_t record_opaque_type,
2033 const char *name,
2034 lldb::clang_type_t var_type,
2035 AccessType access)
2036{
2037 clang::VarDecl *var_decl = NULL;
2038
2039 if (record_opaque_type == NULL || var_type == NULL)
2040 return NULL;
2041
2042 IdentifierTable *identifier_table = &ast->Idents;
2043
2044 assert (ast != NULL);
2045 assert (identifier_table != NULL);
2046
2047 const RecordType *record_type = dyn_cast<RecordType>(QualType::getFromOpaquePtr(record_opaque_type).getTypePtr());
2048
2049 if (record_type)
2050 {
2051 RecordDecl *record_decl = record_type->getDecl();
2052
2053 var_decl = VarDecl::Create (*ast, // ASTContext &
2054 record_decl, // DeclContext *
2055 SourceLocation(), // SourceLocation StartLoc
2056 SourceLocation(), // SourceLocation IdLoc
2057 name ? &identifier_table->get(name) : NULL, // IdentifierInfo *
2058 QualType::getFromOpaquePtr(var_type), // Variable QualType
2059 NULL, // TypeSourceInfo *
2060 SC_Static); // StorageClass
2061 if (var_decl)
2062 {
2063 var_decl->setAccess(ConvertAccessTypeToAccessSpecifier (access));
2064 record_decl->addDecl(var_decl);
2065
2066#ifdef LLDB_CONFIGURATION_DEBUG
2067 VerifyDecl(var_decl);
2068#endif
2069 }
2070 }
2071 return var_decl;
2072}
2073
2074
Sean Callanan3552ed02012-03-02 01:03:45 +00002075static clang::AccessSpecifier UnifyAccessSpecifiers (clang::AccessSpecifier lhs,
2076 clang::AccessSpecifier rhs)
2077{
2078 clang::AccessSpecifier ret = lhs;
2079
2080 // Make the access equal to the stricter of the field and the nested field's access
2081 switch (ret)
2082 {
2083 case clang::AS_none:
2084 break;
2085 case clang::AS_private:
2086 break;
2087 case clang::AS_protected:
2088 if (rhs == AS_private)
2089 ret = AS_private;
2090 break;
2091 case clang::AS_public:
2092 ret = rhs;
2093 break;
2094 }
2095
2096 return ret;
2097}
2098
2099void
2100ClangASTContext::BuildIndirectFields (clang::ASTContext *ast,
2101 lldb::clang_type_t record_clang_type)
2102{
2103 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
2104
2105 const RecordType *record_type = record_qual_type->getAs<RecordType>();
2106
2107 if (!record_type)
2108 return;
2109
2110 RecordDecl *record_decl = record_type->getDecl();
2111
2112 if (!record_decl)
2113 return;
2114
2115 typedef llvm::SmallVector <IndirectFieldDecl *, 1> IndirectFieldVector;
2116
2117 IndirectFieldVector indirect_fields;
Greg Claytonb9124572012-12-06 02:33:54 +00002118 RecordDecl::field_iterator field_pos;
2119 RecordDecl::field_iterator field_end_pos = record_decl->field_end();
2120 RecordDecl::field_iterator last_field_pos = field_end_pos;
2121 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
Sean Callanan3552ed02012-03-02 01:03:45 +00002122 {
Greg Claytonb9124572012-12-06 02:33:54 +00002123 if (field_pos->isAnonymousStructOrUnion())
Sean Callanan3552ed02012-03-02 01:03:45 +00002124 {
Greg Claytonb9124572012-12-06 02:33:54 +00002125 QualType field_qual_type = field_pos->getType();
Sean Callanan3552ed02012-03-02 01:03:45 +00002126
2127 const RecordType *field_record_type = field_qual_type->getAs<RecordType>();
2128
2129 if (!field_record_type)
2130 continue;
2131
2132 RecordDecl *field_record_decl = field_record_type->getDecl();
2133
2134 if (!field_record_decl)
2135 continue;
2136
2137 for (RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
2138 di != de;
2139 ++di)
2140 {
2141 if (FieldDecl *nested_field_decl = dyn_cast<FieldDecl>(*di))
2142 {
2143 NamedDecl **chain = new (*ast) NamedDecl*[2];
Greg Claytonb9124572012-12-06 02:33:54 +00002144 chain[0] = *field_pos;
Sean Callanan3552ed02012-03-02 01:03:45 +00002145 chain[1] = nested_field_decl;
2146 IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*ast,
2147 record_decl,
2148 SourceLocation(),
2149 nested_field_decl->getIdentifier(),
2150 nested_field_decl->getType(),
2151 chain,
2152 2);
2153
Greg Claytonb9124572012-12-06 02:33:54 +00002154 indirect_field->setAccess(UnifyAccessSpecifiers(field_pos->getAccess(),
Sean Callanan3552ed02012-03-02 01:03:45 +00002155 nested_field_decl->getAccess()));
2156
2157 indirect_fields.push_back(indirect_field);
2158 }
2159 else if (IndirectFieldDecl *nested_indirect_field_decl = dyn_cast<IndirectFieldDecl>(*di))
2160 {
2161 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
2162 NamedDecl **chain = new (*ast) NamedDecl*[nested_chain_size + 1];
Greg Claytonb9124572012-12-06 02:33:54 +00002163 chain[0] = *field_pos;
Sean Callanan3552ed02012-03-02 01:03:45 +00002164
2165 int chain_index = 1;
2166 for (IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
2167 nce = nested_indirect_field_decl->chain_end();
2168 nci < nce;
2169 ++nci)
2170 {
2171 chain[chain_index] = *nci;
2172 chain_index++;
2173 }
2174
2175 IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*ast,
2176 record_decl,
2177 SourceLocation(),
2178 nested_indirect_field_decl->getIdentifier(),
2179 nested_indirect_field_decl->getType(),
2180 chain,
2181 nested_chain_size + 1);
2182
Greg Claytonb9124572012-12-06 02:33:54 +00002183 indirect_field->setAccess(UnifyAccessSpecifiers(field_pos->getAccess(),
Sean Callanan3552ed02012-03-02 01:03:45 +00002184 nested_indirect_field_decl->getAccess()));
2185
2186 indirect_fields.push_back(indirect_field);
2187 }
2188 }
2189 }
2190 }
2191
Greg Claytonb9124572012-12-06 02:33:54 +00002192 // Check the last field to see if it has an incomplete array type as its
2193 // last member and if it does, the tell the record decl about it
2194 if (last_field_pos != field_end_pos)
2195 {
2196 if (last_field_pos->getType()->isIncompleteArrayType())
2197 record_decl->hasFlexibleArrayMember();
2198 }
2199
Sean Callanan3552ed02012-03-02 01:03:45 +00002200 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
2201 ifi < ife;
2202 ++ifi)
2203 {
2204 record_decl->addDecl(*ifi);
2205 }
2206}
2207
Chris Lattner24943d22010-06-08 16:52:24 +00002208bool
2209ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
2210{
2211 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
2212}
2213
2214bool
2215ClangASTContext::FieldIsBitfield
2216(
Greg Claytonb01000f2011-01-17 03:46:26 +00002217 ASTContext *ast,
Chris Lattner24943d22010-06-08 16:52:24 +00002218 FieldDecl* field,
2219 uint32_t& bitfield_bit_size
2220)
2221{
Greg Claytonb01000f2011-01-17 03:46:26 +00002222 if (ast == NULL || field == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00002223 return false;
2224
2225 if (field->isBitField())
2226 {
2227 Expr* bit_width_expr = field->getBitWidth();
2228 if (bit_width_expr)
2229 {
2230 llvm::APSInt bit_width_apsint;
Greg Claytonb01000f2011-01-17 03:46:26 +00002231 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner24943d22010-06-08 16:52:24 +00002232 {
2233 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
2234 return true;
2235 }
2236 }
2237 }
2238 return false;
2239}
2240
2241bool
2242ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
2243{
2244 if (record_decl == NULL)
2245 return false;
2246
2247 if (!record_decl->field_empty())
2248 return true;
2249
2250 // No fields, lets check this is a CXX record and check the base classes
2251 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2252 if (cxx_record_decl)
2253 {
2254 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2255 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2256 base_class != base_class_end;
2257 ++base_class)
2258 {
2259 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2260 if (RecordHasFields(base_class_decl))
2261 return true;
2262 }
2263 }
2264 return false;
2265}
2266
2267void
Greg Claytonb01000f2011-01-17 03:46:26 +00002268ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
Chris Lattner24943d22010-06-08 16:52:24 +00002269{
Greg Claytonb01000f2011-01-17 03:46:26 +00002270 if (clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00002271 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002272 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2273
Sean Callanand5b3c352011-01-27 04:42:51 +00002274 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
Greg Claytonb01000f2011-01-17 03:46:26 +00002275 if (record_type)
Chris Lattner24943d22010-06-08 16:52:24 +00002276 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002277 RecordDecl *record_decl = record_type->getDecl();
2278 if (record_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00002279 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002280 uint32_t field_idx;
2281 RecordDecl::field_iterator field, field_end;
2282 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2283 field != field_end;
2284 ++field, ++field_idx)
Chris Lattner24943d22010-06-08 16:52:24 +00002285 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002286 // If no accessibility was assigned, assign the correct one
2287 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2288 field->setAccess ((AccessSpecifier)default_accessibility);
Chris Lattner24943d22010-06-08 16:52:24 +00002289 }
2290 }
2291 }
2292 }
2293}
2294
2295#pragma mark C++ Base Classes
2296
2297CXXBaseSpecifier *
Greg Clayton462d4142010-09-29 01:12:09 +00002298ClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
Chris Lattner24943d22010-06-08 16:52:24 +00002299{
2300 if (base_class_type)
Greg Clayton6e713402010-07-30 20:30:44 +00002301 return new CXXBaseSpecifier (SourceRange(),
2302 is_virtual,
2303 base_of_class,
2304 ConvertAccessTypeToAccessSpecifier (access),
Sean Callanand9c7d402013-03-12 21:22:00 +00002305 getASTContext()->getTrivialTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
Sean Callananad293092011-01-18 23:32:05 +00002306 SourceLocation());
Chris Lattner24943d22010-06-08 16:52:24 +00002307 return NULL;
2308}
2309
Greg Claytone9d0df42010-07-02 01:29:13 +00002310void
2311ClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
2312{
2313 for (unsigned i=0; i<num_base_classes; ++i)
2314 {
2315 delete base_classes[i];
2316 base_classes[i] = NULL;
2317 }
2318}
2319
Chris Lattner24943d22010-06-08 16:52:24 +00002320bool
Greg Clayton462d4142010-09-29 01:12:09 +00002321ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
Chris Lattner24943d22010-06-08 16:52:24 +00002322{
2323 if (class_clang_type)
2324 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002325 CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
2326 if (cxx_record_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00002327 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002328 cxx_record_decl->setBases(base_classes, num_base_classes);
2329 return true;
Chris Lattner24943d22010-06-08 16:52:24 +00002330 }
2331 }
2332 return false;
2333}
Greg Clayton84f80752010-07-22 18:30:50 +00002334#pragma mark Objective C Classes
Chris Lattner24943d22010-06-08 16:52:24 +00002335
Greg Clayton462d4142010-09-29 01:12:09 +00002336clang_type_t
Sean Callanana4974db2012-04-18 01:06:17 +00002337ClangASTContext::CreateObjCClass
Greg Clayton84f80752010-07-22 18:30:50 +00002338(
2339 const char *name,
2340 DeclContext *decl_ctx,
2341 bool isForwardDecl,
Sean Callanana4974db2012-04-18 01:06:17 +00002342 bool isInternal,
Jim Inghama32c5a52012-10-27 02:54:13 +00002343 ClangASTMetadata *metadata
Greg Clayton84f80752010-07-22 18:30:50 +00002344)
2345{
Greg Claytonb01000f2011-01-17 03:46:26 +00002346 ASTContext *ast = getASTContext();
2347 assert (ast != NULL);
Greg Clayton84f80752010-07-22 18:30:50 +00002348 assert (name && name[0]);
2349 if (decl_ctx == NULL)
Greg Claytonb01000f2011-01-17 03:46:26 +00002350 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton84f80752010-07-22 18:30:50 +00002351
2352 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
2353 // we will need to update this code. I was told to currently always use
2354 // the CXXRecordDecl class since we often don't know from debug information
2355 // if something is struct or a class, so we default to always use the more
2356 // complete definition just in case.
Greg Claytonb01000f2011-01-17 03:46:26 +00002357 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton84f80752010-07-22 18:30:50 +00002358 decl_ctx,
2359 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00002360 &ast->Idents.get(name),
Sean Callanan8f2e3922012-02-04 08:49:35 +00002361 NULL,
Greg Clayton84f80752010-07-22 18:30:50 +00002362 SourceLocation(),
Sean Callanan8f2e3922012-02-04 08:49:35 +00002363 /*isForwardDecl,*/
Greg Clayton84f80752010-07-22 18:30:50 +00002364 isInternal);
Greg Clayton9488b742010-07-28 02:04:09 +00002365
Jim Inghama32c5a52012-10-27 02:54:13 +00002366 if (decl && metadata)
Greg Clayton017c16a2013-03-27 01:48:02 +00002367 SetMetadata(ast, decl, *metadata);
Sean Callanana4974db2012-04-18 01:06:17 +00002368
Greg Claytonb01000f2011-01-17 03:46:26 +00002369 return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
Greg Clayton84f80752010-07-22 18:30:50 +00002370}
2371
2372bool
Greg Clayton462d4142010-09-29 01:12:09 +00002373ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
Greg Clayton84f80752010-07-22 18:30:50 +00002374{
2375 if (class_opaque_type && super_opaque_type)
2376 {
2377 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2378 QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
Sean Callanand5b3c352011-01-27 04:42:51 +00002379 const clang::Type *class_type = class_qual_type.getTypePtr();
2380 const clang::Type *super_type = super_qual_type.getTypePtr();
Greg Clayton84f80752010-07-22 18:30:50 +00002381 if (class_type && super_type)
2382 {
Sean Callanand5b3c352011-01-27 04:42:51 +00002383 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2384 const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
Greg Clayton84f80752010-07-22 18:30:50 +00002385 if (objc_class_type && objc_super_type)
2386 {
2387 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2388 ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
2389 if (class_interface_decl && super_interface_decl)
2390 {
2391 class_interface_decl->setSuperClass(super_interface_decl);
2392 return true;
2393 }
2394 }
2395 }
2396 }
2397 return false;
2398}
2399
2400
Jim Ingham2546fd22011-11-12 01:36:43 +00002401FieldDecl *
Greg Clayton84f80752010-07-22 18:30:50 +00002402ClangASTContext::AddObjCClassIVar
2403(
Greg Claytonb01000f2011-01-17 03:46:26 +00002404 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00002405 clang_type_t class_opaque_type,
Greg Clayton84f80752010-07-22 18:30:50 +00002406 const char *name,
Greg Clayton462d4142010-09-29 01:12:09 +00002407 clang_type_t ivar_opaque_type,
Greg Clayton84f80752010-07-22 18:30:50 +00002408 AccessType access,
2409 uint32_t bitfield_bit_size,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002410 bool is_synthesized
Greg Clayton84f80752010-07-22 18:30:50 +00002411)
2412{
2413 if (class_opaque_type == NULL || ivar_opaque_type == NULL)
Jim Ingham2546fd22011-11-12 01:36:43 +00002414 return NULL;
Greg Clayton84f80752010-07-22 18:30:50 +00002415
Jim Ingham2546fd22011-11-12 01:36:43 +00002416 ObjCIvarDecl *field = NULL;
2417
Greg Claytonb01000f2011-01-17 03:46:26 +00002418 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton84f80752010-07-22 18:30:50 +00002419
Greg Claytonb01000f2011-01-17 03:46:26 +00002420 assert (ast != NULL);
Greg Clayton84f80752010-07-22 18:30:50 +00002421 assert (identifier_table != NULL);
2422
2423 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2424
Sean Callanand5b3c352011-01-27 04:42:51 +00002425 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton84f80752010-07-22 18:30:50 +00002426 if (class_type)
2427 {
Sean Callanand5b3c352011-01-27 04:42:51 +00002428 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton84f80752010-07-22 18:30:50 +00002429
2430 if (objc_class_type)
2431 {
2432 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2433
2434 if (class_interface_decl)
2435 {
2436 clang::Expr *bit_width = NULL;
2437 if (bitfield_bit_size != 0)
2438 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002439 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
2440 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Greg Clayton84f80752010-07-22 18:30:50 +00002441 }
2442
Jim Ingham2546fd22011-11-12 01:36:43 +00002443 field = ObjCIvarDecl::Create (*ast,
2444 class_interface_decl,
2445 SourceLocation(),
2446 SourceLocation(),
Greg Claytonf270fa92012-11-06 00:20:41 +00002447 name ? &identifier_table->get(name) : NULL, // Identifier
Jim Ingham2546fd22011-11-12 01:36:43 +00002448 QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
2449 NULL, // TypeSourceInfo *
2450 ConvertAccessTypeToObjCIvarAccessControl (access),
2451 bit_width,
2452 is_synthesized);
Greg Clayton9488b742010-07-28 02:04:09 +00002453
2454 if (field)
2455 {
2456 class_interface_decl->addDecl(field);
Sean Callananc6d161e2011-10-26 01:06:27 +00002457
2458#ifdef LLDB_CONFIGURATION_DEBUG
2459 VerifyDecl(field);
2460#endif
2461
Jim Ingham2546fd22011-11-12 01:36:43 +00002462 return field;
Greg Clayton9488b742010-07-28 02:04:09 +00002463 }
Greg Clayton84f80752010-07-22 18:30:50 +00002464 }
2465 }
2466 }
Jim Ingham2546fd22011-11-12 01:36:43 +00002467 return NULL;
2468}
2469
2470bool
2471ClangASTContext::AddObjCClassProperty
2472(
2473 ASTContext *ast,
2474 clang_type_t class_opaque_type,
2475 const char *property_name,
2476 clang_type_t property_opaque_type,
2477 ObjCIvarDecl *ivar_decl,
2478 const char *property_setter_name,
2479 const char *property_getter_name,
Sean Callanana4974db2012-04-18 01:06:17 +00002480 uint32_t property_attributes,
Jim Inghama32c5a52012-10-27 02:54:13 +00002481 ClangASTMetadata *metadata
Jim Ingham2546fd22011-11-12 01:36:43 +00002482)
2483{
Sean Callananda81dae2011-12-09 23:24:26 +00002484 if (class_opaque_type == NULL || property_name == NULL || property_name[0] == '\0')
Jim Ingham2546fd22011-11-12 01:36:43 +00002485 return false;
2486
2487 IdentifierTable *identifier_table = &ast->Idents;
2488
2489 assert (ast != NULL);
2490 assert (identifier_table != NULL);
2491
2492 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2493 const clang::Type *class_type = class_qual_type.getTypePtr();
2494 if (class_type)
2495 {
2496 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2497
2498 if (objc_class_type)
2499 {
2500 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2501
Greg Clayton4a379b12012-07-17 03:23:13 +00002502 clang_type_t property_opaque_type_to_access = NULL;
Sean Callananda81dae2011-12-09 23:24:26 +00002503
2504 if (property_opaque_type)
2505 property_opaque_type_to_access = property_opaque_type;
2506 else if (ivar_decl)
2507 property_opaque_type_to_access = ivar_decl->getType().getAsOpaquePtr();
2508
Sean Callananda81dae2011-12-09 23:24:26 +00002509 if (class_interface_decl && property_opaque_type_to_access)
Jim Ingham2546fd22011-11-12 01:36:43 +00002510 {
2511 clang::TypeSourceInfo *prop_type_source;
2512 if (ivar_decl)
Sean Callanand9c7d402013-03-12 21:22:00 +00002513 prop_type_source = ast->getTrivialTypeSourceInfo (ivar_decl->getType());
Jim Ingham2546fd22011-11-12 01:36:43 +00002514 else
Sean Callanand9c7d402013-03-12 21:22:00 +00002515 prop_type_source = ast->getTrivialTypeSourceInfo (QualType::getFromOpaquePtr(property_opaque_type));
Jim Ingham2546fd22011-11-12 01:36:43 +00002516
2517 ObjCPropertyDecl *property_decl = ObjCPropertyDecl::Create(*ast,
2518 class_interface_decl,
2519 SourceLocation(), // Source Location
2520 &identifier_table->get(property_name),
2521 SourceLocation(), //Source Location for AT
Sean Callanan142f94c2012-03-01 02:03:47 +00002522 SourceLocation(), //Source location for (
Jim Ingham2546fd22011-11-12 01:36:43 +00002523 prop_type_source
2524 );
Sean Callanana4974db2012-04-18 01:06:17 +00002525
Sean Callananda81dae2011-12-09 23:24:26 +00002526 if (property_decl)
2527 {
Jim Inghama32c5a52012-10-27 02:54:13 +00002528 if (metadata)
Greg Clayton017c16a2013-03-27 01:48:02 +00002529 SetMetadata(ast, property_decl, *metadata);
Sean Callanana4974db2012-04-18 01:06:17 +00002530
Jim Ingham2546fd22011-11-12 01:36:43 +00002531 class_interface_decl->addDecl (property_decl);
Sean Callananda81dae2011-12-09 23:24:26 +00002532
2533 Selector setter_sel, getter_sel;
2534
Jim Ingham2546fd22011-11-12 01:36:43 +00002535 if (property_setter_name != NULL)
2536 {
2537 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
2538 clang::IdentifierInfo *setter_ident = &identifier_table->get(property_setter_no_colon.c_str());
Sean Callananda81dae2011-12-09 23:24:26 +00002539 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
Jim Ingham2546fd22011-11-12 01:36:43 +00002540 }
Sean Callananda81dae2011-12-09 23:24:26 +00002541 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
2542 {
2543 std::string setter_sel_string("set");
2544 setter_sel_string.push_back(::toupper(property_name[0]));
2545 setter_sel_string.append(&property_name[1]);
2546 clang::IdentifierInfo *setter_ident = &identifier_table->get(setter_sel_string.c_str());
2547 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
2548 }
Sean Callanan8d611562012-04-05 00:12:52 +00002549 property_decl->setSetterName(setter_sel);
2550 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
Jim Ingham2546fd22011-11-12 01:36:43 +00002551
2552 if (property_getter_name != NULL)
2553 {
2554 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_getter_name);
Sean Callananda81dae2011-12-09 23:24:26 +00002555 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Sean Callananda81dae2011-12-09 23:24:26 +00002556 }
2557 else
2558 {
2559 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_name);
2560 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Jim Ingham2546fd22011-11-12 01:36:43 +00002561 }
Sean Callanan8d611562012-04-05 00:12:52 +00002562 property_decl->setGetterName(getter_sel);
2563 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
Jim Ingham2546fd22011-11-12 01:36:43 +00002564
2565 if (ivar_decl)
2566 property_decl->setPropertyIvarDecl (ivar_decl);
2567
2568 if (property_attributes & DW_APPLE_PROPERTY_readonly)
2569 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
2570 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
2571 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
2572 if (property_attributes & DW_APPLE_PROPERTY_assign)
2573 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
2574 if (property_attributes & DW_APPLE_PROPERTY_retain)
2575 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
2576 if (property_attributes & DW_APPLE_PROPERTY_copy)
2577 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
2578 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
2579 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
Sean Callananda81dae2011-12-09 23:24:26 +00002580
2581 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
2582 {
2583 QualType result_type = QualType::getFromOpaquePtr(property_opaque_type_to_access);
2584
2585 const bool isInstance = true;
2586 const bool isVariadic = false;
2587 const bool isSynthesized = false;
2588 const bool isImplicitlyDeclared = true;
2589 const bool isDefined = false;
2590 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2591 const bool HasRelatedResultType = false;
2592
2593 ObjCMethodDecl *getter = ObjCMethodDecl::Create(*ast,
2594 SourceLocation(),
2595 SourceLocation(),
2596 getter_sel,
2597 result_type,
2598 NULL,
2599 class_interface_decl,
2600 isInstance,
2601 isVariadic,
2602 isSynthesized,
2603 isImplicitlyDeclared,
2604 isDefined,
2605 impControl,
2606 HasRelatedResultType);
Sean Callanana4974db2012-04-18 01:06:17 +00002607
Jim Inghama32c5a52012-10-27 02:54:13 +00002608 if (getter && metadata)
Greg Clayton017c16a2013-03-27 01:48:02 +00002609 SetMetadata(ast, getter, *metadata);
Sean Callananda81dae2011-12-09 23:24:26 +00002610
2611 getter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(), ArrayRef<SourceLocation>());
2612
2613 class_interface_decl->addDecl(getter);
2614 }
2615
2616 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
2617 {
2618 QualType result_type = ast->VoidTy;
2619
2620 const bool isInstance = true;
2621 const bool isVariadic = false;
2622 const bool isSynthesized = false;
2623 const bool isImplicitlyDeclared = true;
2624 const bool isDefined = false;
2625 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2626 const bool HasRelatedResultType = false;
2627
2628 ObjCMethodDecl *setter = ObjCMethodDecl::Create(*ast,
2629 SourceLocation(),
2630 SourceLocation(),
2631 setter_sel,
2632 result_type,
2633 NULL,
2634 class_interface_decl,
2635 isInstance,
2636 isVariadic,
2637 isSynthesized,
2638 isImplicitlyDeclared,
2639 isDefined,
2640 impControl,
2641 HasRelatedResultType);
2642
Jim Inghama32c5a52012-10-27 02:54:13 +00002643 if (setter && metadata)
Greg Clayton017c16a2013-03-27 01:48:02 +00002644 SetMetadata(ast, setter, *metadata);
Sean Callanana4974db2012-04-18 01:06:17 +00002645
Sean Callananda81dae2011-12-09 23:24:26 +00002646 llvm::SmallVector<ParmVarDecl *, 1> params;
2647
2648 params.push_back (ParmVarDecl::Create (*ast,
2649 setter,
2650 SourceLocation(),
2651 SourceLocation(),
2652 NULL, // anonymous
2653 QualType::getFromOpaquePtr(property_opaque_type_to_access),
2654 NULL,
Sean Callananda81dae2011-12-09 23:24:26 +00002655 SC_Auto,
2656 NULL));
2657
2658 setter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
2659
2660 class_interface_decl->addDecl(setter);
2661 }
Jim Ingham2546fd22011-11-12 01:36:43 +00002662
2663 return true;
Sean Callananda81dae2011-12-09 23:24:26 +00002664 }
Jim Ingham2546fd22011-11-12 01:36:43 +00002665 }
2666 }
2667 }
Greg Clayton84f80752010-07-22 18:30:50 +00002668 return false;
2669}
Chris Lattner24943d22010-06-08 16:52:24 +00002670
Greg Clayton9488b742010-07-28 02:04:09 +00002671bool
Greg Clayton462d4142010-09-29 01:12:09 +00002672ClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
Greg Clayton9488b742010-07-28 02:04:09 +00002673{
2674 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2675
Sean Callanand5b3c352011-01-27 04:42:51 +00002676 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton9488b742010-07-28 02:04:09 +00002677 if (class_type)
2678 {
Sean Callanand5b3c352011-01-27 04:42:51 +00002679 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton9488b742010-07-28 02:04:09 +00002680
2681 if (objc_class_type)
2682 return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
2683 }
2684 return false;
2685}
2686
2687bool
2688ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
2689{
2690 while (class_interface_decl)
2691 {
2692 if (class_interface_decl->ivar_size() > 0)
2693 return true;
2694
2695 if (check_superclass)
2696 class_interface_decl = class_interface_decl->getSuperClass();
2697 else
2698 break;
2699 }
2700 return false;
2701}
Greg Clayton1d8173f2010-09-24 05:15:53 +00002702
Greg Clayton462d4142010-09-29 01:12:09 +00002703ObjCMethodDecl *
Greg Claytonbe38b452013-03-08 02:42:06 +00002704ClangASTContext::AddMethodToObjCObjectType (ASTContext *ast,
2705 clang_type_t class_opaque_type,
2706 const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
2707 clang_type_t method_opaque_type,
2708 lldb::AccessType access,
2709 bool is_artificial)
Greg Clayton1d8173f2010-09-24 05:15:53 +00002710{
2711 if (class_opaque_type == NULL || method_opaque_type == NULL)
2712 return NULL;
2713
Greg Claytonb01000f2011-01-17 03:46:26 +00002714 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002715
Greg Claytonb01000f2011-01-17 03:46:26 +00002716 assert (ast != NULL);
Greg Clayton1d8173f2010-09-24 05:15:53 +00002717 assert (identifier_table != NULL);
2718
2719 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2720
Sean Callanand5b3c352011-01-27 04:42:51 +00002721 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton1d8173f2010-09-24 05:15:53 +00002722 if (class_type == NULL)
2723 return NULL;
2724
Sean Callanand5b3c352011-01-27 04:42:51 +00002725 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton1d8173f2010-09-24 05:15:53 +00002726
2727 if (objc_class_type == NULL)
2728 return NULL;
2729
2730 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2731
2732 if (class_interface_decl == NULL)
2733 return NULL;
Greg Clayton9488b742010-07-28 02:04:09 +00002734
Greg Clayton1d8173f2010-09-24 05:15:53 +00002735 const char *selector_start = ::strchr (name, ' ');
2736 if (selector_start == NULL)
2737 return NULL;
2738
2739 selector_start++;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002740 llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
2741
Greg Claytonad60bf42010-10-12 02:24:53 +00002742 size_t len = 0;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002743 const char *start;
Greg Claytonad60bf42010-10-12 02:24:53 +00002744 //printf ("name = '%s'\n", name);
2745
2746 unsigned num_selectors_with_args = 0;
2747 for (start = selector_start;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002748 start && *start != '\0' && *start != ']';
Greg Claytonad60bf42010-10-12 02:24:53 +00002749 start += len)
Greg Clayton1d8173f2010-09-24 05:15:53 +00002750 {
Greg Claytonad60bf42010-10-12 02:24:53 +00002751 len = ::strcspn(start, ":]");
Greg Clayton6bc44a42010-10-27 04:01:14 +00002752 bool has_arg = (start[len] == ':');
2753 if (has_arg)
Greg Claytonad60bf42010-10-12 02:24:53 +00002754 ++num_selectors_with_args;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002755 selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
Greg Clayton6bc44a42010-10-27 04:01:14 +00002756 if (has_arg)
2757 len += 1;
Greg Clayton1d8173f2010-09-24 05:15:53 +00002758 }
2759
2760
2761 if (selector_idents.size() == 0)
2762 return 0;
2763
Greg Claytonb01000f2011-01-17 03:46:26 +00002764 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002765 selector_idents.data());
2766
2767 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
2768
2769 // Populate the method decl with parameter decls
Sean Callanand5b3c352011-01-27 04:42:51 +00002770 const clang::Type *method_type(method_qual_type.getTypePtr());
Greg Clayton1d8173f2010-09-24 05:15:53 +00002771
2772 if (method_type == NULL)
2773 return NULL;
2774
Sean Callanand5b3c352011-01-27 04:42:51 +00002775 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
Greg Clayton1d8173f2010-09-24 05:15:53 +00002776
2777 if (!method_function_prototype)
2778 return NULL;
2779
2780
2781 bool is_variadic = false;
2782 bool is_synthesized = false;
2783 bool is_defined = false;
2784 ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
2785
2786 const unsigned num_args = method_function_prototype->getNumArgs();
Sean Callanan4a584562013-02-06 23:21:59 +00002787
2788 if (num_args != num_selectors_with_args)
2789 return NULL; // some debug information is corrupt. We are not going to deal with it.
Greg Clayton1d8173f2010-09-24 05:15:53 +00002790
Greg Claytonb01000f2011-01-17 03:46:26 +00002791 ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002792 SourceLocation(), // beginLoc,
2793 SourceLocation(), // endLoc,
2794 method_selector,
2795 method_function_prototype->getResultType(),
2796 NULL, // TypeSourceInfo *ResultTInfo,
2797 GetDeclContextForType (class_opaque_type),
2798 name[0] == '-',
2799 is_variadic,
2800 is_synthesized,
Sean Callanan62afa492013-03-09 01:59:31 +00002801 true, // is_implicitly_declared; we force this to true because we don't have source locations
Greg Clayton1d8173f2010-09-24 05:15:53 +00002802 is_defined,
2803 imp_control,
Sean Callananc1535182011-10-07 23:18:13 +00002804 false /*has_related_result_type*/);
Greg Clayton1d8173f2010-09-24 05:15:53 +00002805
2806
2807 if (objc_method_decl == NULL)
2808 return NULL;
2809
2810 if (num_args > 0)
2811 {
2812 llvm::SmallVector<ParmVarDecl *, 12> params;
2813
2814 for (int param_index = 0; param_index < num_args; ++param_index)
2815 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002816 params.push_back (ParmVarDecl::Create (*ast,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002817 objc_method_decl,
2818 SourceLocation(),
Sean Callanan279584c2011-03-15 00:17:19 +00002819 SourceLocation(),
Greg Clayton1d8173f2010-09-24 05:15:53 +00002820 NULL, // anonymous
2821 method_function_prototype->getArgType(param_index),
2822 NULL,
Greg Clayton1d8173f2010-09-24 05:15:53 +00002823 SC_Auto,
2824 NULL));
2825 }
2826
Sean Callananc1535182011-10-07 23:18:13 +00002827 objc_method_decl->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
Greg Clayton1d8173f2010-09-24 05:15:53 +00002828 }
2829
2830 class_interface_decl->addDecl (objc_method_decl);
2831
Sean Callananc6d161e2011-10-26 01:06:27 +00002832#ifdef LLDB_CONFIGURATION_DEBUG
2833 VerifyDecl(objc_method_decl);
2834#endif
Greg Clayton1d8173f2010-09-24 05:15:53 +00002835
2836 return objc_method_decl;
2837}
2838
Greg Clayton3eeaf6e2012-02-03 01:30:30 +00002839size_t
2840ClangASTContext::GetNumTemplateArguments (clang::ASTContext *ast, clang_type_t clang_type)
2841{
2842 if (clang_type)
2843 {
2844 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2845
2846 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2847 switch (type_class)
2848 {
2849 case clang::Type::Record:
2850 if (GetCompleteQualType (ast, qual_type))
2851 {
2852 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2853 if (cxx_record_decl)
2854 {
2855 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
2856 if (template_decl)
2857 return template_decl->getTemplateArgs().size();
2858 }
2859 }
2860 break;
2861
2862 case clang::Type::Typedef:
2863 return ClangASTContext::GetNumTemplateArguments (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Greg Clayton19b64672013-01-04 18:10:18 +00002864
2865 case clang::Type::Elaborated:
2866 return ClangASTContext::GetNumTemplateArguments (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2867
Greg Clayton3eeaf6e2012-02-03 01:30:30 +00002868 default:
2869 break;
2870 }
2871 }
2872 return 0;
2873}
2874
2875clang_type_t
2876ClangASTContext::GetTemplateArgument (clang::ASTContext *ast, clang_type_t clang_type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
2877{
2878 if (clang_type)
2879 {
2880 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2881
2882 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2883 switch (type_class)
2884 {
2885 case clang::Type::Record:
2886 if (GetCompleteQualType (ast, qual_type))
2887 {
2888 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2889 if (cxx_record_decl)
2890 {
2891 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
2892 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
2893 {
2894 const TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
2895 switch (template_arg.getKind())
2896 {
2897 case clang::TemplateArgument::Null:
2898 kind = eTemplateArgumentKindNull;
2899 return NULL;
2900
2901 case clang::TemplateArgument::Type:
2902 kind = eTemplateArgumentKindType;
2903 return template_arg.getAsType().getAsOpaquePtr();
2904
2905 case clang::TemplateArgument::Declaration:
2906 kind = eTemplateArgumentKindDeclaration;
2907 return NULL;
2908
2909 case clang::TemplateArgument::Integral:
2910 kind = eTemplateArgumentKindIntegral;
2911 return template_arg.getIntegralType().getAsOpaquePtr();
2912
2913 case clang::TemplateArgument::Template:
2914 kind = eTemplateArgumentKindTemplate;
2915 return NULL;
2916
2917 case clang::TemplateArgument::TemplateExpansion:
2918 kind = eTemplateArgumentKindTemplateExpansion;
2919 return NULL;
2920
2921 case clang::TemplateArgument::Expression:
2922 kind = eTemplateArgumentKindExpression;
2923 return NULL;
2924
2925 case clang::TemplateArgument::Pack:
2926 kind = eTemplateArgumentKindPack;
2927 return NULL;
2928
2929 default:
2930 assert (!"Unhandled TemplateArgument::ArgKind");
2931 kind = eTemplateArgumentKindNull;
2932 return NULL;
2933 }
2934 }
2935 }
2936 }
2937 break;
2938
2939 case clang::Type::Typedef:
2940 return ClangASTContext::GetTemplateArgument (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), arg_idx, kind);
Greg Clayton19b64672013-01-04 18:10:18 +00002941
2942 case clang::Type::Elaborated:
2943 return ClangASTContext::GetTemplateArgument (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), arg_idx, kind);
2944
Greg Clayton3eeaf6e2012-02-03 01:30:30 +00002945 default:
2946 break;
2947 }
2948 }
2949 kind = eTemplateArgumentKindNull;
2950 return NULL;
2951}
Greg Clayton1d8173f2010-09-24 05:15:53 +00002952
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002953uint32_t
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002954ClangASTContext::GetTypeInfo
2955(
2956 clang_type_t clang_type,
Greg Claytonb01000f2011-01-17 03:46:26 +00002957 clang::ASTContext *ast,
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002958 clang_type_t *pointee_or_element_clang_type
2959)
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002960{
2961 if (clang_type == NULL)
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002962 return 0;
2963
2964 if (pointee_or_element_clang_type)
2965 *pointee_or_element_clang_type = NULL;
Greg Claytonbf8e42b2010-10-14 22:52:14 +00002966
2967 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2968
2969 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2970 switch (type_class)
2971 {
Sean Callanan04325062010-10-25 00:29:48 +00002972 case clang::Type::Builtin:
Sean Callanan04325062010-10-25 00:29:48 +00002973 {
Greg Claytonf95fc9e2013-04-05 23:27:21 +00002974 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00002975
Greg Claytonf95fc9e2013-04-05 23:27:21 +00002976 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
2977 switch (builtin_type->getKind())
2978 {
2979 case clang::BuiltinType::ObjCId:
2980 case clang::BuiltinType::ObjCClass:
2981 if (ast && pointee_or_element_clang_type)
2982 *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
2983 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
2984 break;
2985
2986 case clang::BuiltinType::ObjCSel:
2987 case clang::BuiltinType::Bool:
2988 case clang::BuiltinType::Char_U:
2989 case clang::BuiltinType::UChar:
2990 case clang::BuiltinType::WChar_U:
2991 case clang::BuiltinType::Char16:
2992 case clang::BuiltinType::Char32:
2993 case clang::BuiltinType::UShort:
2994 case clang::BuiltinType::UInt:
2995 case clang::BuiltinType::ULong:
2996 case clang::BuiltinType::ULongLong:
2997 case clang::BuiltinType::UInt128:
2998 case clang::BuiltinType::Char_S:
2999 case clang::BuiltinType::SChar:
3000 case clang::BuiltinType::WChar_S:
3001 case clang::BuiltinType::Short:
3002 case clang::BuiltinType::Int:
3003 case clang::BuiltinType::Long:
3004 case clang::BuiltinType::LongLong:
3005 case clang::BuiltinType::Int128:
3006 case clang::BuiltinType::Float:
3007 case clang::BuiltinType::Double:
3008 case clang::BuiltinType::LongDouble:
3009 builtin_type_flags |= eTypeIsScalar;
3010 if (builtin_type->isInteger())
3011 {
3012 builtin_type_flags |= eTypeIsInteger;
3013 if (builtin_type->isSignedInteger())
3014 builtin_type_flags |= eTypeIsSigned;
3015 }
3016 else if (builtin_type->isFloatingPoint())
3017 builtin_type_flags |= eTypeIsFloat;
3018 break;
3019 default:
3020 break;
3021 }
3022 return builtin_type_flags;
3023 }
3024
3025 case clang::Type::BlockPointer:
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003026 if (pointee_or_element_clang_type)
3027 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
3028 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3029
Greg Claytonf95fc9e2013-04-05 23:27:21 +00003030 case clang::Type::Complex:
3031 {
3032 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3033 const ComplexType *complex_type = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal());
3034 if (complex_type)
3035 {
3036 QualType complex_element_type (complex_type->getElementType());
3037 if (complex_element_type->isIntegerType())
3038 complex_type_flags |= eTypeIsFloat;
3039 else if (complex_element_type->isFloatingType())
3040 complex_type_flags |= eTypeIsInteger;
3041 }
3042 return complex_type_flags;
3043 }
3044 break;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003045
3046 case clang::Type::ConstantArray:
3047 case clang::Type::DependentSizedArray:
3048 case clang::Type::IncompleteArray:
3049 case clang::Type::VariableArray:
3050 if (pointee_or_element_clang_type)
3051 *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
3052 return eTypeHasChildren | eTypeIsArray;
3053
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003054 case clang::Type::DependentName: return 0;
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003055 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
3056 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
3057 case clang::Type::Decltype: return 0;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003058
3059 case clang::Type::Enum:
3060 if (pointee_or_element_clang_type)
3061 *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
3062 return eTypeIsEnumeration | eTypeHasValue;
3063
Sean Callananc6139712011-08-11 23:56:13 +00003064 case clang::Type::Elaborated:
3065 return ClangASTContext::GetTypeInfo (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3066 ast,
3067 pointee_or_element_clang_type);
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003068 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
3069 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003070 case clang::Type::InjectedClassName: return 0;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003071
3072 case clang::Type::LValueReference:
3073 case clang::Type::RValueReference:
3074 if (pointee_or_element_clang_type)
3075 *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
3076 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3077
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003078 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003079
3080 case clang::Type::ObjCObjectPointer:
3081 if (pointee_or_element_clang_type)
3082 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
3083 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
3084
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003085 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3086 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003087
3088 case clang::Type::Pointer:
3089 if (pointee_or_element_clang_type)
3090 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
3091 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3092
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003093 case clang::Type::Record:
3094 if (qual_type->getAsCXXRecordDecl())
3095 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3096 else
3097 return eTypeHasChildren | eTypeIsStructUnion;
3098 break;
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003099 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
3100 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
3101 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003102
3103 case clang::Type::Typedef:
Sean Callanan9e7958e2010-12-13 01:26:27 +00003104 return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Greg Claytonb01000f2011-01-17 03:46:26 +00003105 ast,
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003106 pointee_or_element_clang_type);
3107
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003108 case clang::Type::TypeOfExpr: return 0;
3109 case clang::Type::TypeOf: return 0;
3110 case clang::Type::UnresolvedUsing: return 0;
Greg Claytonf95fc9e2013-04-05 23:27:21 +00003111
3112 case clang::Type::ExtVector:
3113 case clang::Type::Vector:
3114 {
3115 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
3116 const VectorType *vector_type = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal());
3117 if (vector_type)
3118 {
3119 if (vector_type->isIntegerType())
3120 vector_type_flags |= eTypeIsFloat;
3121 else if (vector_type->isFloatingType())
3122 vector_type_flags |= eTypeIsInteger;
3123 }
3124 return vector_type_flags;
3125 }
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003126 default: return 0;
3127 }
3128 return 0;
3129}
3130
Greg Clayton9488b742010-07-28 02:04:09 +00003131
Chris Lattner24943d22010-06-08 16:52:24 +00003132#pragma mark Aggregate Types
3133
3134bool
Greg Clayton462d4142010-09-29 01:12:09 +00003135ClangASTContext::IsAggregateType (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00003136{
3137 if (clang_type == NULL)
3138 return false;
3139
3140 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3141
Greg Clayton03e0f972010-09-13 03:32:57 +00003142 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3143 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00003144 {
Greg Clayton1674b122010-07-21 22:12:05 +00003145 case clang::Type::IncompleteArray:
3146 case clang::Type::VariableArray:
3147 case clang::Type::ConstantArray:
3148 case clang::Type::ExtVector:
3149 case clang::Type::Vector:
3150 case clang::Type::Record:
Greg Clayton9488b742010-07-28 02:04:09 +00003151 case clang::Type::ObjCObject:
3152 case clang::Type::ObjCInterface:
Chris Lattner24943d22010-06-08 16:52:24 +00003153 return true;
Sean Callananc6139712011-08-11 23:56:13 +00003154 case clang::Type::Elaborated:
3155 return ClangASTContext::IsAggregateType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton1674b122010-07-21 22:12:05 +00003156 case clang::Type::Typedef:
Sean Callanan9e7958e2010-12-13 01:26:27 +00003157 return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00003158
3159 default:
3160 break;
3161 }
3162 // The clang type does have a value
3163 return false;
3164}
3165
3166uint32_t
Greg Claytonb01000f2011-01-17 03:46:26 +00003167ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
Chris Lattner24943d22010-06-08 16:52:24 +00003168{
Greg Claytonb01000f2011-01-17 03:46:26 +00003169 if (clang_type == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00003170 return 0;
3171
3172 uint32_t num_children = 0;
Greg Claytonb01000f2011-01-17 03:46:26 +00003173 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9488b742010-07-28 02:04:09 +00003174 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3175 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00003176 {
Greg Clayton960d6a42010-08-03 00:35:52 +00003177 case clang::Type::Builtin:
3178 switch (cast<clang::BuiltinType>(qual_type)->getKind())
3179 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003180 case clang::BuiltinType::ObjCId: // child is Class
Greg Clayton960d6a42010-08-03 00:35:52 +00003181 case clang::BuiltinType::ObjCClass: // child is Class
Greg Clayton960d6a42010-08-03 00:35:52 +00003182 num_children = 1;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003183 break;
Greg Clayton960d6a42010-08-03 00:35:52 +00003184
3185 default:
3186 break;
3187 }
3188 break;
Greg Claytonc3b61d22010-12-15 05:08:08 +00003189
Greg Claytone52f37b2011-01-15 02:52:14 +00003190 case clang::Type::Complex: return 0;
Greg Claytonc3b61d22010-12-15 05:08:08 +00003191
Greg Clayton1674b122010-07-21 22:12:05 +00003192 case clang::Type::Record:
Greg Clayton7a183dc2011-01-20 04:18:48 +00003193 if (GetCompleteQualType (ast, qual_type))
Chris Lattner24943d22010-06-08 16:52:24 +00003194 {
3195 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3196 const RecordDecl *record_decl = record_type->getDecl();
3197 assert(record_decl);
3198 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3199 if (cxx_record_decl)
3200 {
3201 if (omit_empty_base_classes)
3202 {
3203 // Check each base classes to see if it or any of its
3204 // base classes contain any fields. This can help
3205 // limit the noise in variable views by not having to
3206 // show base classes that contain no members.
3207 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3208 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3209 base_class != base_class_end;
3210 ++base_class)
3211 {
3212 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3213
3214 // Skip empty base classes
3215 if (RecordHasFields(base_class_decl) == false)
3216 continue;
3217
3218 num_children++;
3219 }
3220 }
3221 else
3222 {
3223 // Include all base classes
3224 num_children += cxx_record_decl->getNumBases();
3225 }
3226
3227 }
3228 RecordDecl::field_iterator field, field_end;
3229 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
3230 ++num_children;
3231 }
3232 break;
3233
Greg Clayton9488b742010-07-28 02:04:09 +00003234 case clang::Type::ObjCObject:
3235 case clang::Type::ObjCInterface:
Greg Clayton7a183dc2011-01-20 04:18:48 +00003236 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9488b742010-07-28 02:04:09 +00003237 {
Sean Callanand5b3c352011-01-27 04:42:51 +00003238 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00003239 assert (objc_class_type);
3240 if (objc_class_type)
3241 {
3242 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3243
3244 if (class_interface_decl)
3245 {
3246
3247 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3248 if (superclass_interface_decl)
3249 {
3250 if (omit_empty_base_classes)
3251 {
3252 if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
3253 ++num_children;
3254 }
3255 else
3256 ++num_children;
3257 }
3258
3259 num_children += class_interface_decl->ivar_size();
3260 }
3261 }
3262 }
3263 break;
3264
3265 case clang::Type::ObjCObjectPointer:
Greg Clayton960d6a42010-08-03 00:35:52 +00003266 {
Sean Callanand5b3c352011-01-27 04:42:51 +00003267 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
Greg Clayton960d6a42010-08-03 00:35:52 +00003268 QualType pointee_type = pointer_type->getPointeeType();
Greg Claytonb01000f2011-01-17 03:46:26 +00003269 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
3270 pointee_type.getAsOpaquePtr(),
Greg Clayton960d6a42010-08-03 00:35:52 +00003271 omit_empty_base_classes);
3272 // If this type points to a simple type, then it has 1 child
3273 if (num_pointee_children == 0)
3274 num_children = 1;
3275 else
3276 num_children = num_pointee_children;
3277 }
3278 break;
Greg Clayton9488b742010-07-28 02:04:09 +00003279
Greg Claytonf95fc9e2013-04-05 23:27:21 +00003280 case clang::Type::Vector:
3281 case clang::Type::ExtVector:
3282 num_children = cast<VectorType>(qual_type.getTypePtr())->getNumElements();
3283 break;
3284
Greg Clayton1674b122010-07-21 22:12:05 +00003285 case clang::Type::ConstantArray:
Chris Lattner24943d22010-06-08 16:52:24 +00003286 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
3287 break;
3288
Greg Clayton1674b122010-07-21 22:12:05 +00003289 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00003290 {
Sean Callanand5b3c352011-01-27 04:42:51 +00003291 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Greg Claytonc3b61d22010-12-15 05:08:08 +00003292 QualType pointee_type (pointer_type->getPointeeType());
Greg Claytonb01000f2011-01-17 03:46:26 +00003293 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
3294 pointee_type.getAsOpaquePtr(),
Greg Clayton9488b742010-07-28 02:04:09 +00003295 omit_empty_base_classes);
Chris Lattner24943d22010-06-08 16:52:24 +00003296 if (num_pointee_children == 0)
Greg Claytonc3b61d22010-12-15 05:08:08 +00003297 {
3298 // We have a pointer to a pointee type that claims it has no children.
3299 // We will want to look at
3300 num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
3301 }
Chris Lattner24943d22010-06-08 16:52:24 +00003302 else
3303 num_children = num_pointee_children;
3304 }
3305 break;
3306
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003307 case clang::Type::LValueReference:
3308 case clang::Type::RValueReference:
3309 {
Sean Callanand5b3c352011-01-27 04:42:51 +00003310 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003311 QualType pointee_type = reference_type->getPointeeType();
Greg Claytonb01000f2011-01-17 03:46:26 +00003312 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
3313 pointee_type.getAsOpaquePtr(),
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00003314 omit_empty_base_classes);
3315 // If this type points to a simple type, then it has 1 child
3316 if (num_pointee_children == 0)
3317 num_children = 1;
3318 else
3319 num_children = num_pointee_children;
3320 }
3321 break;
3322
3323
Greg Clayton1674b122010-07-21 22:12:05 +00003324 case clang::Type::Typedef:
Greg Claytonb01000f2011-01-17 03:46:26 +00003325 num_children = ClangASTContext::GetNumChildren (ast,
3326 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3327 omit_empty_base_classes);
Chris Lattner24943d22010-06-08 16:52:24 +00003328 break;
Sean Callananc6139712011-08-11 23:56:13 +00003329
3330 case clang::Type::Elaborated:
3331 num_children = ClangASTContext::GetNumChildren (ast,
3332 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3333 omit_empty_base_classes);
3334 break;
Chris Lattner24943d22010-06-08 16:52:24 +00003335
3336 default:
3337 break;
3338 }
3339 return num_children;
3340}
3341
Greg Claytond68e0892011-09-09 23:04:00 +00003342uint32_t
3343ClangASTContext::GetNumDirectBaseClasses (clang::ASTContext *ast, clang_type_t clang_type)
3344{
3345 if (clang_type == NULL)
3346 return 0;
3347
3348 uint32_t count = 0;
3349 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3350 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3351 switch (type_class)
3352 {
3353 case clang::Type::Record:
3354 if (GetCompleteQualType (ast, qual_type))
3355 {
3356 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3357 if (cxx_record_decl)
3358 count = cxx_record_decl->getNumBases();
3359 }
3360 break;
3361
3362 case clang::Type::ObjCObject:
3363 case clang::Type::ObjCInterface:
3364 if (GetCompleteQualType (ast, qual_type))
3365 {
3366 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
3367 if (objc_class_type)
3368 {
3369 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3370
3371 if (class_interface_decl && class_interface_decl->getSuperClass())
3372 count = 1;
3373 }
3374 }
3375 break;
3376
3377
3378 case clang::Type::Typedef:
3379 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3380 break;
3381
3382 case clang::Type::Elaborated:
3383 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3384 break;
3385
3386 default:
3387 break;
3388 }
3389 return count;
3390}
3391
3392uint32_t
3393ClangASTContext::GetNumVirtualBaseClasses (clang::ASTContext *ast,
3394 clang_type_t clang_type)
3395{
3396 if (clang_type == NULL)
3397 return 0;
3398
3399 uint32_t count = 0;
3400 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3401 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3402 switch (type_class)
3403 {
3404 case clang::Type::Record:
3405 if (GetCompleteQualType (ast, qual_type))
3406 {
3407 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3408 if (cxx_record_decl)
3409 count = cxx_record_decl->getNumVBases();
3410 }
3411 break;
3412
3413 case clang::Type::Typedef:
3414 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3415 break;
3416
3417 case clang::Type::Elaborated:
3418 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3419 break;
3420
3421 default:
3422 break;
3423 }
3424 return count;
3425}
3426
3427uint32_t
3428ClangASTContext::GetNumFields (clang::ASTContext *ast, clang_type_t clang_type)
3429{
3430 if (clang_type == NULL)
3431 return 0;
3432
3433 uint32_t count = 0;
3434 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3435 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3436 switch (type_class)
3437 {
3438 case clang::Type::Record:
3439 if (GetCompleteQualType (ast, qual_type))
3440 {
3441 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
3442 if (record_type)
3443 {
3444 RecordDecl *record_decl = record_type->getDecl();
3445 if (record_decl)
3446 {
3447 uint32_t field_idx = 0;
3448 RecordDecl::field_iterator field, field_end;
3449 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
3450 ++field_idx;
3451 count = field_idx;
3452 }
3453 }
3454 }
3455 break;
3456
3457 case clang::Type::Typedef:
3458 count = ClangASTContext::GetNumFields (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3459 break;
3460
3461 case clang::Type::Elaborated:
3462 count = ClangASTContext::GetNumFields (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3463 break;
3464
Greg Clayton96154be2011-11-13 06:57:31 +00003465 case clang::Type::ObjCObject:
3466 case clang::Type::ObjCInterface:
3467 if (GetCompleteQualType (ast, qual_type))
3468 {
3469 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3470 if (objc_class_type)
3471 {
3472 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3473
3474 if (class_interface_decl)
3475 count = class_interface_decl->ivar_size();
3476 }
3477 }
3478 break;
3479
Greg Claytond68e0892011-09-09 23:04:00 +00003480 default:
3481 break;
3482 }
3483 return count;
3484}
3485
3486clang_type_t
3487ClangASTContext::GetDirectBaseClassAtIndex (clang::ASTContext *ast,
3488 clang_type_t clang_type,
Greg Clayton36da2aa2013-01-25 18:06:21 +00003489 size_t idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003490 uint32_t *bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003491{
3492 if (clang_type == NULL)
3493 return 0;
3494
3495 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3496 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3497 switch (type_class)
3498 {
3499 case clang::Type::Record:
3500 if (GetCompleteQualType (ast, qual_type))
3501 {
3502 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3503 if (cxx_record_decl)
3504 {
3505 uint32_t curr_idx = 0;
3506 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3507 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3508 base_class != base_class_end;
3509 ++base_class, ++curr_idx)
3510 {
3511 if (curr_idx == idx)
3512 {
Greg Clayton96154be2011-11-13 06:57:31 +00003513 if (bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003514 {
3515 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3516 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3517// if (base_class->isVirtual())
Greg Clayton96154be2011-11-13 06:57:31 +00003518// *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytond68e0892011-09-09 23:04:00 +00003519// else
Greg Clayton96154be2011-11-13 06:57:31 +00003520 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytond68e0892011-09-09 23:04:00 +00003521 }
3522 return base_class->getType().getAsOpaquePtr();
3523 }
3524 }
3525 }
3526 }
3527 break;
3528
3529 case clang::Type::ObjCObject:
3530 case clang::Type::ObjCInterface:
3531 if (idx == 0 && GetCompleteQualType (ast, qual_type))
3532 {
3533 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
3534 if (objc_class_type)
3535 {
3536 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3537
3538 if (class_interface_decl)
3539 {
3540 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3541 if (superclass_interface_decl)
3542 {
Greg Clayton96154be2011-11-13 06:57:31 +00003543 if (bit_offset_ptr)
3544 *bit_offset_ptr = 0;
Greg Claytond68e0892011-09-09 23:04:00 +00003545 return ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr();
3546 }
3547 }
3548 }
3549 }
3550 break;
3551
3552
3553 case clang::Type::Typedef:
3554 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3555 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3556 idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003557 bit_offset_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003558
3559 case clang::Type::Elaborated:
3560 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3561 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3562 idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003563 bit_offset_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003564
3565 default:
3566 break;
3567 }
3568 return NULL;
3569}
3570
3571clang_type_t
3572ClangASTContext::GetVirtualBaseClassAtIndex (clang::ASTContext *ast,
3573 clang_type_t clang_type,
Greg Clayton36da2aa2013-01-25 18:06:21 +00003574 size_t idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003575 uint32_t *bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003576{
3577 if (clang_type == NULL)
3578 return 0;
3579
3580 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3581 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3582 switch (type_class)
3583 {
3584 case clang::Type::Record:
3585 if (GetCompleteQualType (ast, qual_type))
3586 {
3587 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3588 if (cxx_record_decl)
3589 {
3590 uint32_t curr_idx = 0;
3591 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3592 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
3593 base_class != base_class_end;
3594 ++base_class, ++curr_idx)
3595 {
3596 if (curr_idx == idx)
3597 {
Greg Clayton96154be2011-11-13 06:57:31 +00003598 if (bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003599 {
3600 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3601 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
Greg Clayton96154be2011-11-13 06:57:31 +00003602 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytond68e0892011-09-09 23:04:00 +00003603
3604 }
3605 return base_class->getType().getAsOpaquePtr();
3606 }
3607 }
3608 }
3609 }
3610 break;
3611
3612 case clang::Type::Typedef:
3613 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3614 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3615 idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003616 bit_offset_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003617
3618 case clang::Type::Elaborated:
3619 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3620 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3621 idx,
Greg Clayton96154be2011-11-13 06:57:31 +00003622 bit_offset_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003623
3624 default:
3625 break;
3626 }
3627 return NULL;
3628}
3629
3630clang_type_t
3631ClangASTContext::GetFieldAtIndex (clang::ASTContext *ast,
3632 clang_type_t clang_type,
Greg Clayton36da2aa2013-01-25 18:06:21 +00003633 size_t idx,
Greg Claytond68e0892011-09-09 23:04:00 +00003634 std::string& name,
Greg Claytonf6132ef2012-07-31 23:39:10 +00003635 uint64_t *bit_offset_ptr,
3636 uint32_t *bitfield_bit_size_ptr,
3637 bool *is_bitfield_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003638{
3639 if (clang_type == NULL)
3640 return 0;
3641
3642 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3643 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3644 switch (type_class)
3645 {
3646 case clang::Type::Record:
3647 if (GetCompleteQualType (ast, qual_type))
3648 {
3649 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3650 const RecordDecl *record_decl = record_type->getDecl();
3651 uint32_t field_idx = 0;
3652 RecordDecl::field_iterator field, field_end;
3653 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
3654 {
3655 if (idx == field_idx)
3656 {
3657 // Print the member type if requested
3658 // Print the member name and equal sign
3659 name.assign(field->getNameAsString());
3660
3661 // Figure out the type byte size (field_type_info.first) and
3662 // alignment (field_type_info.second) from the AST context.
Greg Clayton96154be2011-11-13 06:57:31 +00003663 if (bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003664 {
3665 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Greg Clayton96154be2011-11-13 06:57:31 +00003666 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
Greg Claytond68e0892011-09-09 23:04:00 +00003667 }
3668
Greg Claytonf6132ef2012-07-31 23:39:10 +00003669 const bool is_bitfield = field->isBitField();
3670
3671 if (bitfield_bit_size_ptr)
3672 {
3673 *bitfield_bit_size_ptr = 0;
3674
3675 if (is_bitfield && ast)
3676 {
3677 Expr *bitfield_bit_size_expr = field->getBitWidth();
3678 llvm::APSInt bitfield_apsint;
3679 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
3680 {
3681 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
3682 }
3683 }
3684 }
3685 if (is_bitfield_ptr)
3686 *is_bitfield_ptr = is_bitfield;
3687
Greg Claytond68e0892011-09-09 23:04:00 +00003688 return field->getType().getAsOpaquePtr();
3689 }
3690 }
3691 }
3692 break;
3693
3694 case clang::Type::ObjCObject:
3695 case clang::Type::ObjCInterface:
3696 if (GetCompleteQualType (ast, qual_type))
3697 {
3698 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3699 assert (objc_class_type);
3700 if (objc_class_type)
3701 {
3702 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3703
3704 if (class_interface_decl)
3705 {
3706 if (idx < (class_interface_decl->ivar_size()))
3707 {
3708 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3709 uint32_t ivar_idx = 0;
3710
3711 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
3712 {
3713 if (ivar_idx == idx)
3714 {
3715 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3716
3717 QualType ivar_qual_type(ivar_decl->getType());
3718
3719 name.assign(ivar_decl->getNameAsString());
3720
Greg Clayton96154be2011-11-13 06:57:31 +00003721 if (bit_offset_ptr)
Greg Claytond68e0892011-09-09 23:04:00 +00003722 {
3723 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Clayton96154be2011-11-13 06:57:31 +00003724 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
Greg Claytond68e0892011-09-09 23:04:00 +00003725 }
3726
Greg Claytonf6132ef2012-07-31 23:39:10 +00003727 const bool is_bitfield = ivar_pos->isBitField();
3728
3729 if (bitfield_bit_size_ptr)
3730 {
3731 *bitfield_bit_size_ptr = 0;
3732
3733 if (is_bitfield && ast)
3734 {
3735 Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
3736 llvm::APSInt bitfield_apsint;
3737 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
3738 {
3739 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
3740 }
3741 }
3742 }
3743 if (is_bitfield_ptr)
3744 *is_bitfield_ptr = is_bitfield;
3745
Greg Claytond68e0892011-09-09 23:04:00 +00003746 return ivar_qual_type.getAsOpaquePtr();
3747 }
3748 }
3749 }
3750 }
3751 }
3752 }
3753 break;
3754
3755
3756 case clang::Type::Typedef:
3757 return ClangASTContext::GetFieldAtIndex (ast,
3758 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3759 idx,
3760 name,
Greg Claytonf6132ef2012-07-31 23:39:10 +00003761 bit_offset_ptr,
3762 bitfield_bit_size_ptr,
3763 is_bitfield_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003764
3765 case clang::Type::Elaborated:
3766 return ClangASTContext::GetFieldAtIndex (ast,
3767 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3768 idx,
3769 name,
Greg Claytonf6132ef2012-07-31 23:39:10 +00003770 bit_offset_ptr,
3771 bitfield_bit_size_ptr,
3772 is_bitfield_ptr);
Greg Claytond68e0892011-09-09 23:04:00 +00003773
3774 default:
3775 break;
3776 }
3777 return NULL;
3778}
3779
Enrico Granatacc5d2742013-03-19 22:58:48 +00003780size_t
3781ClangASTContext::GetIndexOfFieldWithName (clang::ASTContext *ast,
3782 lldb::clang_type_t clang_type,
3783 const char* name,
3784 lldb::clang_type_t* field_clang_type,
3785 uint64_t *bit_offset_ptr,
3786 uint32_t *bitfield_bit_size_ptr,
3787 bool *is_bitfield_ptr)
3788{
3789 auto count = ClangASTContext::GetNumFields(ast, clang_type);
3790 lldb::clang_type_t field_clang_type_internal;
3791 std::string field_name;
3792 for (auto index = 0; index < count; index++)
3793 {
3794 field_clang_type_internal = ClangASTContext::GetFieldAtIndex(ast, clang_type, index, field_name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr);
3795 if ( strcmp(field_name.c_str(), name) == 0 )
3796 {
3797 if (field_clang_type)
3798 *field_clang_type = field_clang_type_internal;
3799 return index;
3800 }
3801 }
3802 return UINT32_MAX;
3803}
3804
Greg Clayton949b7172012-10-13 00:20:27 +00003805lldb::BasicType
3806ClangASTContext::GetLLDBBasicTypeEnumeration (clang_type_t clang_type)
3807{
3808 if (clang_type)
3809 {
3810 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3811 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
Greg Clayton12f1d1e2012-10-15 21:16:43 +00003812 if (type_class == clang::Type::Builtin)
Greg Clayton949b7172012-10-13 00:20:27 +00003813 {
Greg Clayton949b7172012-10-13 00:20:27 +00003814 switch (cast<clang::BuiltinType>(qual_type)->getKind())
Greg Clayton12f1d1e2012-10-15 21:16:43 +00003815 {
Greg Clayton949b7172012-10-13 00:20:27 +00003816 case clang::BuiltinType::Void: return eBasicTypeVoid;
3817 case clang::BuiltinType::Bool: return eBasicTypeBool;
3818 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
3819 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
3820 case clang::BuiltinType::Char16: return eBasicTypeChar16;
3821 case clang::BuiltinType::Char32: return eBasicTypeChar32;
3822 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
3823 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
3824 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
3825 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
3826 case clang::BuiltinType::Short: return eBasicTypeShort;
3827 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
3828 case clang::BuiltinType::Int: return eBasicTypeInt;
3829 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
3830 case clang::BuiltinType::Long: return eBasicTypeLong;
3831 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
3832 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
3833 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
3834 case clang::BuiltinType::Int128: return eBasicTypeInt128;
3835 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
3836
3837 case clang::BuiltinType::Half: return eBasicTypeHalf;
3838 case clang::BuiltinType::Float: return eBasicTypeFloat;
3839 case clang::BuiltinType::Double: return eBasicTypeDouble;
3840 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
3841
3842 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
3843 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
3844 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
3845 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
3846 case clang::BuiltinType::Dependent:
3847 case clang::BuiltinType::Overload:
3848 case clang::BuiltinType::BoundMember:
3849 case clang::BuiltinType::PseudoObject:
3850 case clang::BuiltinType::UnknownAny:
3851 case clang::BuiltinType::BuiltinFn:
3852 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytond0250852013-02-01 00:46:49 +00003853 case clang::BuiltinType::OCLEvent:
3854 case clang::BuiltinType::OCLImage1d:
3855 case clang::BuiltinType::OCLImage1dArray:
3856 case clang::BuiltinType::OCLImage1dBuffer:
3857 case clang::BuiltinType::OCLImage2d:
3858 case clang::BuiltinType::OCLImage2dArray:
3859 case clang::BuiltinType::OCLImage3d:
Greg Claytonc1130562013-02-13 18:15:56 +00003860 case clang::BuiltinType::OCLSampler:
Greg Clayton949b7172012-10-13 00:20:27 +00003861 return eBasicTypeOther;
Greg Clayton12f1d1e2012-10-15 21:16:43 +00003862 }
Greg Clayton949b7172012-10-13 00:20:27 +00003863 }
3864 }
3865
3866 return eBasicTypeInvalid;
3867}
3868
3869
Greg Claytond68e0892011-09-09 23:04:00 +00003870
Greg Claytonc3b61d22010-12-15 05:08:08 +00003871// If a pointer to a pointee type (the clang_type arg) says that it has no
3872// children, then we either need to trust it, or override it and return a
3873// different result. For example, an "int *" has one child that is an integer,
3874// but a function pointer doesn't have any children. Likewise if a Record type
3875// claims it has no children, then there really is nothing to show.
3876uint32_t
3877ClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
3878{
3879 if (clang_type == NULL)
3880 return 0;
3881
3882 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3883 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3884 switch (type_class)
3885 {
Greg Clayton9db023b2011-01-08 22:26:47 +00003886 case clang::Type::Builtin:
3887 switch (cast<clang::BuiltinType>(qual_type)->getKind())
3888 {
Greg Claytonabe0fed2011-04-18 08:33:37 +00003889 case clang::BuiltinType::UnknownAny:
Greg Clayton9db023b2011-01-08 22:26:47 +00003890 case clang::BuiltinType::Void:
3891 case clang::BuiltinType::NullPtr:
Greg Claytond0250852013-02-01 00:46:49 +00003892 case clang::BuiltinType::OCLEvent:
3893 case clang::BuiltinType::OCLImage1d:
3894 case clang::BuiltinType::OCLImage1dArray:
3895 case clang::BuiltinType::OCLImage1dBuffer:
3896 case clang::BuiltinType::OCLImage2d:
3897 case clang::BuiltinType::OCLImage2dArray:
3898 case clang::BuiltinType::OCLImage3d:
Greg Claytonc1130562013-02-13 18:15:56 +00003899 case clang::BuiltinType::OCLSampler:
Greg Clayton9db023b2011-01-08 22:26:47 +00003900 return 0;
3901 case clang::BuiltinType::Bool:
3902 case clang::BuiltinType::Char_U:
3903 case clang::BuiltinType::UChar:
Sean Callananad293092011-01-18 23:32:05 +00003904 case clang::BuiltinType::WChar_U:
Greg Clayton9db023b2011-01-08 22:26:47 +00003905 case clang::BuiltinType::Char16:
3906 case clang::BuiltinType::Char32:
3907 case clang::BuiltinType::UShort:
3908 case clang::BuiltinType::UInt:
3909 case clang::BuiltinType::ULong:
3910 case clang::BuiltinType::ULongLong:
3911 case clang::BuiltinType::UInt128:
3912 case clang::BuiltinType::Char_S:
3913 case clang::BuiltinType::SChar:
Sean Callananad293092011-01-18 23:32:05 +00003914 case clang::BuiltinType::WChar_S:
Greg Clayton9db023b2011-01-08 22:26:47 +00003915 case clang::BuiltinType::Short:
3916 case clang::BuiltinType::Int:
3917 case clang::BuiltinType::Long:
3918 case clang::BuiltinType::LongLong:
3919 case clang::BuiltinType::Int128:
3920 case clang::BuiltinType::Float:
3921 case clang::BuiltinType::Double:
3922 case clang::BuiltinType::LongDouble:
3923 case clang::BuiltinType::Dependent:
3924 case clang::BuiltinType::Overload:
Greg Clayton9db023b2011-01-08 22:26:47 +00003925 case clang::BuiltinType::ObjCId:
3926 case clang::BuiltinType::ObjCClass:
3927 case clang::BuiltinType::ObjCSel:
Sean Callanan0de254a2011-05-15 22:34:38 +00003928 case clang::BuiltinType::BoundMember:
Greg Claytonf6a5bd72011-10-22 03:33:13 +00003929 case clang::BuiltinType::Half:
3930 case clang::BuiltinType::ARCUnbridgedCast:
Greg Clayton32e25642011-11-09 19:04:58 +00003931 case clang::BuiltinType::PseudoObject:
Sean Callanan06dc17f2012-09-24 22:25:51 +00003932 case clang::BuiltinType::BuiltinFn:
Greg Clayton9db023b2011-01-08 22:26:47 +00003933 return 1;
3934 }
3935 break;
3936
Greg Claytone52f37b2011-01-15 02:52:14 +00003937 case clang::Type::Complex: return 1;
Greg Claytonc3b61d22010-12-15 05:08:08 +00003938 case clang::Type::Pointer: return 1;
3939 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
3940 case clang::Type::LValueReference: return 1;
3941 case clang::Type::RValueReference: return 1;
3942 case clang::Type::MemberPointer: return 0;
3943 case clang::Type::ConstantArray: return 0;
3944 case clang::Type::IncompleteArray: return 0;
3945 case clang::Type::VariableArray: return 0;
3946 case clang::Type::DependentSizedArray: return 0;
3947 case clang::Type::DependentSizedExtVector: return 0;
3948 case clang::Type::Vector: return 0;
3949 case clang::Type::ExtVector: return 0;
3950 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
3951 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
3952 case clang::Type::UnresolvedUsing: return 0;
3953 case clang::Type::Paren: return 0;
3954 case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00003955 case clang::Type::Elaborated: return ClangASTContext::GetNumPointeeChildren (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Claytonc3b61d22010-12-15 05:08:08 +00003956 case clang::Type::TypeOfExpr: return 0;
3957 case clang::Type::TypeOf: return 0;
3958 case clang::Type::Decltype: return 0;
3959 case clang::Type::Record: return 0;
3960 case clang::Type::Enum: return 1;
Greg Claytonc3b61d22010-12-15 05:08:08 +00003961 case clang::Type::TemplateTypeParm: return 1;
3962 case clang::Type::SubstTemplateTypeParm: return 1;
3963 case clang::Type::TemplateSpecialization: return 1;
3964 case clang::Type::InjectedClassName: return 0;
3965 case clang::Type::DependentName: return 1;
3966 case clang::Type::DependentTemplateSpecialization: return 1;
3967 case clang::Type::ObjCObject: return 0;
3968 case clang::Type::ObjCInterface: return 0;
3969 case clang::Type::ObjCObjectPointer: return 1;
3970 default:
3971 break;
3972 }
3973 return 0;
3974}
Chris Lattner24943d22010-06-08 16:52:24 +00003975
Greg Clayton462d4142010-09-29 01:12:09 +00003976clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +00003977ClangASTContext::GetChildClangTypeAtIndex
3978(
Jim Ingham58513662011-06-24 22:03:24 +00003979 ExecutionContext *exe_ctx,
Chris Lattner24943d22010-06-08 16:52:24 +00003980 const char *parent_name,
Greg Clayton462d4142010-09-29 01:12:09 +00003981 clang_type_t parent_clang_type,
Greg Clayton36da2aa2013-01-25 18:06:21 +00003982 size_t idx,
Chris Lattner24943d22010-06-08 16:52:24 +00003983 bool transparent_pointers,
3984 bool omit_empty_base_classes,
Greg Clayton24b03102011-07-09 20:12:33 +00003985 bool ignore_array_bounds,
Chris Lattner24943d22010-06-08 16:52:24 +00003986 std::string& child_name,
3987 uint32_t &child_byte_size,
3988 int32_t &child_byte_offset,
3989 uint32_t &child_bitfield_bit_size,
Greg Claytonbf8e42b2010-10-14 22:52:14 +00003990 uint32_t &child_bitfield_bit_offset,
Greg Clayton00c3ae72011-01-21 01:59:00 +00003991 bool &child_is_base_class,
3992 bool &child_is_deref_of_parent
Chris Lattner24943d22010-06-08 16:52:24 +00003993)
3994{
3995 if (parent_clang_type)
3996
Jim Ingham58513662011-06-24 22:03:24 +00003997 return GetChildClangTypeAtIndex (exe_ctx,
3998 getASTContext(),
Chris Lattner24943d22010-06-08 16:52:24 +00003999 parent_name,
4000 parent_clang_type,
4001 idx,
4002 transparent_pointers,
4003 omit_empty_base_classes,
Greg Clayton24b03102011-07-09 20:12:33 +00004004 ignore_array_bounds,
Chris Lattner24943d22010-06-08 16:52:24 +00004005 child_name,
4006 child_byte_size,
4007 child_byte_offset,
4008 child_bitfield_bit_size,
Greg Claytonbf8e42b2010-10-14 22:52:14 +00004009 child_bitfield_bit_offset,
Greg Clayton00c3ae72011-01-21 01:59:00 +00004010 child_is_base_class,
4011 child_is_deref_of_parent);
Chris Lattner24943d22010-06-08 16:52:24 +00004012 return NULL;
4013}
4014
Greg Clayton462d4142010-09-29 01:12:09 +00004015clang_type_t
Chris Lattner24943d22010-06-08 16:52:24 +00004016ClangASTContext::GetChildClangTypeAtIndex
4017(
Jim Ingham58513662011-06-24 22:03:24 +00004018 ExecutionContext *exe_ctx,
Greg Claytonb01000f2011-01-17 03:46:26 +00004019 ASTContext *ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004020 const char *parent_name,
Greg Clayton462d4142010-09-29 01:12:09 +00004021 clang_type_t parent_clang_type,
Greg Clayton36da2aa2013-01-25 18:06:21 +00004022 size_t idx,
Chris Lattner24943d22010-06-08 16:52:24 +00004023 bool transparent_pointers,
4024 bool omit_empty_base_classes,
Greg Clayton24b03102011-07-09 20:12:33 +00004025 bool ignore_array_bounds,
Chris Lattner24943d22010-06-08 16:52:24 +00004026 std::string& child_name,
4027 uint32_t &child_byte_size,
4028 int32_t &child_byte_offset,
4029 uint32_t &child_bitfield_bit_size,
Greg Claytonbf8e42b2010-10-14 22:52:14 +00004030 uint32_t &child_bitfield_bit_offset,
Greg Clayton00c3ae72011-01-21 01:59:00 +00004031 bool &child_is_base_class,
4032 bool &child_is_deref_of_parent
Chris Lattner24943d22010-06-08 16:52:24 +00004033)
4034{
4035 if (parent_clang_type == NULL)
4036 return NULL;
4037
Greg Claytonb9124572012-12-06 02:33:54 +00004038 QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
4039 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
4040 child_bitfield_bit_size = 0;
4041 child_bitfield_bit_offset = 0;
4042 child_is_base_class = false;
4043
4044 const bool idx_is_valid = idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes);
4045 uint32_t bit_offset;
4046 switch (parent_type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00004047 {
Greg Claytonb9124572012-12-06 02:33:54 +00004048 case clang::Type::Builtin:
4049 if (idx_is_valid)
Chris Lattner24943d22010-06-08 16:52:24 +00004050 {
Greg Clayton960d6a42010-08-03 00:35:52 +00004051 switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
4052 {
4053 case clang::BuiltinType::ObjCId:
4054 case clang::BuiltinType::ObjCClass:
Sean Callanan04325062010-10-25 00:29:48 +00004055 child_name = "isa";
Greg Claytonb01000f2011-01-17 03:46:26 +00004056 child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
4057 return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +00004058
Greg Clayton960d6a42010-08-03 00:35:52 +00004059 default:
4060 break;
4061 }
Greg Claytonb9124572012-12-06 02:33:54 +00004062 }
4063 break;
Greg Clayton960d6a42010-08-03 00:35:52 +00004064
Greg Claytonb9124572012-12-06 02:33:54 +00004065 case clang::Type::Record:
4066 if (idx_is_valid && GetCompleteQualType (ast, parent_qual_type))
4067 {
4068 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
4069 const RecordDecl *record_decl = record_type->getDecl();
4070 assert(record_decl);
4071 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
4072 uint32_t child_idx = 0;
4073
4074 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4075 if (cxx_record_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00004076 {
Greg Claytonb9124572012-12-06 02:33:54 +00004077 // We might have base classes to print out first
4078 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4079 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4080 base_class != base_class_end;
4081 ++base_class)
Chris Lattner24943d22010-06-08 16:52:24 +00004082 {
Greg Claytonb9124572012-12-06 02:33:54 +00004083 const CXXRecordDecl *base_class_decl = NULL;
4084
4085 // Skip empty base classes
4086 if (omit_empty_base_classes)
Chris Lattner24943d22010-06-08 16:52:24 +00004087 {
Greg Claytonb9124572012-12-06 02:33:54 +00004088 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4089 if (RecordHasFields(base_class_decl) == false)
4090 continue;
Chris Lattner24943d22010-06-08 16:52:24 +00004091 }
Greg Claytonb9124572012-12-06 02:33:54 +00004092
Chris Lattner24943d22010-06-08 16:52:24 +00004093 if (idx == child_idx)
4094 {
Greg Claytonb9124572012-12-06 02:33:54 +00004095 if (base_class_decl == NULL)
4096 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
Chris Lattner24943d22010-06-08 16:52:24 +00004097
Chris Lattner24943d22010-06-08 16:52:24 +00004098
Greg Claytonb9124572012-12-06 02:33:54 +00004099 if (base_class->isVirtual())
4100 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
4101 else
4102 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner24943d22010-06-08 16:52:24 +00004103
Greg Claytonb9124572012-12-06 02:33:54 +00004104 // Base classes should be a multiple of 8 bits in size
4105 child_byte_offset = bit_offset/8;
4106
4107 child_name = ClangASTType::GetTypeNameForQualType(ast, base_class->getType());
Chris Lattner24943d22010-06-08 16:52:24 +00004108
Greg Claytonb9124572012-12-06 02:33:54 +00004109 uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
4110
4111 // Base classes bit sizes should be a multiple of 8 bits in size
4112 assert (clang_type_info_bit_size % 8 == 0);
4113 child_byte_size = clang_type_info_bit_size / 8;
4114 child_is_base_class = true;
4115 return base_class->getType().getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00004116 }
Greg Claytonb9124572012-12-06 02:33:54 +00004117 // We don't increment the child index in the for loop since we might
4118 // be skipping empty base classes
4119 ++child_idx;
Chris Lattner24943d22010-06-08 16:52:24 +00004120 }
4121 }
Greg Claytonb9124572012-12-06 02:33:54 +00004122 // Make sure index is in range...
4123 uint32_t field_idx = 0;
4124 RecordDecl::field_iterator field, field_end;
4125 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 +00004126 {
Greg Claytonb9124572012-12-06 02:33:54 +00004127 if (idx == child_idx)
Greg Clayton9488b742010-07-28 02:04:09 +00004128 {
Greg Claytonb9124572012-12-06 02:33:54 +00004129 // Print the member type if requested
4130 // Print the member name and equal sign
4131 child_name.assign(field->getNameAsString().c_str());
4132
4133 // Figure out the type byte size (field_type_info.first) and
4134 // alignment (field_type_info.second) from the AST context.
4135 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
4136 assert(field_idx < record_layout.getFieldCount());
4137
4138 child_byte_size = field_type_info.first / 8;
4139
4140 // Figure out the field offset within the current struct/union/class type
4141 bit_offset = record_layout.getFieldOffset (field_idx);
4142 child_byte_offset = bit_offset / 8;
4143 if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
4144 child_bitfield_bit_offset = bit_offset % 8;
4145
4146 return field->getType().getAsOpaquePtr();
4147 }
4148 }
4149 }
4150 break;
4151
4152 case clang::Type::ObjCObject:
4153 case clang::Type::ObjCInterface:
4154 if (idx_is_valid && GetCompleteQualType (ast, parent_qual_type))
4155 {
4156 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
4157 assert (objc_class_type);
4158 if (objc_class_type)
4159 {
4160 uint32_t child_idx = 0;
4161 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4162
4163 if (class_interface_decl)
4164 {
4165
4166 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
4167 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4168 if (superclass_interface_decl)
Greg Clayton9488b742010-07-28 02:04:09 +00004169 {
Greg Claytonb9124572012-12-06 02:33:54 +00004170 if (omit_empty_base_classes)
Greg Clayton9488b742010-07-28 02:04:09 +00004171 {
Greg Claytonb9124572012-12-06 02:33:54 +00004172 if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
Greg Clayton9488b742010-07-28 02:04:09 +00004173 {
Greg Claytonb9124572012-12-06 02:33:54 +00004174 if (idx == 0)
Greg Clayton9488b742010-07-28 02:04:09 +00004175 {
Greg Claytonb9124572012-12-06 02:33:54 +00004176 QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
Greg Clayton9488b742010-07-28 02:04:09 +00004177
Greg Clayton9488b742010-07-28 02:04:09 +00004178
Greg Claytonb9124572012-12-06 02:33:54 +00004179 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
Greg Clayton9488b742010-07-28 02:04:09 +00004180
Greg Claytonb01000f2011-01-17 03:46:26 +00004181 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00004182
4183 child_byte_size = ivar_type_info.first / 8;
Greg Claytonb9124572012-12-06 02:33:54 +00004184 child_byte_offset = 0;
4185 child_is_base_class = true;
Greg Clayton9488b742010-07-28 02:04:09 +00004186
Greg Clayton9488b742010-07-28 02:04:09 +00004187 return ivar_qual_type.getAsOpaquePtr();
4188 }
Greg Claytonb9124572012-12-06 02:33:54 +00004189
Greg Clayton9488b742010-07-28 02:04:09 +00004190 ++child_idx;
4191 }
4192 }
Greg Claytonb9124572012-12-06 02:33:54 +00004193 else
4194 ++child_idx;
4195 }
4196
4197 const uint32_t superclass_idx = child_idx;
4198
4199 if (idx < (child_idx + class_interface_decl->ivar_size()))
4200 {
4201 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4202
4203 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
4204 {
4205 if (child_idx == idx)
4206 {
4207 ObjCIvarDecl* ivar_decl = *ivar_pos;
4208
4209 QualType ivar_qual_type(ivar_decl->getType());
4210
4211 child_name.assign(ivar_decl->getNameAsString().c_str());
4212
4213 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
4214
4215 child_byte_size = ivar_type_info.first / 8;
4216
4217 // Figure out the field offset within the current struct/union/class type
4218 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
4219 // that doesn't account for the space taken up by unbacked properties, or from
4220 // the changing size of base classes that are newer than this class.
4221 // So if we have a process around that we can ask about this object, do so.
4222 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
4223 Process *process = NULL;
4224 if (exe_ctx)
4225 process = exe_ctx->GetProcessPtr();
4226 if (process)
4227 {
4228 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4229 if (objc_runtime != NULL)
4230 {
4231 ClangASTType parent_ast_type (ast, parent_qual_type.getAsOpaquePtr());
4232 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
4233 }
4234 }
4235
4236 // Setting this to UINT32_MAX to make sure we don't compute it twice...
4237 bit_offset = UINT32_MAX;
4238
4239 if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
4240 {
4241 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
4242 child_byte_offset = bit_offset / 8;
4243 }
4244
4245 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
4246 // of a bitfield within its containing object. So regardless of where we get the byte
4247 // offset from, we still need to get the bit offset for bitfields from the layout.
4248
4249 if (ClangASTContext::FieldIsBitfield (ast, ivar_decl, child_bitfield_bit_size))
4250 {
4251 if (bit_offset == UINT32_MAX)
4252 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
4253
4254 child_bitfield_bit_offset = bit_offset % 8;
4255 }
4256 return ivar_qual_type.getAsOpaquePtr();
4257 }
4258 ++child_idx;
4259 }
Greg Clayton9488b742010-07-28 02:04:09 +00004260 }
4261 }
4262 }
Greg Claytonb9124572012-12-06 02:33:54 +00004263 }
4264 break;
4265
4266 case clang::Type::ObjCObjectPointer:
4267 if (idx_is_valid)
4268 {
4269 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
4270 QualType pointee_type = pointer_type->getPointeeType();
4271
4272 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
Greg Clayton9488b742010-07-28 02:04:09 +00004273 {
Greg Claytonb9124572012-12-06 02:33:54 +00004274 child_is_deref_of_parent = false;
4275 bool tmp_child_is_deref_of_parent = false;
4276 return GetChildClangTypeAtIndex (exe_ctx,
4277 ast,
4278 parent_name,
4279 pointer_type->getPointeeType().getAsOpaquePtr(),
4280 idx,
4281 transparent_pointers,
4282 omit_empty_base_classes,
4283 ignore_array_bounds,
4284 child_name,
4285 child_byte_size,
4286 child_byte_offset,
4287 child_bitfield_bit_size,
4288 child_bitfield_bit_offset,
4289 child_is_base_class,
4290 tmp_child_is_deref_of_parent);
4291 }
4292 else
4293 {
4294 child_is_deref_of_parent = true;
4295 if (parent_name)
Greg Clayton960d6a42010-08-03 00:35:52 +00004296 {
Greg Claytonb9124572012-12-06 02:33:54 +00004297 child_name.assign(1, '*');
4298 child_name += parent_name;
Greg Clayton960d6a42010-08-03 00:35:52 +00004299 }
Greg Clayton960d6a42010-08-03 00:35:52 +00004300
Greg Claytonb9124572012-12-06 02:33:54 +00004301 // We have a pointer to an simple type
4302 if (idx == 0 && GetCompleteQualType(ast, pointee_type))
4303 {
4304 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
4305 assert(clang_type_info.first % 8 == 0);
4306 child_byte_size = clang_type_info.first / 8;
4307 child_byte_offset = 0;
4308 return pointee_type.getAsOpaquePtr();
Greg Clayton960d6a42010-08-03 00:35:52 +00004309 }
Greg Clayton9488b742010-07-28 02:04:09 +00004310 }
Greg Claytonb9124572012-12-06 02:33:54 +00004311 }
4312 break;
Greg Clayton9488b742010-07-28 02:04:09 +00004313
Greg Claytonf95fc9e2013-04-05 23:27:21 +00004314 case clang::Type::Vector:
4315 case clang::Type::ExtVector:
4316 if (idx_is_valid)
4317 {
4318 const VectorType *array = cast<VectorType>(parent_qual_type.getTypePtr());
4319 if (array)
4320 {
4321 if (GetCompleteQualType (ast, array->getElementType()))
4322 {
4323 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
4324
4325 char element_name[64];
4326 ::snprintf (element_name, sizeof (element_name), "[%zu]", idx);
4327
4328 child_name.assign(element_name);
4329 assert(field_type_info.first % 8 == 0);
4330 child_byte_size = field_type_info.first / 8;
4331 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
4332 return array->getElementType().getAsOpaquePtr();
4333 }
4334 }
4335 }
4336 break;
4337
Greg Clayton1674b122010-07-21 22:12:05 +00004338 case clang::Type::ConstantArray:
Greg Claytonb9124572012-12-06 02:33:54 +00004339 case clang::Type::IncompleteArray:
4340 if (ignore_array_bounds || idx_is_valid)
Chris Lattner24943d22010-06-08 16:52:24 +00004341 {
Greg Claytonb9124572012-12-06 02:33:54 +00004342 const ArrayType *array = cast<ArrayType>(parent_qual_type.getTypePtr());
4343 if (array)
Chris Lattner24943d22010-06-08 16:52:24 +00004344 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004345 if (GetCompleteQualType (ast, array->getElementType()))
4346 {
4347 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Greg Claytonb9124572012-12-06 02:33:54 +00004348
Greg Claytonb01000f2011-01-17 03:46:26 +00004349 char element_name[64];
Greg Clayton36da2aa2013-01-25 18:06:21 +00004350 ::snprintf (element_name, sizeof (element_name), "[%zu]", idx);
Greg Claytonb9124572012-12-06 02:33:54 +00004351
Greg Claytonb01000f2011-01-17 03:46:26 +00004352 child_name.assign(element_name);
4353 assert(field_type_info.first % 8 == 0);
4354 child_byte_size = field_type_info.first / 8;
Greg Clayton24b03102011-07-09 20:12:33 +00004355 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
Greg Claytonb01000f2011-01-17 03:46:26 +00004356 return array->getElementType().getAsOpaquePtr();
4357 }
Chris Lattner24943d22010-06-08 16:52:24 +00004358 }
4359 }
4360 break;
Greg Claytonb9124572012-12-06 02:33:54 +00004361
Chris Lattner24943d22010-06-08 16:52:24 +00004362
Greg Claytonb9124572012-12-06 02:33:54 +00004363 case clang::Type::Pointer:
4364 if (idx_is_valid)
4365 {
4366 const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
4367 QualType pointee_type = pointer_type->getPointeeType();
4368
4369 // Don't dereference "void *" pointers
4370 if (pointee_type->isVoidType())
4371 return NULL;
4372
4373 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
Chris Lattner24943d22010-06-08 16:52:24 +00004374 {
Greg Claytonb9124572012-12-06 02:33:54 +00004375 child_is_deref_of_parent = false;
4376 bool tmp_child_is_deref_of_parent = false;
4377 return GetChildClangTypeAtIndex (exe_ctx,
4378 ast,
4379 parent_name,
4380 pointer_type->getPointeeType().getAsOpaquePtr(),
4381 idx,
4382 transparent_pointers,
4383 omit_empty_base_classes,
4384 ignore_array_bounds,
4385 child_name,
4386 child_byte_size,
4387 child_byte_offset,
4388 child_bitfield_bit_size,
4389 child_bitfield_bit_offset,
4390 child_is_base_class,
4391 tmp_child_is_deref_of_parent);
4392 }
4393 else
4394 {
4395 child_is_deref_of_parent = true;
Chris Lattner24943d22010-06-08 16:52:24 +00004396
Greg Claytonb9124572012-12-06 02:33:54 +00004397 if (parent_name)
Chris Lattner24943d22010-06-08 16:52:24 +00004398 {
Greg Claytonb9124572012-12-06 02:33:54 +00004399 child_name.assign(1, '*');
4400 child_name += parent_name;
Chris Lattner24943d22010-06-08 16:52:24 +00004401 }
Greg Claytonb9124572012-12-06 02:33:54 +00004402
4403 // We have a pointer to an simple type
4404 if (idx == 0)
Chris Lattner24943d22010-06-08 16:52:24 +00004405 {
Greg Claytonb9124572012-12-06 02:33:54 +00004406 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
4407 assert(clang_type_info.first % 8 == 0);
4408 child_byte_size = clang_type_info.first / 8;
4409 child_byte_offset = 0;
4410 return pointee_type.getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00004411 }
4412 }
Chris Lattner24943d22010-06-08 16:52:24 +00004413 }
Greg Claytonb9124572012-12-06 02:33:54 +00004414 break;
4415
4416 case clang::Type::LValueReference:
4417 case clang::Type::RValueReference:
4418 if (idx_is_valid)
4419 {
4420 const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
4421 QualType pointee_type(reference_type->getPointeeType());
4422 clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
4423 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
4424 {
4425 child_is_deref_of_parent = false;
4426 bool tmp_child_is_deref_of_parent = false;
4427 return GetChildClangTypeAtIndex (exe_ctx,
4428 ast,
4429 parent_name,
4430 pointee_clang_type,
4431 idx,
4432 transparent_pointers,
4433 omit_empty_base_classes,
4434 ignore_array_bounds,
4435 child_name,
4436 child_byte_size,
4437 child_byte_offset,
4438 child_bitfield_bit_size,
4439 child_bitfield_bit_offset,
4440 child_is_base_class,
4441 tmp_child_is_deref_of_parent);
4442 }
4443 else
4444 {
4445 if (parent_name)
4446 {
4447 child_name.assign(1, '&');
4448 child_name += parent_name;
4449 }
4450
4451 // We have a pointer to an simple type
4452 if (idx == 0)
4453 {
4454 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
4455 assert(clang_type_info.first % 8 == 0);
4456 child_byte_size = clang_type_info.first / 8;
4457 child_byte_offset = 0;
4458 return pointee_type.getAsOpaquePtr();
4459 }
4460 }
4461 }
4462 break;
4463
4464 case clang::Type::Typedef:
4465 return GetChildClangTypeAtIndex (exe_ctx,
4466 ast,
4467 parent_name,
4468 cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
4469 idx,
4470 transparent_pointers,
4471 omit_empty_base_classes,
4472 ignore_array_bounds,
4473 child_name,
4474 child_byte_size,
4475 child_byte_offset,
4476 child_bitfield_bit_size,
4477 child_bitfield_bit_offset,
4478 child_is_base_class,
4479 child_is_deref_of_parent);
4480 break;
4481
4482 case clang::Type::Elaborated:
4483 return GetChildClangTypeAtIndex (exe_ctx,
4484 ast,
4485 parent_name,
4486 cast<ElaboratedType>(parent_qual_type)->getNamedType().getAsOpaquePtr(),
4487 idx,
4488 transparent_pointers,
4489 omit_empty_base_classes,
4490 ignore_array_bounds,
4491 child_name,
4492 child_byte_size,
4493 child_byte_offset,
4494 child_bitfield_bit_size,
4495 child_bitfield_bit_offset,
4496 child_is_base_class,
4497 child_is_deref_of_parent);
4498
4499 default:
4500 break;
Chris Lattner24943d22010-06-08 16:52:24 +00004501 }
Greg Claytonf8e98a62010-07-23 15:37:46 +00004502 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00004503}
4504
4505static inline bool
4506BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
4507{
Greg Claytonb01000f2011-01-17 03:46:26 +00004508 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner24943d22010-06-08 16:52:24 +00004509}
4510
4511static uint32_t
4512GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
4513{
4514 uint32_t num_bases = 0;
4515 if (cxx_record_decl)
4516 {
4517 if (omit_empty_base_classes)
4518 {
4519 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4520 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4521 base_class != base_class_end;
4522 ++base_class)
4523 {
4524 // Skip empty base classes
4525 if (omit_empty_base_classes)
4526 {
4527 if (BaseSpecifierIsEmpty (base_class))
4528 continue;
4529 }
4530 ++num_bases;
4531 }
4532 }
4533 else
4534 num_bases = cxx_record_decl->getNumBases();
4535 }
4536 return num_bases;
4537}
4538
4539
4540static uint32_t
4541GetIndexForRecordBase
4542(
4543 const RecordDecl *record_decl,
4544 const CXXBaseSpecifier *base_spec,
4545 bool omit_empty_base_classes
4546)
4547{
4548 uint32_t child_idx = 0;
4549
4550 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4551
4552// const char *super_name = record_decl->getNameAsCString();
4553// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
4554// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
4555//
4556 if (cxx_record_decl)
4557 {
4558 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4559 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4560 base_class != base_class_end;
4561 ++base_class)
4562 {
4563 if (omit_empty_base_classes)
4564 {
4565 if (BaseSpecifierIsEmpty (base_class))
4566 continue;
4567 }
4568
4569// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
4570// child_idx,
4571// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
4572//
4573//
4574 if (base_class == base_spec)
4575 return child_idx;
4576 ++child_idx;
4577 }
4578 }
4579
4580 return UINT32_MAX;
4581}
4582
4583
4584static uint32_t
4585GetIndexForRecordChild
4586(
4587 const RecordDecl *record_decl,
4588 NamedDecl *canonical_decl,
4589 bool omit_empty_base_classes
4590)
4591{
4592 uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
4593
4594// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4595//
4596//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
4597// if (cxx_record_decl)
4598// {
4599// CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4600// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4601// base_class != base_class_end;
4602// ++base_class)
4603// {
4604// if (omit_empty_base_classes)
4605// {
4606// if (BaseSpecifierIsEmpty (base_class))
4607// continue;
4608// }
4609//
4610//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
4611//// record_decl->getNameAsCString(),
4612//// canonical_decl->getNameAsCString(),
4613//// child_idx,
4614//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
4615//
4616//
4617// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4618// if (curr_base_class_decl == canonical_decl)
4619// {
4620// return child_idx;
4621// }
4622// ++child_idx;
4623// }
4624// }
4625//
4626// const uint32_t num_bases = child_idx;
4627 RecordDecl::field_iterator field, field_end;
4628 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4629 field != field_end;
4630 ++field, ++child_idx)
4631 {
4632// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
4633// record_decl->getNameAsCString(),
4634// canonical_decl->getNameAsCString(),
4635// child_idx - num_bases,
4636// field->getNameAsCString());
4637
4638 if (field->getCanonicalDecl() == canonical_decl)
4639 return child_idx;
4640 }
4641
4642 return UINT32_MAX;
4643}
4644
4645// Look for a child member (doesn't include base classes, but it does include
4646// their members) in the type hierarchy. Returns an index path into "clang_type"
4647// on how to reach the appropriate member.
4648//
4649// class A
4650// {
4651// public:
4652// int m_a;
4653// int m_b;
4654// };
4655//
4656// class B
4657// {
4658// };
4659//
4660// class C :
4661// public B,
4662// public A
4663// {
4664// };
4665//
4666// If we have a clang type that describes "class C", and we wanted to looked
4667// "m_b" in it:
4668//
4669// With omit_empty_base_classes == false we would get an integer array back with:
4670// { 1, 1 }
4671// The first index 1 is the child index for "class A" within class C
4672// The second index 1 is the child index for "m_b" within class A
4673//
4674// With omit_empty_base_classes == true we would get an integer array back with:
4675// { 0, 1 }
4676// 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)
4677// The second index 1 is the child index for "m_b" within class A
4678
4679size_t
4680ClangASTContext::GetIndexOfChildMemberWithName
4681(
Greg Claytonb01000f2011-01-17 03:46:26 +00004682 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00004683 clang_type_t clang_type,
Chris Lattner24943d22010-06-08 16:52:24 +00004684 const char *name,
4685 bool omit_empty_base_classes,
4686 std::vector<uint32_t>& child_indexes
4687)
4688{
4689 if (clang_type && name && name[0])
4690 {
4691 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton03e0f972010-09-13 03:32:57 +00004692 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4693 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00004694 {
Greg Clayton1674b122010-07-21 22:12:05 +00004695 case clang::Type::Record:
Greg Clayton7a183dc2011-01-20 04:18:48 +00004696 if (GetCompleteQualType (ast, qual_type))
Chris Lattner24943d22010-06-08 16:52:24 +00004697 {
4698 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4699 const RecordDecl *record_decl = record_type->getDecl();
4700
4701 assert(record_decl);
4702 uint32_t child_idx = 0;
4703
4704 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4705
4706 // Try and find a field that matches NAME
4707 RecordDecl::field_iterator field, field_end;
4708 StringRef name_sref(name);
4709 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4710 field != field_end;
4711 ++field, ++child_idx)
4712 {
4713 if (field->getName().equals (name_sref))
4714 {
4715 // We have to add on the number of base classes to this index!
4716 child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
4717 return child_indexes.size();
4718 }
4719 }
4720
4721 if (cxx_record_decl)
4722 {
4723 const RecordDecl *parent_record_decl = cxx_record_decl;
4724
4725 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
4726
4727 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
4728 // Didn't find things easily, lets let clang do its thang...
Sean Callanan9b6898f2011-07-30 02:42:06 +00004729 IdentifierInfo & ident_ref = ast->Idents.get(name_sref);
Chris Lattner24943d22010-06-08 16:52:24 +00004730 DeclarationName decl_name(&ident_ref);
4731
4732 CXXBasePaths paths;
4733 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
4734 decl_name.getAsOpaquePtr(),
4735 paths))
4736 {
Chris Lattner24943d22010-06-08 16:52:24 +00004737 CXXBasePaths::const_paths_iterator path, path_end = paths.end();
4738 for (path = paths.begin(); path != path_end; ++path)
4739 {
4740 const size_t num_path_elements = path->size();
4741 for (size_t e=0; e<num_path_elements; ++e)
4742 {
4743 CXXBasePathElement elem = (*path)[e];
4744
4745 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
4746 if (child_idx == UINT32_MAX)
4747 {
4748 child_indexes.clear();
4749 return 0;
4750 }
4751 else
4752 {
4753 child_indexes.push_back (child_idx);
4754 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
4755 }
4756 }
Sean Callananca8fb172012-12-21 21:34:42 +00004757 for (NamedDecl *path_decl : path->Decls)
Chris Lattner24943d22010-06-08 16:52:24 +00004758 {
Sean Callananca8fb172012-12-21 21:34:42 +00004759 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
Chris Lattner24943d22010-06-08 16:52:24 +00004760 if (child_idx == UINT32_MAX)
4761 {
4762 child_indexes.clear();
4763 return 0;
4764 }
4765 else
4766 {
4767 child_indexes.push_back (child_idx);
4768 }
4769 }
4770 }
4771 return child_indexes.size();
4772 }
4773 }
4774
4775 }
4776 break;
4777
Greg Clayton9488b742010-07-28 02:04:09 +00004778 case clang::Type::ObjCObject:
4779 case clang::Type::ObjCInterface:
Greg Clayton7a183dc2011-01-20 04:18:48 +00004780 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9488b742010-07-28 02:04:09 +00004781 {
4782 StringRef name_sref(name);
Sean Callanand5b3c352011-01-27 04:42:51 +00004783 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00004784 assert (objc_class_type);
4785 if (objc_class_type)
4786 {
4787 uint32_t child_idx = 0;
4788 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4789
4790 if (class_interface_decl)
4791 {
4792 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4793 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4794
Greg Clayton823533e2010-09-18 02:11:07 +00004795 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
Greg Clayton9488b742010-07-28 02:04:09 +00004796 {
4797 const ObjCIvarDecl* ivar_decl = *ivar_pos;
4798
4799 if (ivar_decl->getName().equals (name_sref))
4800 {
4801 if ((!omit_empty_base_classes && superclass_interface_decl) ||
4802 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
4803 ++child_idx;
4804
4805 child_indexes.push_back (child_idx);
4806 return child_indexes.size();
4807 }
4808 }
4809
4810 if (superclass_interface_decl)
4811 {
4812 // The super class index is always zero for ObjC classes,
4813 // so we push it onto the child indexes in case we find
4814 // an ivar in our superclass...
4815 child_indexes.push_back (0);
4816
Greg Claytonb01000f2011-01-17 03:46:26 +00004817 if (GetIndexOfChildMemberWithName (ast,
4818 ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
Greg Clayton9488b742010-07-28 02:04:09 +00004819 name,
4820 omit_empty_base_classes,
4821 child_indexes))
4822 {
4823 // We did find an ivar in a superclass so just
4824 // return the results!
4825 return child_indexes.size();
4826 }
4827
4828 // We didn't find an ivar matching "name" in our
4829 // superclass, pop the superclass zero index that
4830 // we pushed on above.
4831 child_indexes.pop_back();
4832 }
4833 }
4834 }
4835 }
4836 break;
4837
4838 case clang::Type::ObjCObjectPointer:
4839 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004840 return GetIndexOfChildMemberWithName (ast,
Greg Clayton9488b742010-07-28 02:04:09 +00004841 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
4842 name,
4843 omit_empty_base_classes,
4844 child_indexes);
4845 }
4846 break;
4847
4848
Greg Clayton1674b122010-07-21 22:12:05 +00004849 case clang::Type::ConstantArray:
Chris Lattner24943d22010-06-08 16:52:24 +00004850 {
4851// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4852// const uint64_t element_count = array->getSize().getLimitedValue();
4853//
4854// if (idx < element_count)
4855// {
Greg Claytonb01000f2011-01-17 03:46:26 +00004856// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner24943d22010-06-08 16:52:24 +00004857//
4858// char element_name[32];
4859// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
4860//
4861// child_name.assign(element_name);
4862// assert(field_type_info.first % 8 == 0);
4863// child_byte_size = field_type_info.first / 8;
4864// child_byte_offset = idx * child_byte_size;
4865// return array->getElementType().getAsOpaquePtr();
4866// }
4867 }
4868 break;
4869
Greg Clayton1674b122010-07-21 22:12:05 +00004870// case clang::Type::MemberPointerType:
Chris Lattner24943d22010-06-08 16:52:24 +00004871// {
4872// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
4873// QualType pointee_type = mem_ptr_type->getPointeeType();
4874//
4875// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4876// {
Greg Claytonb01000f2011-01-17 03:46:26 +00004877// return GetIndexOfChildWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004878// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
4879// name);
4880// }
4881// }
4882// break;
4883//
Greg Clayton1674b122010-07-21 22:12:05 +00004884 case clang::Type::LValueReference:
4885 case clang::Type::RValueReference:
Chris Lattner24943d22010-06-08 16:52:24 +00004886 {
Sean Callanand5b3c352011-01-27 04:42:51 +00004887 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00004888 QualType pointee_type = reference_type->getPointeeType();
4889
4890 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4891 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004892 return GetIndexOfChildMemberWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004893 reference_type->getPointeeType().getAsOpaquePtr(),
4894 name,
4895 omit_empty_base_classes,
4896 child_indexes);
4897 }
4898 }
4899 break;
4900
Greg Clayton1674b122010-07-21 22:12:05 +00004901 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00004902 {
Sean Callanand5b3c352011-01-27 04:42:51 +00004903 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00004904 QualType pointee_type = pointer_type->getPointeeType();
4905
4906 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4907 {
Greg Claytonb01000f2011-01-17 03:46:26 +00004908 return GetIndexOfChildMemberWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00004909 pointer_type->getPointeeType().getAsOpaquePtr(),
4910 name,
4911 omit_empty_base_classes,
4912 child_indexes);
4913 }
4914 else
4915 {
4916// if (parent_name)
4917// {
4918// child_name.assign(1, '*');
4919// child_name += parent_name;
4920// }
4921//
4922// // We have a pointer to an simple type
4923// if (idx == 0)
4924// {
Greg Claytonb01000f2011-01-17 03:46:26 +00004925// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner24943d22010-06-08 16:52:24 +00004926// assert(clang_type_info.first % 8 == 0);
4927// child_byte_size = clang_type_info.first / 8;
4928// child_byte_offset = 0;
4929// return pointee_type.getAsOpaquePtr();
4930// }
4931 }
4932 }
4933 break;
4934
Greg Clayton1674b122010-07-21 22:12:05 +00004935 case clang::Type::Typedef:
Greg Claytonb01000f2011-01-17 03:46:26 +00004936 return GetIndexOfChildMemberWithName (ast,
Sean Callanan9e7958e2010-12-13 01:26:27 +00004937 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner24943d22010-06-08 16:52:24 +00004938 name,
4939 omit_empty_base_classes,
4940 child_indexes);
4941
Greg Clayton19b64672013-01-04 18:10:18 +00004942 case clang::Type::Elaborated:
4943 return GetIndexOfChildMemberWithName (ast,
4944 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
4945 name,
4946 omit_empty_base_classes,
4947 child_indexes);
4948
Chris Lattner24943d22010-06-08 16:52:24 +00004949 default:
4950 break;
4951 }
4952 }
4953 return 0;
4954}
4955
4956
4957// Get the index of the child of "clang_type" whose name matches. This function
4958// doesn't descend into the children, but only looks one level deep and name
4959// matches can include base class names.
4960
4961uint32_t
4962ClangASTContext::GetIndexOfChildWithName
4963(
Greg Claytonb01000f2011-01-17 03:46:26 +00004964 ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00004965 clang_type_t clang_type,
Chris Lattner24943d22010-06-08 16:52:24 +00004966 const char *name,
4967 bool omit_empty_base_classes
4968)
4969{
4970 if (clang_type && name && name[0])
4971 {
4972 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9488b742010-07-28 02:04:09 +00004973
Greg Clayton03e0f972010-09-13 03:32:57 +00004974 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
Greg Clayton9488b742010-07-28 02:04:09 +00004975
Greg Clayton03e0f972010-09-13 03:32:57 +00004976 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00004977 {
Greg Clayton1674b122010-07-21 22:12:05 +00004978 case clang::Type::Record:
Greg Clayton7a183dc2011-01-20 04:18:48 +00004979 if (GetCompleteQualType (ast, qual_type))
Chris Lattner24943d22010-06-08 16:52:24 +00004980 {
4981 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4982 const RecordDecl *record_decl = record_type->getDecl();
4983
4984 assert(record_decl);
4985 uint32_t child_idx = 0;
4986
4987 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4988
4989 if (cxx_record_decl)
4990 {
4991 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4992 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4993 base_class != base_class_end;
4994 ++base_class)
4995 {
4996 // Skip empty base classes
4997 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4998 if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
4999 continue;
5000
Greg Claytondc0a38c2012-03-26 23:03:23 +00005001 std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(ast, base_class->getType()));
Greg Claytonb302b2f2011-06-30 02:28:26 +00005002 if (base_class_type_name.compare (name) == 0)
Chris Lattner24943d22010-06-08 16:52:24 +00005003 return child_idx;
5004 ++child_idx;
5005 }
5006 }
5007
5008 // Try and find a field that matches NAME
5009 RecordDecl::field_iterator field, field_end;
5010 StringRef name_sref(name);
5011 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
5012 field != field_end;
5013 ++field, ++child_idx)
5014 {
5015 if (field->getName().equals (name_sref))
5016 return child_idx;
5017 }
5018
5019 }
5020 break;
5021
Greg Clayton9488b742010-07-28 02:04:09 +00005022 case clang::Type::ObjCObject:
5023 case clang::Type::ObjCInterface:
Greg Clayton7a183dc2011-01-20 04:18:48 +00005024 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9488b742010-07-28 02:04:09 +00005025 {
5026 StringRef name_sref(name);
Sean Callanand5b3c352011-01-27 04:42:51 +00005027 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00005028 assert (objc_class_type);
5029 if (objc_class_type)
5030 {
5031 uint32_t child_idx = 0;
5032 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5033
5034 if (class_interface_decl)
5035 {
5036 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5037 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5038
Jim Ingham58146a92012-10-04 22:22:16 +00005039 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
Greg Clayton9488b742010-07-28 02:04:09 +00005040 {
5041 const ObjCIvarDecl* ivar_decl = *ivar_pos;
5042
5043 if (ivar_decl->getName().equals (name_sref))
5044 {
5045 if ((!omit_empty_base_classes && superclass_interface_decl) ||
5046 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
5047 ++child_idx;
5048
5049 return child_idx;
5050 }
5051 }
5052
5053 if (superclass_interface_decl)
5054 {
5055 if (superclass_interface_decl->getName().equals (name_sref))
5056 return 0;
5057 }
5058 }
5059 }
5060 }
5061 break;
5062
5063 case clang::Type::ObjCObjectPointer:
5064 {
Greg Claytonb01000f2011-01-17 03:46:26 +00005065 return GetIndexOfChildWithName (ast,
Greg Clayton9488b742010-07-28 02:04:09 +00005066 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
5067 name,
5068 omit_empty_base_classes);
5069 }
5070 break;
5071
Greg Clayton1674b122010-07-21 22:12:05 +00005072 case clang::Type::ConstantArray:
Chris Lattner24943d22010-06-08 16:52:24 +00005073 {
5074// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
5075// const uint64_t element_count = array->getSize().getLimitedValue();
5076//
5077// if (idx < element_count)
5078// {
Greg Claytonb01000f2011-01-17 03:46:26 +00005079// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner24943d22010-06-08 16:52:24 +00005080//
5081// char element_name[32];
5082// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
5083//
5084// child_name.assign(element_name);
5085// assert(field_type_info.first % 8 == 0);
5086// child_byte_size = field_type_info.first / 8;
5087// child_byte_offset = idx * child_byte_size;
5088// return array->getElementType().getAsOpaquePtr();
5089// }
5090 }
5091 break;
5092
Greg Clayton1674b122010-07-21 22:12:05 +00005093// case clang::Type::MemberPointerType:
Chris Lattner24943d22010-06-08 16:52:24 +00005094// {
5095// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
5096// QualType pointee_type = mem_ptr_type->getPointeeType();
5097//
5098// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
5099// {
Greg Claytonb01000f2011-01-17 03:46:26 +00005100// return GetIndexOfChildWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00005101// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
5102// name);
5103// }
5104// }
5105// break;
5106//
Greg Clayton1674b122010-07-21 22:12:05 +00005107 case clang::Type::LValueReference:
5108 case clang::Type::RValueReference:
Chris Lattner24943d22010-06-08 16:52:24 +00005109 {
Sean Callanand5b3c352011-01-27 04:42:51 +00005110 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00005111 QualType pointee_type = reference_type->getPointeeType();
5112
5113 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
5114 {
Greg Claytonb01000f2011-01-17 03:46:26 +00005115 return GetIndexOfChildWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00005116 reference_type->getPointeeType().getAsOpaquePtr(),
5117 name,
5118 omit_empty_base_classes);
5119 }
5120 }
5121 break;
5122
Greg Clayton1674b122010-07-21 22:12:05 +00005123 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00005124 {
Sean Callanand5b3c352011-01-27 04:42:51 +00005125 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00005126 QualType pointee_type = pointer_type->getPointeeType();
5127
5128 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
5129 {
Greg Claytonb01000f2011-01-17 03:46:26 +00005130 return GetIndexOfChildWithName (ast,
Chris Lattner24943d22010-06-08 16:52:24 +00005131 pointer_type->getPointeeType().getAsOpaquePtr(),
5132 name,
5133 omit_empty_base_classes);
5134 }
5135 else
5136 {
5137// if (parent_name)
5138// {
5139// child_name.assign(1, '*');
5140// child_name += parent_name;
5141// }
5142//
5143// // We have a pointer to an simple type
5144// if (idx == 0)
5145// {
Greg Claytonb01000f2011-01-17 03:46:26 +00005146// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner24943d22010-06-08 16:52:24 +00005147// assert(clang_type_info.first % 8 == 0);
5148// child_byte_size = clang_type_info.first / 8;
5149// child_byte_offset = 0;
5150// return pointee_type.getAsOpaquePtr();
5151// }
5152 }
5153 }
5154 break;
5155
Greg Clayton19b64672013-01-04 18:10:18 +00005156 case clang::Type::Elaborated:
5157 return GetIndexOfChildWithName (ast,
5158 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
5159 name,
5160 omit_empty_base_classes);
5161
Greg Clayton1674b122010-07-21 22:12:05 +00005162 case clang::Type::Typedef:
Greg Claytonb01000f2011-01-17 03:46:26 +00005163 return GetIndexOfChildWithName (ast,
Sean Callanan9e7958e2010-12-13 01:26:27 +00005164 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner24943d22010-06-08 16:52:24 +00005165 name,
5166 omit_empty_base_classes);
5167
5168 default:
5169 break;
5170 }
5171 }
5172 return UINT32_MAX;
5173}
5174
5175#pragma mark TagType
5176
5177bool
Greg Clayton462d4142010-09-29 01:12:09 +00005178ClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
Chris Lattner24943d22010-06-08 16:52:24 +00005179{
5180 if (tag_clang_type)
5181 {
5182 QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
Sean Callanand5b3c352011-01-27 04:42:51 +00005183 const clang::Type *clang_type = tag_qual_type.getTypePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005184 if (clang_type)
5185 {
Sean Callanand5b3c352011-01-27 04:42:51 +00005186 const TagType *tag_type = dyn_cast<TagType>(clang_type);
Chris Lattner24943d22010-06-08 16:52:24 +00005187 if (tag_type)
5188 {
5189 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
5190 if (tag_decl)
5191 {
5192 tag_decl->setTagKind ((TagDecl::TagKind)kind);
5193 return true;
5194 }
5195 }
5196 }
5197 }
5198 return false;
5199}
5200
5201
5202#pragma mark DeclContext Functions
5203
5204DeclContext *
Greg Clayton462d4142010-09-29 01:12:09 +00005205ClangASTContext::GetDeclContextForType (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005206{
5207 if (clang_type == NULL)
5208 return NULL;
5209
5210 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton03e0f972010-09-13 03:32:57 +00005211 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5212 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00005213 {
Sean Callanan9b6898f2011-07-30 02:42:06 +00005214 case clang::Type::UnaryTransform: break;
Greg Clayton9488b742010-07-28 02:04:09 +00005215 case clang::Type::FunctionNoProto: break;
5216 case clang::Type::FunctionProto: break;
5217 case clang::Type::IncompleteArray: break;
5218 case clang::Type::VariableArray: break;
5219 case clang::Type::ConstantArray: break;
Sean Callanan279584c2011-03-15 00:17:19 +00005220 case clang::Type::DependentSizedArray: break;
Greg Clayton9488b742010-07-28 02:04:09 +00005221 case clang::Type::ExtVector: break;
Sean Callanan279584c2011-03-15 00:17:19 +00005222 case clang::Type::DependentSizedExtVector: break;
Greg Clayton9488b742010-07-28 02:04:09 +00005223 case clang::Type::Vector: break;
5224 case clang::Type::Builtin: break;
5225 case clang::Type::BlockPointer: break;
5226 case clang::Type::Pointer: break;
5227 case clang::Type::LValueReference: break;
5228 case clang::Type::RValueReference: break;
5229 case clang::Type::MemberPointer: break;
5230 case clang::Type::Complex: break;
5231 case clang::Type::ObjCObject: break;
5232 case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
5233 case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
5234 case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl();
5235 case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl();
Sean Callanan9e7958e2010-12-13 01:26:27 +00005236 case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00005237 case clang::Type::Elaborated: return ClangASTContext::GetDeclContextForType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton9488b742010-07-28 02:04:09 +00005238 case clang::Type::TypeOfExpr: break;
5239 case clang::Type::TypeOf: break;
5240 case clang::Type::Decltype: break;
5241 //case clang::Type::QualifiedName: break;
5242 case clang::Type::TemplateSpecialization: break;
Sean Callanan279584c2011-03-15 00:17:19 +00005243 case clang::Type::DependentTemplateSpecialization: break;
5244 case clang::Type::TemplateTypeParm: break;
5245 case clang::Type::SubstTemplateTypeParm: break;
5246 case clang::Type::SubstTemplateTypeParmPack:break;
5247 case clang::Type::PackExpansion: break;
5248 case clang::Type::UnresolvedUsing: break;
5249 case clang::Type::Paren: break;
Sean Callanan279584c2011-03-15 00:17:19 +00005250 case clang::Type::Attributed: break;
5251 case clang::Type::Auto: break;
5252 case clang::Type::InjectedClassName: break;
5253 case clang::Type::DependentName: break;
Greg Claytonbc36a862011-10-08 00:49:15 +00005254 case clang::Type::Atomic: break;
Chris Lattner24943d22010-06-08 16:52:24 +00005255 }
5256 // No DeclContext in this type...
5257 return NULL;
5258}
5259
5260#pragma mark Namespace Declarations
5261
5262NamespaceDecl *
Greg Clayton63643042011-10-14 21:34:45 +00005263ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner24943d22010-06-08 16:52:24 +00005264{
Greg Clayton63643042011-10-14 21:34:45 +00005265 NamespaceDecl *namespace_decl = NULL;
Greg Claytonb5169392011-10-31 23:51:19 +00005266 ASTContext *ast = getASTContext();
5267 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
5268 if (decl_ctx == NULL)
5269 decl_ctx = translation_unit_decl;
5270
Chris Lattner24943d22010-06-08 16:52:24 +00005271 if (name)
5272 {
Greg Clayton63643042011-10-14 21:34:45 +00005273 IdentifierInfo &identifier_info = ast->Idents.get(name);
5274 DeclarationName decl_name (&identifier_info);
5275 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callananca8fb172012-12-21 21:34:42 +00005276 for (NamedDecl *decl : result)
Greg Clayton63643042011-10-14 21:34:45 +00005277 {
Sean Callananca8fb172012-12-21 21:34:42 +00005278 namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
Greg Clayton63643042011-10-14 21:34:45 +00005279 if (namespace_decl)
5280 return namespace_decl;
5281 }
5282
Sean Callanan8f2e3922012-02-04 08:49:35 +00005283 namespace_decl = NamespaceDecl::Create(*ast,
5284 decl_ctx,
5285 false,
5286 SourceLocation(),
5287 SourceLocation(),
5288 &identifier_info,
5289 NULL);
Greg Clayton63643042011-10-14 21:34:45 +00005290
Greg Claytonb5169392011-10-31 23:51:19 +00005291 decl_ctx->addDecl (namespace_decl);
Chris Lattner24943d22010-06-08 16:52:24 +00005292 }
Greg Claytonb5169392011-10-31 23:51:19 +00005293 else
5294 {
5295 if (decl_ctx == translation_unit_decl)
5296 {
5297 namespace_decl = translation_unit_decl->getAnonymousNamespace();
5298 if (namespace_decl)
5299 return namespace_decl;
5300
Sean Callanan8f2e3922012-02-04 08:49:35 +00005301 namespace_decl = NamespaceDecl::Create(*ast,
5302 decl_ctx,
5303 false,
5304 SourceLocation(),
5305 SourceLocation(),
5306 NULL,
5307 NULL);
Greg Claytonb5169392011-10-31 23:51:19 +00005308 translation_unit_decl->setAnonymousNamespace (namespace_decl);
5309 translation_unit_decl->addDecl (namespace_decl);
5310 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
5311 }
5312 else
5313 {
5314 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
5315 if (parent_namespace_decl)
5316 {
5317 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
5318 if (namespace_decl)
5319 return namespace_decl;
Sean Callanan8f2e3922012-02-04 08:49:35 +00005320 namespace_decl = NamespaceDecl::Create(*ast,
5321 decl_ctx,
5322 false,
5323 SourceLocation(),
5324 SourceLocation(),
5325 NULL,
5326 NULL);
Greg Claytonb5169392011-10-31 23:51:19 +00005327 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
5328 parent_namespace_decl->addDecl (namespace_decl);
5329 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
5330 }
5331 else
5332 {
5333 // BAD!!!
5334 }
5335 }
5336
5337
5338 if (namespace_decl)
5339 {
5340 // If we make it here, we are creating the anonymous namespace decl
5341 // for the first time, so we need to do the using directive magic
5342 // like SEMA does
5343 UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast,
5344 decl_ctx,
5345 SourceLocation(),
5346 SourceLocation(),
5347 NestedNameSpecifierLoc(),
5348 SourceLocation(),
5349 namespace_decl,
5350 decl_ctx);
5351 using_directive_decl->setImplicit();
5352 decl_ctx->addDecl(using_directive_decl);
5353 }
5354 }
5355#ifdef LLDB_CONFIGURATION_DEBUG
5356 VerifyDecl(namespace_decl);
5357#endif
Greg Clayton63643042011-10-14 21:34:45 +00005358 return namespace_decl;
Chris Lattner24943d22010-06-08 16:52:24 +00005359}
5360
5361
5362#pragma mark Function Types
5363
5364FunctionDecl *
Greg Clayton5f24c502011-10-14 22:47:18 +00005365ClangASTContext::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 +00005366{
Greg Clayton5f24c502011-10-14 22:47:18 +00005367 FunctionDecl *func_decl = NULL;
5368 ASTContext *ast = getASTContext();
5369 if (decl_ctx == NULL)
5370 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner24943d22010-06-08 16:52:24 +00005371
Greg Clayton5f24c502011-10-14 22:47:18 +00005372 if (name && name[0])
5373 {
5374 func_decl = FunctionDecl::Create (*ast,
5375 decl_ctx,
5376 SourceLocation(),
5377 SourceLocation(),
5378 DeclarationName (&ast->Idents.get(name)),
5379 QualType::getFromOpaquePtr(function_clang_type),
5380 NULL,
5381 (FunctionDecl::StorageClass)storage,
5382 (FunctionDecl::StorageClass)storage,
5383 is_inline);
Chris Lattner24943d22010-06-08 16:52:24 +00005384 }
Greg Clayton5f24c502011-10-14 22:47:18 +00005385 else
5386 {
5387 func_decl = FunctionDecl::Create (*ast,
5388 decl_ctx,
5389 SourceLocation(),
5390 SourceLocation(),
5391 DeclarationName (),
5392 QualType::getFromOpaquePtr(function_clang_type),
5393 NULL,
5394 (FunctionDecl::StorageClass)storage,
5395 (FunctionDecl::StorageClass)storage,
5396 is_inline);
5397 }
5398 if (func_decl)
5399 decl_ctx->addDecl (func_decl);
Sean Callananc6d161e2011-10-26 01:06:27 +00005400
5401#ifdef LLDB_CONFIGURATION_DEBUG
5402 VerifyDecl(func_decl);
5403#endif
5404
Greg Clayton5f24c502011-10-14 22:47:18 +00005405 return func_decl;
Chris Lattner24943d22010-06-08 16:52:24 +00005406}
5407
Greg Clayton462d4142010-09-29 01:12:09 +00005408clang_type_t
Greg Claytonb01000f2011-01-17 03:46:26 +00005409ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Clayton462d4142010-09-29 01:12:09 +00005410 clang_type_t result_type,
5411 clang_type_t *args,
Sean Callanan2ea8f272010-09-16 20:40:25 +00005412 unsigned num_args,
5413 bool is_variadic,
5414 unsigned type_quals)
Chris Lattner24943d22010-06-08 16:52:24 +00005415{
Greg Claytonb01000f2011-01-17 03:46:26 +00005416 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +00005417 std::vector<QualType> qual_type_args;
5418 for (unsigned i=0; i<num_args; ++i)
5419 qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
5420
5421 // TODO: Detect calling convention in DWARF?
Sean Callananad293092011-01-18 23:32:05 +00005422 FunctionProtoType::ExtProtoInfo proto_info;
5423 proto_info.Variadic = is_variadic;
Sean Callanan279584c2011-03-15 00:17:19 +00005424 proto_info.ExceptionSpecType = EST_None;
Sean Callananad293092011-01-18 23:32:05 +00005425 proto_info.TypeQuals = type_quals;
Sean Callanan279584c2011-03-15 00:17:19 +00005426 proto_info.RefQualifier = RQ_None;
Sean Callananad293092011-01-18 23:32:05 +00005427 proto_info.NumExceptions = 0;
5428 proto_info.Exceptions = NULL;
5429
Greg Clayton5f24c502011-10-14 22:47:18 +00005430 return ast->getFunctionType (QualType::getFromOpaquePtr(result_type),
Sean Callanan62afa492013-03-09 01:59:31 +00005431 qual_type_args,
5432 proto_info).getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005433}
5434
5435ParmVarDecl *
Greg Clayton462d4142010-09-29 01:12:09 +00005436ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
Chris Lattner24943d22010-06-08 16:52:24 +00005437{
Greg Claytonb01000f2011-01-17 03:46:26 +00005438 ASTContext *ast = getASTContext();
5439 assert (ast != NULL);
5440 return ParmVarDecl::Create(*ast,
5441 ast->getTranslationUnitDecl(),
Chris Lattner24943d22010-06-08 16:52:24 +00005442 SourceLocation(),
Sean Callanan279584c2011-03-15 00:17:19 +00005443 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00005444 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callanan2ea8f272010-09-16 20:40:25 +00005445 QualType::getFromOpaquePtr(param_type),
Chris Lattner24943d22010-06-08 16:52:24 +00005446 NULL,
5447 (VarDecl::StorageClass)storage,
Chris Lattner24943d22010-06-08 16:52:24 +00005448 0);
5449}
5450
5451void
5452ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
5453{
5454 if (function_decl)
Sean Callananc1535182011-10-07 23:18:13 +00005455 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner24943d22010-06-08 16:52:24 +00005456}
5457
5458
5459#pragma mark Array Types
5460
Greg Clayton462d4142010-09-29 01:12:09 +00005461clang_type_t
Greg Claytonf95fc9e2013-04-05 23:27:21 +00005462ClangASTContext::CreateArrayType (clang_type_t element_type,
5463 size_t element_count,
5464 bool is_vector)
Chris Lattner24943d22010-06-08 16:52:24 +00005465{
5466 if (element_type)
5467 {
Greg Claytonb01000f2011-01-17 03:46:26 +00005468 ASTContext *ast = getASTContext();
5469 assert (ast != NULL);
Greg Claytonb9124572012-12-06 02:33:54 +00005470
Greg Claytonf95fc9e2013-04-05 23:27:21 +00005471 QualType element_qual_type(QualType::getFromOpaquePtr(element_type));
5472
5473 if (is_vector)
5474 {
5475 return ast->getExtVectorType(element_qual_type, element_count).getAsOpaquePtr();
Greg Claytonb9124572012-12-06 02:33:54 +00005476 }
5477 else
5478 {
Greg Claytonf95fc9e2013-04-05 23:27:21 +00005479
5480 llvm::APInt ap_element_count (64, element_count);
5481 if (element_count == 0)
5482 {
5483 return ast->getIncompleteArrayType(element_qual_type,
5484 ArrayType::Normal,
5485 0).getAsOpaquePtr();
5486
5487 }
5488 else
5489 {
5490 return ast->getConstantArrayType(element_qual_type,
5491 ap_element_count,
5492 ArrayType::Normal,
5493 0).getAsOpaquePtr(); // ElemQuals
5494 }
Greg Claytonb9124572012-12-06 02:33:54 +00005495 }
Chris Lattner24943d22010-06-08 16:52:24 +00005496 }
5497 return NULL;
5498}
5499
5500
5501#pragma mark TagDecl
5502
5503bool
Greg Clayton462d4142010-09-29 01:12:09 +00005504ClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005505{
5506 if (clang_type)
5507 {
5508 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Sean Callanand5b3c352011-01-27 04:42:51 +00005509 const clang::Type *t = qual_type.getTypePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005510 if (t)
5511 {
Sean Callanand5b3c352011-01-27 04:42:51 +00005512 const TagType *tag_type = dyn_cast<TagType>(t);
Chris Lattner24943d22010-06-08 16:52:24 +00005513 if (tag_type)
5514 {
5515 TagDecl *tag_decl = tag_type->getDecl();
5516 if (tag_decl)
5517 {
5518 tag_decl->startDefinition();
5519 return true;
5520 }
5521 }
Sean Callanan8f2e3922012-02-04 08:49:35 +00005522
5523 const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(t);
5524 if (object_type)
5525 {
5526 ObjCInterfaceDecl *interface_decl = object_type->getInterface();
5527 if (interface_decl)
5528 {
5529 interface_decl->startDefinition();
5530 return true;
5531 }
5532 }
Chris Lattner24943d22010-06-08 16:52:24 +00005533 }
5534 }
5535 return false;
5536}
5537
5538bool
Greg Clayton462d4142010-09-29 01:12:09 +00005539ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005540{
5541 if (clang_type)
5542 {
5543 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton55b6c532010-09-29 03:44:17 +00005544
5545 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5546
5547 if (cxx_record_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00005548 {
Greg Clayton55b6c532010-09-29 03:44:17 +00005549 cxx_record_decl->completeDefinition();
5550
5551 return true;
5552 }
5553
5554 const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
5555
5556 if (enum_type)
5557 {
5558 EnumDecl *enum_decl = enum_type->getDecl();
5559
5560 if (enum_decl)
Chris Lattner24943d22010-06-08 16:52:24 +00005561 {
Greg Clayton55b6c532010-09-29 03:44:17 +00005562 /// TODO This really needs to be fixed.
5563
5564 unsigned NumPositiveBits = 1;
5565 unsigned NumNegativeBits = 0;
5566
Greg Claytonb01000f2011-01-17 03:46:26 +00005567 ASTContext *ast = getASTContext();
Greg Clayton48fbdf72010-10-12 04:29:14 +00005568
5569 QualType promotion_qual_type;
5570 // If the enum integer type is less than an integer in bit width,
5571 // then we must promote it to an integer size.
Greg Claytonb01000f2011-01-17 03:46:26 +00005572 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
Greg Clayton48fbdf72010-10-12 04:29:14 +00005573 {
5574 if (enum_decl->getIntegerType()->isSignedIntegerType())
Greg Claytonb01000f2011-01-17 03:46:26 +00005575 promotion_qual_type = ast->IntTy;
Greg Clayton48fbdf72010-10-12 04:29:14 +00005576 else
Greg Claytonb01000f2011-01-17 03:46:26 +00005577 promotion_qual_type = ast->UnsignedIntTy;
Greg Clayton48fbdf72010-10-12 04:29:14 +00005578 }
5579 else
5580 promotion_qual_type = enum_decl->getIntegerType();
5581
5582 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Clayton55b6c532010-09-29 03:44:17 +00005583 return true;
Chris Lattner24943d22010-06-08 16:52:24 +00005584 }
5585 }
5586 }
5587 return false;
5588}
5589
5590
5591#pragma mark Enumeration Types
5592
Greg Clayton462d4142010-09-29 01:12:09 +00005593clang_type_t
Greg Clayton0d62dfd2011-01-14 04:54:56 +00005594ClangASTContext::CreateEnumerationType
5595(
5596 const char *name,
5597 DeclContext *decl_ctx,
5598 const Declaration &decl,
5599 clang_type_t integer_qual_type
5600)
Chris Lattner24943d22010-06-08 16:52:24 +00005601{
5602 // TODO: Do something intelligent with the Declaration object passed in
5603 // like maybe filling in the SourceLocation with it...
Greg Claytonb01000f2011-01-17 03:46:26 +00005604 ASTContext *ast = getASTContext();
5605 assert (ast != NULL);
Greg Clayton48fbdf72010-10-12 04:29:14 +00005606
5607 // TODO: ask about these...
5608// const bool IsScoped = false;
5609// const bool IsFixed = false;
5610
Greg Claytonb01000f2011-01-17 03:46:26 +00005611 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Clayton0d62dfd2011-01-14 04:54:56 +00005612 decl_ctx,
Greg Clayton48fbdf72010-10-12 04:29:14 +00005613 SourceLocation(),
Greg Clayton48fbdf72010-10-12 04:29:14 +00005614 SourceLocation(),
Sean Callanan279584c2011-03-15 00:17:19 +00005615 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callanan9e7958e2010-12-13 01:26:27 +00005616 NULL,
5617 false, // IsScoped
5618 false, // IsScopedUsingClassTag
5619 false); // IsFixed
Sean Callanan864bfdb2011-01-18 01:03:44 +00005620
5621
Chris Lattner24943d22010-06-08 16:52:24 +00005622 if (enum_decl)
Greg Claytone37f23c2010-09-12 23:17:56 +00005623 {
5624 // TODO: check if we should be setting the promotion type too?
5625 enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
Sean Callanan864bfdb2011-01-18 01:03:44 +00005626
5627 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
5628
Greg Claytonb01000f2011-01-17 03:46:26 +00005629 return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
Greg Claytone37f23c2010-09-12 23:17:56 +00005630 }
Chris Lattner24943d22010-06-08 16:52:24 +00005631 return NULL;
5632}
5633
Greg Clayton462d4142010-09-29 01:12:09 +00005634clang_type_t
5635ClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
5636{
5637 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
5638
Sean Callanand5b3c352011-01-27 04:42:51 +00005639 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Greg Clayton462d4142010-09-29 01:12:09 +00005640 if (clang_type)
5641 {
5642 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5643 if (enum_type)
5644 {
5645 EnumDecl *enum_decl = enum_type->getDecl();
5646 if (enum_decl)
5647 return enum_decl->getIntegerType().getAsOpaquePtr();
5648 }
5649 }
5650 return NULL;
5651}
Chris Lattner24943d22010-06-08 16:52:24 +00005652bool
5653ClangASTContext::AddEnumerationValueToEnumerationType
5654(
Greg Clayton462d4142010-09-29 01:12:09 +00005655 clang_type_t enum_clang_type,
5656 clang_type_t enumerator_clang_type,
Chris Lattner24943d22010-06-08 16:52:24 +00005657 const Declaration &decl,
5658 const char *name,
5659 int64_t enum_value,
5660 uint32_t enum_value_bit_size
5661)
5662{
5663 if (enum_clang_type && enumerator_clang_type && name)
5664 {
5665 // TODO: Do something intelligent with the Declaration object passed in
5666 // like maybe filling in the SourceLocation with it...
Greg Claytonb01000f2011-01-17 03:46:26 +00005667 ASTContext *ast = getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00005668 IdentifierTable *identifier_table = getIdentifierTable();
5669
Greg Claytonb01000f2011-01-17 03:46:26 +00005670 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +00005671 assert (identifier_table != NULL);
5672 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
5673
Greg Claytond5e48bd2013-03-05 23:54:39 +00005674 bool is_signed = false;
5675 IsIntegerType (enumerator_clang_type, is_signed);
Sean Callanand5b3c352011-01-27 04:42:51 +00005676 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005677 if (clang_type)
5678 {
5679 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5680
5681 if (enum_type)
5682 {
Greg Claytond5e48bd2013-03-05 23:54:39 +00005683 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
Chris Lattner24943d22010-06-08 16:52:24 +00005684 enum_llvm_apsint = enum_value;
5685 EnumConstantDecl *enumerator_decl =
Greg Claytonb01000f2011-01-17 03:46:26 +00005686 EnumConstantDecl::Create (*ast,
5687 enum_type->getDecl(),
5688 SourceLocation(),
5689 name ? &identifier_table->get(name) : NULL, // Identifier
5690 QualType::getFromOpaquePtr(enumerator_clang_type),
5691 NULL,
5692 enum_llvm_apsint);
5693
Chris Lattner24943d22010-06-08 16:52:24 +00005694 if (enumerator_decl)
5695 {
5696 enum_type->getDecl()->addDecl(enumerator_decl);
Sean Callananc6d161e2011-10-26 01:06:27 +00005697
5698#ifdef LLDB_CONFIGURATION_DEBUG
5699 VerifyDecl(enumerator_decl);
5700#endif
5701
Chris Lattner24943d22010-06-08 16:52:24 +00005702 return true;
5703 }
5704 }
5705 }
5706 }
5707 return false;
5708}
5709
5710#pragma mark Pointers & References
5711
Greg Clayton462d4142010-09-29 01:12:09 +00005712clang_type_t
5713ClangASTContext::CreatePointerType (clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005714{
Greg Clayton427f2902010-12-14 02:59:59 +00005715 return CreatePointerType (getASTContext(), clang_type);
5716}
5717
5718clang_type_t
5719ClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
5720{
5721 if (ast && clang_type)
Greg Clayton7b541032010-07-29 20:06:32 +00005722 {
5723 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5724
Greg Clayton03e0f972010-09-13 03:32:57 +00005725 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5726 switch (type_class)
Greg Clayton7b541032010-07-29 20:06:32 +00005727 {
5728 case clang::Type::ObjCObject:
5729 case clang::Type::ObjCInterface:
Greg Clayton427f2902010-12-14 02:59:59 +00005730 return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
Greg Clayton7b541032010-07-29 20:06:32 +00005731
Greg Clayton7b541032010-07-29 20:06:32 +00005732 default:
Greg Clayton427f2902010-12-14 02:59:59 +00005733 return ast->getPointerType(qual_type).getAsOpaquePtr();
Greg Clayton7b541032010-07-29 20:06:32 +00005734 }
5735 }
Chris Lattner24943d22010-06-08 16:52:24 +00005736 return NULL;
5737}
5738
Greg Clayton462d4142010-09-29 01:12:09 +00005739clang_type_t
Sean Callanan6a925532011-01-13 08:53:35 +00005740ClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
5741 clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005742{
5743 if (clang_type)
Sean Callanan6a925532011-01-13 08:53:35 +00005744 return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005745 return NULL;
5746}
5747
Greg Clayton462d4142010-09-29 01:12:09 +00005748clang_type_t
Sean Callanan6a925532011-01-13 08:53:35 +00005749ClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
5750 clang_type_t clang_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005751{
5752 if (clang_type)
Sean Callanan6a925532011-01-13 08:53:35 +00005753 return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00005754 return NULL;
5755}
5756
Greg Clayton462d4142010-09-29 01:12:09 +00005757clang_type_t
5758ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
Greg Claytonfa970692010-06-12 01:20:30 +00005759{
5760 if (clang_pointee_type && clang_pointee_type)
5761 return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
5762 QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
5763 return NULL;
5764}
5765
Greg Claytonfe6dc6e2013-03-14 18:31:44 +00005766uint64_t
Chris Lattner24943d22010-06-08 16:52:24 +00005767ClangASTContext::GetPointerBitSize ()
5768{
Greg Claytonb01000f2011-01-17 03:46:26 +00005769 ASTContext *ast = getASTContext();
5770 return ast->getTypeSize(ast->VoidPtrTy);
Chris Lattner24943d22010-06-08 16:52:24 +00005771}
5772
5773bool
Greg Clayton3356d4f2012-03-30 00:51:13 +00005774ClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast,
5775 clang_type_t clang_type,
5776 clang_type_t *dynamic_pointee_type,
5777 bool check_cplusplus,
5778 bool check_objc)
Greg Clayton917c0002011-06-29 22:09:02 +00005779{
5780 QualType pointee_qual_type;
5781 if (clang_type)
5782 {
Greg Claytonf62ba432013-04-30 22:29:29 +00005783 QualType qual_type (QualType::getFromOpaquePtr(clang_type).getCanonicalType());
Greg Clayton917c0002011-06-29 22:09:02 +00005784 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5785 bool success = false;
5786 switch (type_class)
5787 {
5788 case clang::Type::Builtin:
Greg Clayton3356d4f2012-03-30 00:51:13 +00005789 if (check_objc && cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
Greg Clayton917c0002011-06-29 22:09:02 +00005790 {
5791 if (dynamic_pointee_type)
5792 *dynamic_pointee_type = clang_type;
5793 return true;
5794 }
5795 break;
5796
5797 case clang::Type::ObjCObjectPointer:
Greg Clayton3356d4f2012-03-30 00:51:13 +00005798 if (check_objc)
5799 {
5800 if (dynamic_pointee_type)
5801 *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5802 return true;
5803 }
5804 break;
Greg Clayton917c0002011-06-29 22:09:02 +00005805
5806 case clang::Type::Pointer:
5807 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
5808 success = true;
5809 break;
5810
5811 case clang::Type::LValueReference:
5812 case clang::Type::RValueReference:
5813 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
5814 success = true;
5815 break;
5816
5817 case clang::Type::Typedef:
Greg Clayton9b90e872012-08-31 18:56:24 +00005818 return ClangASTContext::IsPossibleDynamicType (ast,
5819 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
5820 dynamic_pointee_type,
5821 check_cplusplus,
5822 check_objc);
Sean Callananc6139712011-08-11 23:56:13 +00005823
5824 case clang::Type::Elaborated:
Greg Clayton9b90e872012-08-31 18:56:24 +00005825 return ClangASTContext::IsPossibleDynamicType (ast,
5826 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
5827 dynamic_pointee_type,
5828 check_cplusplus,
5829 check_objc);
Sean Callananc6139712011-08-11 23:56:13 +00005830
Greg Clayton917c0002011-06-29 22:09:02 +00005831 default:
5832 break;
5833 }
5834
5835 if (success)
5836 {
5837 // Check to make sure what we are pointing too is a possible dynamic C++ type
5838 // We currently accept any "void *" (in case we have a class that has been
5839 // watered down to an opaque pointer) and virtual C++ classes.
Greg Claytonf62ba432013-04-30 22:29:29 +00005840 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
Greg Clayton917c0002011-06-29 22:09:02 +00005841 switch (pointee_type_class)
5842 {
5843 case clang::Type::Builtin:
5844 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
5845 {
5846 case clang::BuiltinType::UnknownAny:
5847 case clang::BuiltinType::Void:
5848 if (dynamic_pointee_type)
5849 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5850 return true;
5851
5852 case clang::BuiltinType::NullPtr:
5853 case clang::BuiltinType::Bool:
5854 case clang::BuiltinType::Char_U:
5855 case clang::BuiltinType::UChar:
5856 case clang::BuiltinType::WChar_U:
5857 case clang::BuiltinType::Char16:
5858 case clang::BuiltinType::Char32:
5859 case clang::BuiltinType::UShort:
5860 case clang::BuiltinType::UInt:
5861 case clang::BuiltinType::ULong:
5862 case clang::BuiltinType::ULongLong:
5863 case clang::BuiltinType::UInt128:
5864 case clang::BuiltinType::Char_S:
5865 case clang::BuiltinType::SChar:
5866 case clang::BuiltinType::WChar_S:
5867 case clang::BuiltinType::Short:
5868 case clang::BuiltinType::Int:
5869 case clang::BuiltinType::Long:
5870 case clang::BuiltinType::LongLong:
5871 case clang::BuiltinType::Int128:
5872 case clang::BuiltinType::Float:
5873 case clang::BuiltinType::Double:
5874 case clang::BuiltinType::LongDouble:
5875 case clang::BuiltinType::Dependent:
5876 case clang::BuiltinType::Overload:
5877 case clang::BuiltinType::ObjCId:
5878 case clang::BuiltinType::ObjCClass:
5879 case clang::BuiltinType::ObjCSel:
5880 case clang::BuiltinType::BoundMember:
Greg Claytonf6a5bd72011-10-22 03:33:13 +00005881 case clang::BuiltinType::Half:
5882 case clang::BuiltinType::ARCUnbridgedCast:
Greg Clayton32e25642011-11-09 19:04:58 +00005883 case clang::BuiltinType::PseudoObject:
Sean Callanan06dc17f2012-09-24 22:25:51 +00005884 case clang::BuiltinType::BuiltinFn:
Greg Claytond0250852013-02-01 00:46:49 +00005885 case clang::BuiltinType::OCLEvent:
5886 case clang::BuiltinType::OCLImage1d:
5887 case clang::BuiltinType::OCLImage1dArray:
5888 case clang::BuiltinType::OCLImage1dBuffer:
5889 case clang::BuiltinType::OCLImage2d:
5890 case clang::BuiltinType::OCLImage2dArray:
5891 case clang::BuiltinType::OCLImage3d:
Greg Claytonc1130562013-02-13 18:15:56 +00005892 case clang::BuiltinType::OCLSampler:
Greg Clayton917c0002011-06-29 22:09:02 +00005893 break;
5894 }
5895 break;
5896
5897 case clang::Type::Record:
Greg Clayton3356d4f2012-03-30 00:51:13 +00005898 if (check_cplusplus)
Greg Clayton917c0002011-06-29 22:09:02 +00005899 {
5900 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
5901 if (cxx_record_decl)
5902 {
Greg Clayton9b90e872012-08-31 18:56:24 +00005903 bool is_complete = cxx_record_decl->isCompleteDefinition();
Greg Clayton9c091812013-03-08 01:37:30 +00005904
Greg Clayton9b90e872012-08-31 18:56:24 +00005905 if (is_complete)
Greg Clayton917c0002011-06-29 22:09:02 +00005906 success = cxx_record_decl->isDynamicClass();
Greg Clayton917c0002011-06-29 22:09:02 +00005907 else
5908 {
Greg Clayton017c16a2013-03-27 01:48:02 +00005909 ClangASTMetadata *metadata = GetMetadata (ast, cxx_record_decl);
Greg Clayton9c091812013-03-08 01:37:30 +00005910 if (metadata)
5911 success = metadata->GetIsDynamicCXXType();
5912 else
5913 {
5914 is_complete = ClangASTContext::GetCompleteType (ast, pointee_qual_type.getAsOpaquePtr());
5915 if (is_complete)
5916 success = cxx_record_decl->isDynamicClass();
5917 else
5918 success = false;
5919 }
Greg Clayton917c0002011-06-29 22:09:02 +00005920 }
Greg Clayton9b90e872012-08-31 18:56:24 +00005921
Greg Clayton917c0002011-06-29 22:09:02 +00005922 if (success)
5923 {
5924 if (dynamic_pointee_type)
5925 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5926 return true;
5927 }
5928 }
5929 }
5930 break;
5931
5932 case clang::Type::ObjCObject:
5933 case clang::Type::ObjCInterface:
Greg Clayton3356d4f2012-03-30 00:51:13 +00005934 if (check_objc)
5935 {
5936 if (dynamic_pointee_type)
5937 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5938 return true;
5939 }
5940 break;
Greg Clayton917c0002011-06-29 22:09:02 +00005941
5942 default:
5943 break;
5944 }
5945 }
5946 }
5947 if (dynamic_pointee_type)
5948 *dynamic_pointee_type = NULL;
5949 return false;
5950}
5951
5952
5953bool
Greg Clayton82f07462011-05-30 00:49:24 +00005954ClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
5955{
Greg Clayton3356d4f2012-03-30 00:51:13 +00005956 return IsPossibleDynamicType (ast,
5957 clang_type,
5958 dynamic_pointee_type,
5959 true, // Check for dynamic C++ types
5960 false); // Check for dynamic ObjC types
Greg Clayton82f07462011-05-30 00:49:24 +00005961}
5962
Sean Callanan6f3bde72011-10-27 19:41:13 +00005963bool
5964ClangASTContext::IsReferenceType (clang_type_t clang_type, clang_type_t *target_type)
5965{
5966 if (clang_type == NULL)
5967 return false;
5968
5969 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5970 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5971
5972 switch (type_class)
5973 {
5974 case clang::Type::LValueReference:
5975 if (target_type)
5976 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5977 return true;
5978 case clang::Type::RValueReference:
5979 if (target_type)
5980 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5981 return true;
5982 case clang::Type::Typedef:
5983 return ClangASTContext::IsReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5984 case clang::Type::Elaborated:
5985 return ClangASTContext::IsReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5986 default:
5987 break;
5988 }
5989
5990 return false;
5991}
Greg Clayton82f07462011-05-30 00:49:24 +00005992
5993bool
Greg Clayton462d4142010-09-29 01:12:09 +00005994ClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
Chris Lattner24943d22010-06-08 16:52:24 +00005995{
5996 if (clang_type == NULL)
5997 return false;
5998
5999 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton03e0f972010-09-13 03:32:57 +00006000 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6001 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00006002 {
Sean Callanan04325062010-10-25 00:29:48 +00006003 case clang::Type::Builtin:
6004 switch (cast<clang::BuiltinType>(qual_type)->getKind())
6005 {
6006 default:
6007 break;
6008 case clang::BuiltinType::ObjCId:
6009 case clang::BuiltinType::ObjCClass:
Sean Callanan04325062010-10-25 00:29:48 +00006010 return true;
6011 }
6012 return false;
Greg Clayton1674b122010-07-21 22:12:05 +00006013 case clang::Type::ObjCObjectPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00006014 if (target_type)
6015 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
6016 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006017 case clang::Type::BlockPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00006018 if (target_type)
6019 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
6020 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006021 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00006022 if (target_type)
6023 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
6024 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006025 case clang::Type::MemberPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00006026 if (target_type)
6027 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
6028 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006029 case clang::Type::LValueReference:
Chris Lattner24943d22010-06-08 16:52:24 +00006030 if (target_type)
6031 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
6032 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006033 case clang::Type::RValueReference:
Chris Lattner24943d22010-06-08 16:52:24 +00006034 if (target_type)
6035 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
6036 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006037 case clang::Type::Typedef:
Sean Callanan9e7958e2010-12-13 01:26:27 +00006038 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00006039 case clang::Type::Elaborated:
6040 return ClangASTContext::IsPointerOrReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Chris Lattner24943d22010-06-08 16:52:24 +00006041 default:
6042 break;
6043 }
6044 return false;
6045}
6046
Chris Lattner24943d22010-06-08 16:52:24 +00006047bool
Greg Clayton462d4142010-09-29 01:12:09 +00006048ClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
Chris Lattner24943d22010-06-08 16:52:24 +00006049{
6050 if (!clang_type)
6051 return false;
6052
6053 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6054 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
6055
6056 if (builtin_type)
6057 {
6058 if (builtin_type->isInteger())
Jim Ingham016ef882011-12-22 19:12:40 +00006059 {
Chris Lattner24943d22010-06-08 16:52:24 +00006060 is_signed = builtin_type->isSignedInteger();
Jim Ingham016ef882011-12-22 19:12:40 +00006061 return true;
6062 }
Chris Lattner24943d22010-06-08 16:52:24 +00006063 }
6064
6065 return false;
6066}
6067
6068bool
Greg Clayton19c0d582011-07-08 18:27:39 +00006069ClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t *target_type)
Chris Lattner24943d22010-06-08 16:52:24 +00006070{
Greg Clayton19c0d582011-07-08 18:27:39 +00006071 if (target_type)
6072 *target_type = NULL;
6073
Chris Lattner24943d22010-06-08 16:52:24 +00006074 if (clang_type)
6075 {
6076 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton03e0f972010-09-13 03:32:57 +00006077 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6078 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00006079 {
Sean Callanan04325062010-10-25 00:29:48 +00006080 case clang::Type::Builtin:
6081 switch (cast<clang::BuiltinType>(qual_type)->getKind())
6082 {
6083 default:
6084 break;
6085 case clang::BuiltinType::ObjCId:
6086 case clang::BuiltinType::ObjCClass:
Sean Callanan04325062010-10-25 00:29:48 +00006087 return true;
6088 }
6089 return false;
Greg Clayton1674b122010-07-21 22:12:05 +00006090 case clang::Type::ObjCObjectPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00006091 if (target_type)
6092 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
6093 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006094 case clang::Type::BlockPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00006095 if (target_type)
6096 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
6097 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006098 case clang::Type::Pointer:
Chris Lattner24943d22010-06-08 16:52:24 +00006099 if (target_type)
6100 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
6101 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006102 case clang::Type::MemberPointer:
Chris Lattner24943d22010-06-08 16:52:24 +00006103 if (target_type)
6104 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
6105 return true;
Greg Clayton1674b122010-07-21 22:12:05 +00006106 case clang::Type::Typedef:
Greg Clayton19c0d582011-07-08 18:27:39 +00006107 return ClangASTContext::IsPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
Sean Callananc6139712011-08-11 23:56:13 +00006108 case clang::Type::Elaborated:
6109 return ClangASTContext::IsPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), target_type);
Chris Lattner24943d22010-06-08 16:52:24 +00006110 default:
6111 break;
6112 }
6113 }
6114 return false;
6115}
6116
6117bool
Greg Clayton462d4142010-09-29 01:12:09 +00006118ClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
Chris Lattner24943d22010-06-08 16:52:24 +00006119{
6120 if (clang_type)
6121 {
6122 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6123
6124 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
6125 {
6126 clang::BuiltinType::Kind kind = BT->getKind();
6127 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
6128 {
6129 count = 1;
6130 is_complex = false;
6131 return true;
6132 }
6133 }
6134 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
6135 {
6136 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
6137 {
6138 count = 2;
6139 is_complex = true;
6140 return true;
6141 }
6142 }
6143 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
6144 {
6145 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
6146 {
6147 count = VT->getNumElements();
6148 is_complex = false;
6149 return true;
6150 }
6151 }
6152 }
6153 return false;
6154}
6155
Enrico Granata9762e102011-07-06 02:13:41 +00006156bool
6157ClangASTContext::IsScalarType (lldb::clang_type_t clang_type)
6158{
6159 bool is_signed;
6160 if (ClangASTContext::IsIntegerType(clang_type, is_signed))
6161 return true;
6162
6163 uint32_t count;
6164 bool is_complex;
6165 return ClangASTContext::IsFloatingPointType(clang_type, count, is_complex) && !is_complex;
6166}
6167
6168bool
6169ClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type)
6170{
6171 if (!IsPointerType(clang_type))
6172 return false;
6173
6174 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6175 lldb::clang_type_t pointee_type = qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr();
6176 return IsScalarType(pointee_type);
6177}
6178
6179bool
6180ClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type)
6181{
Greg Claytonb9124572012-12-06 02:33:54 +00006182 clang_type = GetAsArrayType(clang_type, NULL, NULL, NULL);
Sean Callananebad95d2012-01-19 23:54:24 +00006183
6184 if (clang_type == 0)
Enrico Granata9762e102011-07-06 02:13:41 +00006185 return false;
6186
6187 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6188 lldb::clang_type_t item_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
6189 return IsScalarType(item_type);
6190}
6191
Greg Claytonbf8e42b2010-10-14 22:52:14 +00006192
6193bool
6194ClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
6195{
6196 if (clang_type)
6197 {
6198 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6199
6200 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6201 if (cxx_record_decl)
6202 {
6203 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
6204 return true;
6205 }
6206 }
6207 class_name.clear();
6208 return false;
6209}
6210
6211
Greg Clayton1d8173f2010-09-24 05:15:53 +00006212bool
Greg Clayton462d4142010-09-29 01:12:09 +00006213ClangASTContext::IsCXXClassType (clang_type_t clang_type)
Greg Clayton1d8173f2010-09-24 05:15:53 +00006214{
6215 if (clang_type)
6216 {
6217 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6218 if (qual_type->getAsCXXRecordDecl() != NULL)
6219 return true;
6220 }
6221 return false;
6222}
6223
Greg Clayton9f54ab72011-10-13 23:13:20 +00006224bool
6225ClangASTContext::IsBeingDefined (lldb::clang_type_t clang_type)
6226{
6227 if (clang_type)
6228 {
6229 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6230 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type);
6231 if (tag_type)
6232 return tag_type->isBeingDefined();
6233 }
6234 return false;
6235}
6236
Greg Clayton1d8173f2010-09-24 05:15:53 +00006237bool
Greg Clayton462d4142010-09-29 01:12:09 +00006238ClangASTContext::IsObjCClassType (clang_type_t clang_type)
Greg Clayton1d8173f2010-09-24 05:15:53 +00006239{
6240 if (clang_type)
6241 {
6242 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6243 if (qual_type->isObjCObjectOrInterfaceType())
6244 return true;
6245 }
6246 return false;
6247}
6248
Sean Callanan931acec2012-02-22 23:57:45 +00006249bool
6250ClangASTContext::IsObjCObjectPointerType (lldb::clang_type_t clang_type, clang_type_t *class_type)
6251{
6252 if (clang_type)
6253 {
6254 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6255 if (qual_type->isObjCObjectPointerType())
6256 {
6257 if (class_type)
6258 {
6259 *class_type = NULL;
6260
6261 if (!qual_type->isObjCClassType() &&
6262 !qual_type->isObjCIdType())
6263 {
6264 const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type);
Sean Callananfe1e5ec2012-03-10 01:59:11 +00006265 if (!obj_pointer_type)
6266 *class_type = NULL;
Sean Callanan9a357a42012-03-10 02:00:32 +00006267 else
6268 *class_type = QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr();
Sean Callanan931acec2012-02-22 23:57:45 +00006269 }
6270 }
6271 return true;
6272 }
6273 }
6274 return false;
6275}
6276
6277bool
6278ClangASTContext::GetObjCClassName (lldb::clang_type_t clang_type,
6279 std::string &class_name)
6280{
6281 if (!clang_type)
6282 return false;
6283
6284 const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(QualType::getFromOpaquePtr(clang_type));
6285 if (!object_type)
6286 return false;
6287
6288 const ObjCInterfaceDecl *interface = object_type->getInterface();
6289 if (!interface)
6290 return false;
6291
6292 class_name = interface->getNameAsString();
6293 return true;
6294}
Greg Clayton1d8173f2010-09-24 05:15:53 +00006295
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006296bool
6297ClangASTContext::IsCharType (clang_type_t clang_type)
6298{
6299 if (clang_type)
6300 return QualType::getFromOpaquePtr(clang_type)->isCharType();
6301 return false;
6302}
Chris Lattner24943d22010-06-08 16:52:24 +00006303
6304bool
Greg Clayton462d4142010-09-29 01:12:09 +00006305ClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
Chris Lattner24943d22010-06-08 16:52:24 +00006306{
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006307 clang_type_t pointee_or_element_clang_type = NULL;
6308 Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
6309
6310 if (pointee_or_element_clang_type == NULL)
6311 return false;
6312
6313 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
Chris Lattner24943d22010-06-08 16:52:24 +00006314 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006315 QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
6316
6317 if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
Chris Lattner24943d22010-06-08 16:52:24 +00006318 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006319 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6320 if (type_flags.Test (eTypeIsArray))
Chris Lattner24943d22010-06-08 16:52:24 +00006321 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006322 // We know the size of the array and it could be a C string
6323 // since it is an array of characters
6324 length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
6325 return true;
Chris Lattner24943d22010-06-08 16:52:24 +00006326 }
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006327 else
Chris Lattner24943d22010-06-08 16:52:24 +00006328 {
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006329 length = 0;
6330 return true;
Chris Lattner24943d22010-06-08 16:52:24 +00006331 }
Chris Lattner24943d22010-06-08 16:52:24 +00006332
Chris Lattner24943d22010-06-08 16:52:24 +00006333 }
6334 }
6335 return false;
6336}
6337
6338bool
Greg Clayton462d4142010-09-29 01:12:09 +00006339ClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
Greg Clayton03e0f972010-09-13 03:32:57 +00006340{
6341 if (clang_type)
6342 {
6343 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6344
6345 if (qual_type->isFunctionPointerType())
6346 return true;
6347
6348 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6349 switch (type_class)
6350 {
Sean Callanan279584c2011-03-15 00:17:19 +00006351 default:
6352 break;
Greg Clayton03e0f972010-09-13 03:32:57 +00006353 case clang::Type::Typedef:
Sean Callanan9e7958e2010-12-13 01:26:27 +00006354 return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00006355 case clang::Type::Elaborated:
6356 return ClangASTContext::IsFunctionPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton03e0f972010-09-13 03:32:57 +00006357
6358 case clang::Type::LValueReference:
6359 case clang::Type::RValueReference:
6360 {
Sean Callanand5b3c352011-01-27 04:42:51 +00006361 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton03e0f972010-09-13 03:32:57 +00006362 if (reference_type)
6363 return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
6364 }
6365 break;
6366 }
6367 }
6368 return false;
6369}
6370
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006371size_t
6372ClangASTContext::GetArraySize (clang_type_t clang_type)
6373{
6374 if (clang_type)
6375 {
Greg Clayton59e093d2011-07-09 17:12:27 +00006376 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
6377 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6378 switch (type_class)
6379 {
6380 case clang::Type::ConstantArray:
6381 {
6382 const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
6383 if (array)
6384 return array->getSize().getLimitedValue();
6385 }
6386 break;
6387
6388 case clang::Type::Typedef:
6389 return ClangASTContext::GetArraySize(cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callananc6139712011-08-11 23:56:13 +00006390
6391 case clang::Type::Elaborated:
6392 return ClangASTContext::GetArraySize(cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Enrico Granata1a102082011-07-12 00:18:11 +00006393
6394 default:
6395 break;
Greg Clayton59e093d2011-07-09 17:12:27 +00006396 }
Greg Claytonf3d0b0c2010-10-27 03:32:59 +00006397 }
6398 return 0;
6399}
Greg Clayton03e0f972010-09-13 03:32:57 +00006400
Sean Callananebad95d2012-01-19 23:54:24 +00006401clang_type_t
Greg Claytonb9124572012-12-06 02:33:54 +00006402ClangASTContext::GetAsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size, bool *is_incomplete)
Chris Lattner24943d22010-06-08 16:52:24 +00006403{
Greg Claytonb9124572012-12-06 02:33:54 +00006404 if (is_incomplete)
6405 *is_incomplete = false;
Chris Lattner24943d22010-06-08 16:52:24 +00006406 if (!clang_type)
Sean Callananebad95d2012-01-19 23:54:24 +00006407 return 0;
Chris Lattner24943d22010-06-08 16:52:24 +00006408
6409 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6410
Greg Clayton03e0f972010-09-13 03:32:57 +00006411 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6412 switch (type_class)
Chris Lattner24943d22010-06-08 16:52:24 +00006413 {
Sean Callanan279584c2011-03-15 00:17:19 +00006414 default:
6415 break;
Greg Clayton59e093d2011-07-09 17:12:27 +00006416
Greg Clayton1674b122010-07-21 22:12:05 +00006417 case clang::Type::ConstantArray:
Chris Lattner24943d22010-06-08 16:52:24 +00006418 if (member_type)
6419 *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6420 if (size)
Greg Clayton381f9682011-04-01 18:14:08 +00006421 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
Sean Callananebad95d2012-01-19 23:54:24 +00006422 return clang_type;
Greg Clayton59e093d2011-07-09 17:12:27 +00006423
Greg Clayton1674b122010-07-21 22:12:05 +00006424 case clang::Type::IncompleteArray:
Chris Lattner24943d22010-06-08 16:52:24 +00006425 if (member_type)
6426 *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6427 if (size)
6428 *size = 0;
Greg Claytonb9124572012-12-06 02:33:54 +00006429 if (is_incomplete)
6430 *is_incomplete = true;
Sean Callananebad95d2012-01-19 23:54:24 +00006431 return clang_type;
Greg Clayton59e093d2011-07-09 17:12:27 +00006432
Greg Clayton1674b122010-07-21 22:12:05 +00006433 case clang::Type::VariableArray:
Chris Lattner24943d22010-06-08 16:52:24 +00006434 if (member_type)
6435 *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6436 if (size)
6437 *size = 0;
Sean Callananebad95d2012-01-19 23:54:24 +00006438 return clang_type;
Greg Clayton59e093d2011-07-09 17:12:27 +00006439
Greg Clayton1674b122010-07-21 22:12:05 +00006440 case clang::Type::DependentSizedArray:
Chris Lattner24943d22010-06-08 16:52:24 +00006441 if (member_type)
6442 *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6443 if (size)
6444 *size = 0;
Sean Callananebad95d2012-01-19 23:54:24 +00006445 return clang_type;
Greg Clayton59e093d2011-07-09 17:12:27 +00006446
6447 case clang::Type::Typedef:
Sean Callananebad95d2012-01-19 23:54:24 +00006448 return ClangASTContext::GetAsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
6449 member_type,
Greg Claytonb9124572012-12-06 02:33:54 +00006450 size,
6451 is_incomplete);
Sean Callananc6139712011-08-11 23:56:13 +00006452
6453 case clang::Type::Elaborated:
Sean Callananebad95d2012-01-19 23:54:24 +00006454 return ClangASTContext::GetAsArrayType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
6455 member_type,
Greg Claytonb9124572012-12-06 02:33:54 +00006456 size,
6457 is_incomplete);
Chris Lattner24943d22010-06-08 16:52:24 +00006458 }
Sean Callananebad95d2012-01-19 23:54:24 +00006459 return 0;
Chris Lattner24943d22010-06-08 16:52:24 +00006460}
6461
6462
6463#pragma mark Typedefs
6464
Greg Clayton462d4142010-09-29 01:12:09 +00006465clang_type_t
6466ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
Chris Lattner24943d22010-06-08 16:52:24 +00006467{
6468 if (clang_type)
6469 {
6470 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Claytonb01000f2011-01-17 03:46:26 +00006471 ASTContext *ast = getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00006472 IdentifierTable *identifier_table = getIdentifierTable();
Greg Claytonb01000f2011-01-17 03:46:26 +00006473 assert (ast != NULL);
Chris Lattner24943d22010-06-08 16:52:24 +00006474 assert (identifier_table != NULL);
6475 if (decl_ctx == NULL)
Greg Claytonb01000f2011-01-17 03:46:26 +00006476 decl_ctx = ast->getTranslationUnitDecl();
6477 TypedefDecl *decl = TypedefDecl::Create (*ast,
6478 decl_ctx,
6479 SourceLocation(),
Sean Callanan279584c2011-03-15 00:17:19 +00006480 SourceLocation(),
Greg Claytonb01000f2011-01-17 03:46:26 +00006481 name ? &identifier_table->get(name) : NULL, // Identifier
Sean Callanand9c7d402013-03-12 21:22:00 +00006482 ast->getTrivialTypeSourceInfo(qual_type));
Sean Callanan864bfdb2011-01-18 01:03:44 +00006483
Greg Clayton5f24c502011-10-14 22:47:18 +00006484 //decl_ctx->addDecl (decl);
6485
Sean Callanan864bfdb2011-01-18 01:03:44 +00006486 decl->setAccess(AS_public); // TODO respect proper access specifier
Chris Lattner24943d22010-06-08 16:52:24 +00006487
6488 // Get a uniqued QualType for the typedef decl type
Greg Claytonb01000f2011-01-17 03:46:26 +00006489 return ast->getTypedefType (decl).getAsOpaquePtr();
Chris Lattner24943d22010-06-08 16:52:24 +00006490 }
6491 return NULL;
6492}
6493
Chris Lattner24943d22010-06-08 16:52:24 +00006494// Disable this for now since I can't seem to get a nicely formatted float
6495// out of the APFloat class without just getting the float, double or quad
6496// and then using a formatted print on it which defeats the purpose. We ideally
6497// would like to get perfect string values for any kind of float semantics
6498// so we can support remote targets. The code below also requires a patch to
6499// llvm::APInt.
6500//bool
Greg Claytonb01000f2011-01-17 03:46:26 +00006501//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 +00006502//{
6503// uint32_t count = 0;
6504// bool is_complex = false;
6505// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
6506// {
6507// unsigned num_bytes_per_float = byte_size / count;
6508// unsigned num_bits_per_float = num_bytes_per_float * 8;
6509//
6510// float_str.clear();
6511// uint32_t i;
6512// for (i=0; i<count; i++)
6513// {
6514// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
6515// bool is_ieee = false;
6516// APFloat ap_float(ap_int, is_ieee);
6517// char s[1024];
6518// unsigned int hex_digits = 0;
6519// bool upper_case = false;
6520//
6521// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
6522// {
6523// if (i > 0)
6524// float_str.append(", ");
6525// float_str.append(s);
6526// if (i == 1 && is_complex)
6527// float_str.append(1, 'i');
6528// }
6529// }
6530// return !float_str.empty();
6531// }
6532// return false;
6533//}
6534
6535size_t
Greg Claytonb01000f2011-01-17 03:46:26 +00006536ClangASTContext::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 +00006537{
6538 if (clang_type)
6539 {
6540 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6541 uint32_t count = 0;
6542 bool is_complex = false;
6543 if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
6544 {
6545 // TODO: handle complex and vector types
6546 if (count != 1)
6547 return false;
6548
6549 StringRef s_sref(s);
Greg Claytonb01000f2011-01-17 03:46:26 +00006550 APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
Chris Lattner24943d22010-06-08 16:52:24 +00006551
Greg Claytonb01000f2011-01-17 03:46:26 +00006552 const uint64_t bit_size = ast->getTypeSize (qual_type);
Chris Lattner24943d22010-06-08 16:52:24 +00006553 const uint64_t byte_size = bit_size / 8;
6554 if (dst_size >= byte_size)
6555 {
6556 if (bit_size == sizeof(float)*8)
6557 {
6558 float float32 = ap_float.convertToFloat();
6559 ::memcpy (dst, &float32, byte_size);
6560 return byte_size;
6561 }
6562 else if (bit_size >= 64)
6563 {
6564 llvm::APInt ap_int(ap_float.bitcastToAPInt());
6565 ::memcpy (dst, ap_int.getRawData(), byte_size);
6566 return byte_size;
6567 }
6568 }
6569 }
6570 }
6571 return 0;
6572}
Sean Callanana751f7b2010-09-17 02:24:29 +00006573
6574unsigned
Greg Clayton462d4142010-09-29 01:12:09 +00006575ClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
Sean Callanana751f7b2010-09-17 02:24:29 +00006576{
6577 assert (clang_type);
6578
6579 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6580
6581 return qual_type.getQualifiers().getCVRQualifiers();
6582}
Greg Claytonb01000f2011-01-17 03:46:26 +00006583
6584bool
6585ClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
6586{
6587 if (clang_type == NULL)
6588 return false;
6589
Greg Clayton7a183dc2011-01-20 04:18:48 +00006590 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
Greg Claytonb01000f2011-01-17 03:46:26 +00006591}
6592
6593
6594bool
6595ClangASTContext::GetCompleteType (clang_type_t clang_type)
6596{
6597 return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
6598}
6599
Greg Claytone6d72ca2011-06-25 00:44:06 +00006600bool
Enrico Granatad44c9d32012-03-24 01:11:14 +00006601ClangASTContext::IsCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
6602{
6603 if (clang_type == NULL)
6604 return false;
6605
6606 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type), false); // just check but don't let it actually complete
6607}
6608
6609
6610bool
6611ClangASTContext::IsCompleteType (clang_type_t clang_type)
6612{
6613 return ClangASTContext::IsCompleteType (getASTContext(), clang_type);
6614}
6615
6616bool
Greg Claytone6d72ca2011-06-25 00:44:06 +00006617ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
6618 clang::Decl *decl)
6619{
6620 if (!decl)
6621 return false;
6622
6623 ExternalASTSource *ast_source = ast->getExternalSource();
6624
6625 if (!ast_source)
6626 return false;
6627
6628 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
6629 {
Greg Clayton3356d4f2012-03-30 00:51:13 +00006630 if (tag_decl->isCompleteDefinition())
Greg Claytone6d72ca2011-06-25 00:44:06 +00006631 return true;
6632
6633 if (!tag_decl->hasExternalLexicalStorage())
6634 return false;
6635
6636 ast_source->CompleteType(tag_decl);
6637
6638 return !tag_decl->getTypeForDecl()->isIncompleteType();
6639 }
6640 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
6641 {
Sean Callanan8f2e3922012-02-04 08:49:35 +00006642 if (objc_interface_decl->getDefinition())
Greg Claytone6d72ca2011-06-25 00:44:06 +00006643 return true;
6644
6645 if (!objc_interface_decl->hasExternalLexicalStorage())
6646 return false;
6647
6648 ast_source->CompleteType(objc_interface_decl);
6649
Sean Callanan8f2e3922012-02-04 08:49:35 +00006650 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytone6d72ca2011-06-25 00:44:06 +00006651 }
6652 else
6653 {
6654 return false;
6655 }
6656}
6657
Sean Callananfafffe02012-04-13 00:10:03 +00006658void
Greg Clayton017c16a2013-03-27 01:48:02 +00006659ClangASTContext::SetMetadataAsUserID (const void *object,
Jim Inghama32c5a52012-10-27 02:54:13 +00006660 user_id_t user_id)
6661{
6662 ClangASTMetadata meta_data;
6663 meta_data.SetUserID (user_id);
6664 SetMetadata (object, meta_data);
6665}
6666
6667void
Sean Callananfafffe02012-04-13 00:10:03 +00006668ClangASTContext::SetMetadata (clang::ASTContext *ast,
Greg Clayton017c16a2013-03-27 01:48:02 +00006669 const void *object,
Jim Inghama32c5a52012-10-27 02:54:13 +00006670 ClangASTMetadata &metadata)
Sean Callananfafffe02012-04-13 00:10:03 +00006671{
6672 ClangExternalASTSourceCommon *external_source =
6673 static_cast<ClangExternalASTSourceCommon*>(ast->getExternalSource());
6674
6675 if (external_source)
6676 external_source->SetMetadata(object, metadata);
6677}
6678
Jim Inghama32c5a52012-10-27 02:54:13 +00006679ClangASTMetadata *
Sean Callananfafffe02012-04-13 00:10:03 +00006680ClangASTContext::GetMetadata (clang::ASTContext *ast,
Greg Clayton017c16a2013-03-27 01:48:02 +00006681 const void *object)
Sean Callananfafffe02012-04-13 00:10:03 +00006682{
6683 ClangExternalASTSourceCommon *external_source =
6684 static_cast<ClangExternalASTSourceCommon*>(ast->getExternalSource());
6685
6686 if (external_source && external_source->HasMetadata(object))
6687 return external_source->GetMetadata(object);
6688 else
Jim Inghama32c5a52012-10-27 02:54:13 +00006689 return NULL;
Sean Callananfafffe02012-04-13 00:10:03 +00006690}
6691
Greg Claytona83f8772011-08-04 21:02:57 +00006692clang::DeclContext *
6693ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
6694{
Sean Callanancbfc0ea2011-08-19 06:19:25 +00006695 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Claytona83f8772011-08-04 21:02:57 +00006696}
6697
6698clang::DeclContext *
6699ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
6700{
Sean Callanancbfc0ea2011-08-19 06:19:25 +00006701 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Claytona83f8772011-08-04 21:02:57 +00006702}
6703
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00006704
6705bool
6706ClangASTContext::GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx,
6707 lldb::LanguageType &language,
6708 bool &is_instance_method,
6709 ConstString &language_object_name)
6710{
6711 language_object_name.Clear();
6712 language = eLanguageTypeUnknown;
6713 is_instance_method = false;
6714
6715 if (decl_ctx)
6716 {
6717 if (clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
6718 {
6719 if (method_decl->isStatic())
6720 {
6721 is_instance_method = false;
6722 }
6723 else
6724 {
6725 language_object_name.SetCString("this");
6726 is_instance_method = true;
6727 }
6728 language = eLanguageTypeC_plus_plus;
6729 return true;
6730 }
6731 else if (clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
6732 {
6733 // Both static and instance methods have a "self" object in objective C
6734 language_object_name.SetCString("self");
6735 if (method_decl->isInstanceMethod())
6736 {
6737 is_instance_method = true;
6738 }
6739 else
6740 {
6741 is_instance_method = false;
6742 }
6743 language = eLanguageTypeObjC;
6744 return true;
6745 }
Jim Inghama32c5a52012-10-27 02:54:13 +00006746 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
6747 {
Greg Clayton017c16a2013-03-27 01:48:02 +00006748 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
Jim Inghama32c5a52012-10-27 02:54:13 +00006749 if (metadata && metadata->HasObjectPtr())
6750 {
6751 language_object_name.SetCString (metadata->GetObjectPtrName());
6752 language = eLanguageTypeObjC;
6753 is_instance_method = true;
6754 }
6755 return true;
6756 }
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00006757 }
6758 return false;
6759}
6760