blob: 978c998d766f041f94d34b967681b2acdb314988 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- ClangASTContext.cpp -------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedman932197d2010-06-13 19:06:42 +000010#include "lldb/Symbol/ClangASTContext.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000011
12// C Includes
13// C++ Includes
14#include <string>
15
16// Other libraries and framework includes
Greg Clayton6beaaa62011-01-17 03:46:26 +000017
18// Clang headers like to use NDEBUG inside of them to enable/disable debug
19// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
20// or another. This is bad because it means that if clang was built in release
21// mode, it assumes that you are building in release mode which is not always
22// the case. You can end up with functions that are defined as empty in header
23// files when NDEBUG is not defined, and this can cause link errors with the
24// clang .a files that you have since you might be missing functions in the .a
25// file. So we have to define NDEBUG when including clang headers to avoid any
26// mismatches. This is covered by rdar://problem/8691220
27
Sean Callanan3b1d4f62011-10-26 17:46:51 +000028#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
Greg Clayton6beaaa62011-01-17 03:46:26 +000029#define LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000030#define NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000031// Need to include assert.h so it is as clang would expect it to be (disabled)
32#include <assert.h>
33#endif
34
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035#include "clang/AST/ASTContext.h"
36#include "clang/AST/ASTImporter.h"
37#include "clang/AST/CXXInheritance.h"
Greg Clayton8cf05932010-07-22 18:30:50 +000038#include "clang/AST/DeclObjC.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000039#include "clang/AST/DeclTemplate.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000040#include "clang/AST/RecordLayout.h"
41#include "clang/AST/Type.h"
42#include "clang/Basic/Builtins.h"
Sean Callanan7e2863b2012-02-06 21:28:03 +000043#include "clang/Basic/Diagnostic.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044#include "clang/Basic/FileManager.h"
Sean Callanan79439e82010-11-18 02:56:27 +000045#include "clang/Basic/FileSystemOptions.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046#include "clang/Basic/SourceManager.h"
47#include "clang/Basic/TargetInfo.h"
48#include "clang/Basic/TargetOptions.h"
49#include "clang/Frontend/FrontendOptions.h"
50#include "clang/Frontend/LangStandard.h"
Greg Clayton6beaaa62011-01-17 03:46:26 +000051
52#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000053#undef NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000054#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
55// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
56#include <assert.h>
57#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +000058
Greg Clayton514487e2011-02-15 21:59:32 +000059#include "lldb/Core/ArchSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060#include "lldb/Core/dwarf.h"
Greg Clayton73b472d2010-10-27 03:32:59 +000061#include "lldb/Core/Flags.h"
Sean Callananfb8b7092010-10-28 18:19:36 +000062#include "lldb/Core/Log.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000063#include "lldb/Core/RegularExpression.h"
64#include "lldb/Expression/ASTDumper.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000065#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Sean Callanan5e9e1992011-10-26 01:06:27 +000066#include "lldb/Symbol/VerifyDecl.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000067#include "lldb/Target/ExecutionContext.h"
68#include "lldb/Target/Process.h"
69#include "lldb/Target/ObjCLanguageRuntime.h"
70
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071
Eli Friedman932197d2010-06-13 19:06:42 +000072#include <stdio.h>
73
Greg Claytonc86103d2010-08-05 01:57:25 +000074using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000075using namespace lldb_private;
76using namespace llvm;
77using namespace clang;
78
Greg Clayton6beaaa62011-01-17 03:46:26 +000079
80static bool
81GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type)
82{
83 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
84 switch (type_class)
85 {
Sean Callanan5b26f272012-02-04 08:49:35 +000086 case clang::Type::ConstantArray:
87 {
88 const clang::ArrayType *array_type = dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
89
90 if (array_type)
91 return GetCompleteQualType (ast, array_type->getElementType());
92 }
93 break;
94
Greg Clayton6beaaa62011-01-17 03:46:26 +000095 case clang::Type::Record:
96 case clang::Type::Enum:
97 {
Sean Callanan78e37602011-01-27 04:42:51 +000098 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +000099 if (tag_type)
100 {
101 clang::TagDecl *tag_decl = tag_type->getDecl();
102 if (tag_decl)
103 {
104 if (tag_decl->getDefinition())
105 return true;
106
107 if (tag_decl->hasExternalLexicalStorage())
108 {
Greg Clayton007d5be2011-05-30 00:49:24 +0000109 if (ast)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000110 {
Greg Clayton007d5be2011-05-30 00:49:24 +0000111 ExternalASTSource *external_ast_source = ast->getExternalSource();
112 if (external_ast_source)
113 {
114 external_ast_source->CompleteType(tag_decl);
115 return !tag_type->isIncompleteType();
116 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000117 }
118 }
119 return false;
120 }
121 }
122
123 }
124 break;
125
126 case clang::Type::ObjCObject:
127 case clang::Type::ObjCInterface:
128 {
Sean Callanan78e37602011-01-27 04:42:51 +0000129 const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000130 if (objc_class_type)
131 {
132 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
133 // We currently can't complete objective C types through the newly added ASTContext
134 // because it only supports TagDecl objects right now...
Enrico Granata9dd75c82011-07-15 23:30:15 +0000135 if (class_interface_decl)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000136 {
Sean Callanan5b26f272012-02-04 08:49:35 +0000137 if (class_interface_decl->getDefinition())
138 return true;
139
140 if (class_interface_decl->hasExternalLexicalStorage())
Greg Clayton6beaaa62011-01-17 03:46:26 +0000141 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000142 if (ast)
Greg Clayton007d5be2011-05-30 00:49:24 +0000143 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000144 ExternalASTSource *external_ast_source = ast->getExternalSource();
145 if (external_ast_source)
146 {
147 external_ast_source->CompleteType (class_interface_decl);
Sean Callanan5b26f272012-02-04 08:49:35 +0000148 return !objc_class_type->isIncompleteType();
Enrico Granata0a3958e2011-07-02 00:25:22 +0000149 }
Greg Clayton007d5be2011-05-30 00:49:24 +0000150 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000151 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000152 return false;
Sean Callanan5b26f272012-02-04 08:49:35 +0000153 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000154 }
155 }
156 break;
157
158 case clang::Type::Typedef:
159 return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Sean Callanan912855f2011-08-11 23:56:13 +0000160
161 case clang::Type::Elaborated:
162 return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType());
Greg Clayton6beaaa62011-01-17 03:46:26 +0000163
164 default:
165 break;
166 }
167
168 return true;
169}
170
171
Greg Clayton8cf05932010-07-22 18:30:50 +0000172static AccessSpecifier
Greg Claytonc86103d2010-08-05 01:57:25 +0000173ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000174{
175 switch (access)
176 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000177 default: break;
178 case eAccessNone: return AS_none;
179 case eAccessPublic: return AS_public;
180 case eAccessPrivate: return AS_private;
181 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000182 }
183 return AS_none;
184}
185
186static ObjCIvarDecl::AccessControl
Greg Claytonc86103d2010-08-05 01:57:25 +0000187ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000188{
189 switch (access)
190 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000191 default: break;
192 case eAccessNone: return ObjCIvarDecl::None;
193 case eAccessPublic: return ObjCIvarDecl::Public;
194 case eAccessPrivate: return ObjCIvarDecl::Private;
195 case eAccessProtected: return ObjCIvarDecl::Protected;
196 case eAccessPackage: return ObjCIvarDecl::Package;
Greg Clayton8cf05932010-07-22 18:30:50 +0000197 }
198 return ObjCIvarDecl::None;
199}
200
201
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000202static void
203ParseLangArgs
204(
205 LangOptions &Opts,
Greg Clayton94e5d782010-06-13 17:34:29 +0000206 InputKind IK
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000207)
208{
209 // FIXME: Cleanup per-file based stuff.
210
211 // Set some properties which depend soley on the input kind; it would be nice
212 // to move these to the language standard, and have the driver resolve the
213 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000214 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000215 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000216 } else if (IK == IK_ObjC ||
217 IK == IK_ObjCXX ||
218 IK == IK_PreprocessedObjC ||
219 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000220 Opts.ObjC1 = Opts.ObjC2 = 1;
221 }
222
223 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
224
225 if (LangStd == LangStandard::lang_unspecified) {
226 // Based on the base language, pick one.
227 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000228 case IK_None:
229 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000230 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000231 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000232 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000233 LangStd = LangStandard::lang_opencl;
234 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000235 case IK_CUDA:
236 LangStd = LangStandard::lang_cuda;
237 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000238 case IK_Asm:
239 case IK_C:
240 case IK_PreprocessedC:
241 case IK_ObjC:
242 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000243 LangStd = LangStandard::lang_gnu99;
244 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000245 case IK_CXX:
246 case IK_PreprocessedCXX:
247 case IK_ObjCXX:
248 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000249 LangStd = LangStandard::lang_gnucxx98;
250 break;
251 }
252 }
253
254 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
255 Opts.BCPLComment = Std.hasBCPLComments();
256 Opts.C99 = Std.isC99();
257 Opts.CPlusPlus = Std.isCPlusPlus();
258 Opts.CPlusPlus0x = Std.isCPlusPlus0x();
259 Opts.Digraphs = Std.hasDigraphs();
260 Opts.GNUMode = Std.isGNUMode();
261 Opts.GNUInline = !Std.isC99();
262 Opts.HexFloats = Std.hasHexFloats();
263 Opts.ImplicitInt = Std.hasImplicitInt();
264
265 // OpenCL has some additional defaults.
266 if (LangStd == LangStandard::lang_opencl) {
267 Opts.OpenCL = 1;
268 Opts.AltiVec = 1;
269 Opts.CXXOperatorNames = 1;
270 Opts.LaxVectorConversions = 1;
271 }
272
273 // OpenCL and C++ both have bool, true, false keywords.
274 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
275
276// if (Opts.CPlusPlus)
277// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
278//
279// if (Args.hasArg(OPT_fobjc_gc_only))
280// Opts.setGCMode(LangOptions::GCOnly);
281// else if (Args.hasArg(OPT_fobjc_gc))
282// Opts.setGCMode(LangOptions::HybridGC);
283//
284// if (Args.hasArg(OPT_print_ivar_layout))
285// Opts.ObjCGCBitmapPrint = 1;
286//
287// if (Args.hasArg(OPT_faltivec))
288// Opts.AltiVec = 1;
289//
290// if (Args.hasArg(OPT_pthread))
291// Opts.POSIXThreads = 1;
292//
293// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
294// "default");
295// if (Vis == "default")
Sean Callanan31e851c2010-10-29 18:38:40 +0000296 Opts.setVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000297// else if (Vis == "hidden")
298// Opts.setVisibilityMode(LangOptions::Hidden);
299// else if (Vis == "protected")
300// Opts.setVisibilityMode(LangOptions::Protected);
301// else
302// Diags.Report(diag::err_drv_invalid_value)
303// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
304
305// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
306
307 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
308 // is specified, or -std is set to a conforming mode.
309 Opts.Trigraphs = !Opts.GNUMode;
310// if (Args.hasArg(OPT_trigraphs))
311// Opts.Trigraphs = 1;
312//
313// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
314// OPT_fno_dollars_in_identifiers,
315// !Opts.AsmPreprocessor);
316// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
317// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
318// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
319// if (Args.hasArg(OPT_fno_lax_vector_conversions))
320// Opts.LaxVectorConversions = 0;
321// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
322// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
323// Opts.Blocks = Args.hasArg(OPT_fblocks);
324// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
325// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
326// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
327// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
328// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
329// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
330// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
331// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
332// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
333// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
334// Diags);
335// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
336// Opts.ObjCConstantStringClass = getLastArgValue(Args,
337// OPT_fconstant_string_class);
338// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
339// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
340// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
341// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
342// Opts.Static = Args.hasArg(OPT_static_define);
343 Opts.OptimizeSize = 0;
344
345 // FIXME: Eliminate this dependency.
346// unsigned Opt =
347// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
348// Opts.Optimize = Opt != 0;
349 unsigned Opt = 0;
350
351 // This is the __NO_INLINE__ define, which just depends on things like the
352 // optimization level and -fno-inline, not actually whether the backend has
353 // inlining enabled.
354 //
355 // FIXME: This is affected by other options (-fno-inline).
356 Opts.NoInline = !Opt;
357
358// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
359// switch (SSP) {
360// default:
361// Diags.Report(diag::err_drv_invalid_value)
362// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
363// break;
364// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
365// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
366// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
367// }
368}
369
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000370
Greg Clayton6beaaa62011-01-17 03:46:26 +0000371ClangASTContext::ClangASTContext (const char *target_triple) :
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000372 m_target_triple(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000373 m_ast_ap(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000374 m_language_options_ap(),
375 m_source_manager_ap(),
Sean Callanan880e6802011-10-07 23:18:13 +0000376 m_diagnostics_engine_ap(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377 m_target_options_ap(),
378 m_target_info_ap(),
379 m_identifier_table_ap(),
380 m_selector_table_ap(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000381 m_builtins_ap(),
382 m_callback_tag_decl (NULL),
383 m_callback_objc_decl (NULL),
384 m_callback_baton (NULL)
385
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000386{
387 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000388 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000389}
390
391//----------------------------------------------------------------------
392// Destructor
393//----------------------------------------------------------------------
394ClangASTContext::~ClangASTContext()
395{
396 m_builtins_ap.reset();
397 m_selector_table_ap.reset();
398 m_identifier_table_ap.reset();
399 m_target_info_ap.reset();
400 m_target_options_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000401 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000402 m_source_manager_ap.reset();
403 m_language_options_ap.reset();
Greg Clayton6beaaa62011-01-17 03:46:26 +0000404 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000405}
406
407
408void
409ClangASTContext::Clear()
410{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000411 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000412 m_language_options_ap.reset();
413 m_source_manager_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000414 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000415 m_target_options_ap.reset();
416 m_target_info_ap.reset();
417 m_identifier_table_ap.reset();
418 m_selector_table_ap.reset();
419 m_builtins_ap.reset();
420}
421
422const char *
423ClangASTContext::GetTargetTriple ()
424{
425 return m_target_triple.c_str();
426}
427
428void
429ClangASTContext::SetTargetTriple (const char *target_triple)
430{
431 Clear();
432 m_target_triple.assign(target_triple);
433}
434
Greg Clayton514487e2011-02-15 21:59:32 +0000435void
436ClangASTContext::SetArchitecture (const ArchSpec &arch)
437{
Greg Clayton880cbb02011-07-30 01:26:02 +0000438 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000439}
440
Greg Clayton6beaaa62011-01-17 03:46:26 +0000441bool
442ClangASTContext::HasExternalSource ()
443{
444 ASTContext *ast = getASTContext();
445 if (ast)
446 return ast->getExternalSource () != NULL;
447 return false;
448}
449
450void
451ClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
452{
453 ASTContext *ast = getASTContext();
454 if (ast)
455 {
456 ast->setExternalSource (ast_source_ap);
457 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
458 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
459 }
460}
461
462void
463ClangASTContext::RemoveExternalSource ()
464{
465 ASTContext *ast = getASTContext();
466
467 if (ast)
468 {
469 llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
470 ast->setExternalSource (empty_ast_source_ap);
471 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
472 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
473 }
474}
475
476
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000477
478ASTContext *
479ClangASTContext::getASTContext()
480{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000481 if (m_ast_ap.get() == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000482 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000483 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
484 *getSourceManager(),
Sean Callanan880e6802011-10-07 23:18:13 +0000485 getTargetInfo(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000486 *getIdentifierTable(),
487 *getSelectorTable(),
488 *getBuiltinContext(),
489 0));
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000490
Greg Clayton6beaaa62011-01-17 03:46:26 +0000491 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
492 {
493 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
494 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
495 }
496
Sean Callanan880e6802011-10-07 23:18:13 +0000497 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000498 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000499 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000500}
501
502Builtin::Context *
503ClangASTContext::getBuiltinContext()
504{
505 if (m_builtins_ap.get() == NULL)
Sean Callanan880e6802011-10-07 23:18:13 +0000506 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000507 return m_builtins_ap.get();
508}
509
510IdentifierTable *
511ClangASTContext::getIdentifierTable()
512{
513 if (m_identifier_table_ap.get() == NULL)
514 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
515 return m_identifier_table_ap.get();
516}
517
518LangOptions *
519ClangASTContext::getLanguageOptions()
520{
521 if (m_language_options_ap.get() == NULL)
522 {
523 m_language_options_ap.reset(new LangOptions());
Greg Clayton94e5d782010-06-13 17:34:29 +0000524 ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
525// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000526 }
527 return m_language_options_ap.get();
528}
529
530SelectorTable *
531ClangASTContext::getSelectorTable()
532{
533 if (m_selector_table_ap.get() == NULL)
534 m_selector_table_ap.reset (new SelectorTable());
535 return m_selector_table_ap.get();
536}
537
Sean Callanan79439e82010-11-18 02:56:27 +0000538clang::FileManager *
539ClangASTContext::getFileManager()
540{
541 if (m_file_manager_ap.get() == NULL)
Greg Clayton38a61402010-12-02 23:20:03 +0000542 {
543 clang::FileSystemOptions file_system_options;
544 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
545 }
Sean Callanan79439e82010-11-18 02:56:27 +0000546 return m_file_manager_ap.get();
547}
548
Greg Claytone1a916a2010-07-21 22:12:05 +0000549clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000550ClangASTContext::getSourceManager()
551{
552 if (m_source_manager_ap.get() == NULL)
Sean Callanan880e6802011-10-07 23:18:13 +0000553 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554 return m_source_manager_ap.get();
555}
556
Sean Callanan880e6802011-10-07 23:18:13 +0000557clang::DiagnosticsEngine *
558ClangASTContext::getDiagnosticsEngine()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000559{
Sean Callanan880e6802011-10-07 23:18:13 +0000560 if (m_diagnostics_engine_ap.get() == NULL)
Greg Claytona651b532010-11-19 21:46:54 +0000561 {
562 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callanan880e6802011-10-07 23:18:13 +0000563 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp));
Greg Claytona651b532010-11-19 21:46:54 +0000564 }
Sean Callanan880e6802011-10-07 23:18:13 +0000565 return m_diagnostics_engine_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000566}
567
Sean Callanan880e6802011-10-07 23:18:13 +0000568class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000569{
570public:
Sean Callanan880e6802011-10-07 23:18:13 +0000571 NullDiagnosticConsumer ()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000572 {
573 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
574 }
575
Sean Callanan880e6802011-10-07 23:18:13 +0000576 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000577 {
578 if (m_log)
579 {
Sean Callanan5b26f272012-02-04 08:49:35 +0000580 llvm::SmallVector<char, 32> diag_str(10);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000581 info.FormatDiagnostic(diag_str);
582 diag_str.push_back('\0');
583 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
584 }
585 }
Sean Callanan880e6802011-10-07 23:18:13 +0000586
587 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
588 {
589 return new NullDiagnosticConsumer ();
590 }
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000591private:
592 LogSP m_log;
593};
594
Sean Callanan880e6802011-10-07 23:18:13 +0000595DiagnosticConsumer *
596ClangASTContext::getDiagnosticConsumer()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000597{
Sean Callanan880e6802011-10-07 23:18:13 +0000598 if (m_diagnostic_consumer_ap.get() == NULL)
599 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000600
Sean Callanan880e6802011-10-07 23:18:13 +0000601 return m_diagnostic_consumer_ap.get();
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000602}
603
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000604TargetOptions *
605ClangASTContext::getTargetOptions()
606{
607 if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
608 {
609 m_target_options_ap.reset (new TargetOptions());
610 if (m_target_options_ap.get())
611 m_target_options_ap->Triple = m_target_triple;
612 }
613 return m_target_options_ap.get();
614}
615
616
617TargetInfo *
618ClangASTContext::getTargetInfo()
619{
620 // target_triple should be something like "x86_64-apple-darwin10"
621 if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
Sean Callanan880e6802011-10-07 23:18:13 +0000622 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), *getTargetOptions()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000623 return m_target_info_ap.get();
624}
625
626#pragma mark Basic Types
627
628static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000629QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000630{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000631 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000632 if (qual_type_bit_size == bit_size)
633 return true;
634 return false;
635}
636
Greg Clayton1be10fc2010-09-29 01:12:09 +0000637clang_type_t
Greg Claytonc86103d2010-08-05 01:57:25 +0000638ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000639{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000640 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000641
Greg Clayton6beaaa62011-01-17 03:46:26 +0000642 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000643
Greg Clayton6beaaa62011-01-17 03:46:26 +0000644 return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000645}
646
Greg Clayton1be10fc2010-09-29 01:12:09 +0000647clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000648ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000649{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000650 if (!ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000651 return NULL;
652
653 switch (encoding)
654 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000655 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000656 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
657 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000658 break;
659
Greg Claytonc86103d2010-08-05 01:57:25 +0000660 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000661 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
662 return ast->UnsignedCharTy.getAsOpaquePtr();
663 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
664 return ast->UnsignedShortTy.getAsOpaquePtr();
665 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
666 return ast->UnsignedIntTy.getAsOpaquePtr();
667 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
668 return ast->UnsignedLongTy.getAsOpaquePtr();
669 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
670 return ast->UnsignedLongLongTy.getAsOpaquePtr();
671 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
672 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000673 break;
674
Greg Claytonc86103d2010-08-05 01:57:25 +0000675 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000676 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
677 return ast->CharTy.getAsOpaquePtr();
678 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
679 return ast->ShortTy.getAsOpaquePtr();
680 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
681 return ast->IntTy.getAsOpaquePtr();
682 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
683 return ast->LongTy.getAsOpaquePtr();
684 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
685 return ast->LongLongTy.getAsOpaquePtr();
686 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
687 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000688 break;
689
Greg Claytonc86103d2010-08-05 01:57:25 +0000690 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000691 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
692 return ast->FloatTy.getAsOpaquePtr();
693 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
694 return ast->DoubleTy.getAsOpaquePtr();
695 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
696 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000697 break;
698
Greg Claytonc86103d2010-08-05 01:57:25 +0000699 case eEncodingVector:
Johnny Chenc79c93a2012-03-07 01:12:24 +0000700 // Sanity check that bit_size is a multiple of 8's.
701 if (bit_size && !(bit_size & 0x7u))
702 return ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8).getAsOpaquePtr();
703 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000704 default:
705 break;
706 }
707
708 return NULL;
709}
710
Greg Clayton1be10fc2010-09-29 01:12:09 +0000711clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000712ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
713{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000714 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000715
716 #define streq(a,b) strcmp(a,b) == 0
Greg Clayton6beaaa62011-01-17 03:46:26 +0000717 assert (ast != NULL);
718 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000719 {
720 switch (dw_ate)
721 {
722 default:
723 break;
724
725 case DW_ATE_address:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000726 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
727 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000728 break;
729
730 case DW_ATE_boolean:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000731 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
732 return ast->BoolTy.getAsOpaquePtr();
733 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
734 return ast->UnsignedCharTy.getAsOpaquePtr();
735 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
736 return ast->UnsignedShortTy.getAsOpaquePtr();
737 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
738 return ast->UnsignedIntTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000739 break;
740
Greg Clayton49462ea2011-01-15 02:52:14 +0000741 case DW_ATE_lo_user:
742 // This has been seen to mean DW_AT_complex_integer
Greg Clayton605684e2011-10-28 23:06:08 +0000743 if (type_name)
Greg Clayton49462ea2011-01-15 02:52:14 +0000744 {
Greg Clayton605684e2011-10-28 23:06:08 +0000745 if (::strstr(type_name, "complex"))
746 {
747 clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
748 return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
749 }
Greg Clayton49462ea2011-01-15 02:52:14 +0000750 }
751 break;
752
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000753 case DW_ATE_complex_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000754 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
755 return ast->FloatComplexTy.getAsOpaquePtr();
756 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
757 return ast->DoubleComplexTy.getAsOpaquePtr();
758 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
759 return ast->LongDoubleComplexTy.getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000760 else
761 {
762 clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000763 return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000764 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000765 break;
766
767 case DW_ATE_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000768 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
769 return ast->FloatTy.getAsOpaquePtr();
770 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
771 return ast->DoubleTy.getAsOpaquePtr();
772 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
773 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000774 break;
775
776 case DW_ATE_signed:
777 if (type_name)
778 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000779 if (strstr(type_name, "long long"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000780 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000781 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
782 return ast->LongLongTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000783 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000784 else if (strstr(type_name, "long"))
785 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000786 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
787 return ast->LongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000788 }
789 else if (strstr(type_name, "short"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000790 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000791 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
792 return ast->ShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000793 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000794 else if (strstr(type_name, "char"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000795 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000796 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
797 return ast->CharTy.getAsOpaquePtr();
798 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
799 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000800 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000801 else if (strstr(type_name, "int"))
802 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000803 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
804 return ast->IntTy.getAsOpaquePtr();
805 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
806 return ast->Int128Ty.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000807 }
808 else if (streq(type_name, "wchar_t"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000809 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000810 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
811 return ast->WCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000812 }
Greg Clayton7bd65b92011-02-09 23:39:34 +0000813 else if (streq(type_name, "void"))
814 {
815 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
816 return ast->VoidTy.getAsOpaquePtr();
817 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000818 }
819 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000820 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
821 return ast->CharTy.getAsOpaquePtr();
822 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
823 return ast->ShortTy.getAsOpaquePtr();
824 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
825 return ast->IntTy.getAsOpaquePtr();
826 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
827 return ast->LongTy.getAsOpaquePtr();
828 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
829 return ast->LongLongTy.getAsOpaquePtr();
830 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
831 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000832 break;
833
834 case DW_ATE_signed_char:
835 if (type_name)
836 {
837 if (streq(type_name, "signed char"))
838 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000839 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
840 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000841 }
842 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000843 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
844 return ast->CharTy.getAsOpaquePtr();
845 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
846 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000847 break;
848
849 case DW_ATE_unsigned:
850 if (type_name)
851 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000852 if (strstr(type_name, "long long"))
853 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000854 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
855 return ast->UnsignedLongLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000856 }
857 else if (strstr(type_name, "long"))
858 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000859 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
860 return ast->UnsignedLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000861 }
862 else if (strstr(type_name, "short"))
863 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000864 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
865 return ast->UnsignedShortTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000866 }
867 else if (strstr(type_name, "char"))
868 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000869 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
870 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000871 }
872 else if (strstr(type_name, "int"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000873 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000874 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
875 return ast->UnsignedIntTy.getAsOpaquePtr();
876 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
877 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000878 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000879 }
880 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000881 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
882 return ast->UnsignedCharTy.getAsOpaquePtr();
883 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
884 return ast->UnsignedShortTy.getAsOpaquePtr();
885 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
886 return ast->UnsignedIntTy.getAsOpaquePtr();
887 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
888 return ast->UnsignedLongTy.getAsOpaquePtr();
889 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
890 return ast->UnsignedLongLongTy.getAsOpaquePtr();
891 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
892 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000893 break;
894
895 case DW_ATE_unsigned_char:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000896 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
897 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton7bd65b92011-02-09 23:39:34 +0000898 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
899 return ast->UnsignedShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000900 break;
901
902 case DW_ATE_imaginary_float:
903 break;
Greg Clayton605684e2011-10-28 23:06:08 +0000904
905 case DW_ATE_UTF:
906 if (type_name)
907 {
908 if (streq(type_name, "char16_t"))
909 {
910 return ast->Char16Ty.getAsOpaquePtr();
911 }
912 else if (streq(type_name, "char32_t"))
913 {
914 return ast->Char32Ty.getAsOpaquePtr();
915 }
916 }
917 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000918 }
919 }
920 // This assert should fire for anything that we don't catch above so we know
921 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +0000922 if (type_name)
923 {
Greg Claytone38a5ed2012-01-05 03:57:59 +0000924 Host::SystemLog (Host::eSystemLogError, "error: need to add support for DW_TAG_base_type '%s' encoded with DW_ATE = 0x%x, bit_size = %u\n", type_name, dw_ate, bit_size);
Greg Claytondc968d12011-05-17 18:15:05 +0000925 }
926 else
927 {
Greg Claytone38a5ed2012-01-05 03:57:59 +0000928 Host::SystemLog (Host::eSystemLogError, "error: need to add support for DW_TAG_base_type encoded with DW_ATE = 0x%x, bit_size = %u\n", dw_ate, bit_size);
Greg Claytondc968d12011-05-17 18:15:05 +0000929 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000930 return NULL;
931}
932
Greg Clayton1be10fc2010-09-29 01:12:09 +0000933clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000934ClangASTContext::GetBuiltInType_void(ASTContext *ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000935{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000936 return ast->VoidTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000937}
938
Greg Clayton1be10fc2010-09-29 01:12:09 +0000939clang_type_t
Sean Callananf7c3e272010-11-19 02:52:21 +0000940ClangASTContext::GetBuiltInType_bool()
941{
942 return getASTContext()->BoolTy.getAsOpaquePtr();
943}
944
945clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000946ClangASTContext::GetBuiltInType_objc_id()
947{
Sean Callanand5c17ed2011-11-15 02:11:17 +0000948 return getASTContext()->getObjCIdType().getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000949}
950
Greg Clayton1be10fc2010-09-29 01:12:09 +0000951clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000952ClangASTContext::GetBuiltInType_objc_Class()
953{
Sean Callanand5c17ed2011-11-15 02:11:17 +0000954 return getASTContext()->getObjCClassType().getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000955}
956
Greg Clayton1be10fc2010-09-29 01:12:09 +0000957clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000958ClangASTContext::GetBuiltInType_objc_selector()
959{
Sean Callanand5c17ed2011-11-15 02:11:17 +0000960 return getASTContext()->getObjCSelType().getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000961}
962
Greg Clayton1be10fc2010-09-29 01:12:09 +0000963clang_type_t
Sean Callanan77502262011-05-12 23:54:16 +0000964ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
965{
966 return ast->UnknownAnyTy.getAsOpaquePtr();
967}
968
969clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000970ClangASTContext::GetCStringType (bool is_const)
971{
972 QualType char_type(getASTContext()->CharTy);
973
974 if (is_const)
975 char_type.addConst();
976
977 return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
978}
979
Greg Clayton1be10fc2010-09-29 01:12:09 +0000980clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000981ClangASTContext::GetVoidPtrType (bool is_const)
982{
983 return GetVoidPtrType(getASTContext(), is_const);
984}
985
Greg Clayton1be10fc2010-09-29 01:12:09 +0000986clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000987ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000988{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000989 QualType void_ptr_type(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000990
991 if (is_const)
992 void_ptr_type.addConst();
993
994 return void_ptr_type.getAsOpaquePtr();
995}
996
Sean Callanan09ab4b72011-11-30 22:11:59 +0000997clang::DeclContext *
998ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
999{
1000 return ast->getTranslationUnitDecl();
1001}
1002
Greg Clayton1be10fc2010-09-29 01:12:09 +00001003clang_type_t
Greg Clayton38a61402010-12-02 23:20:03 +00001004ClangASTContext::CopyType (ASTContext *dst_ast,
1005 ASTContext *src_ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001006 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001007{
Sean Callanan79439e82010-11-18 02:56:27 +00001008 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001009 FileManager file_manager (file_system_options);
1010 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001011 *src_ast, file_manager,
1012 false);
Sean Callanan0617fcb2010-11-09 22:37:10 +00001013
Greg Clayton38a61402010-12-02 23:20:03 +00001014 QualType src (QualType::getFromOpaquePtr(clang_type));
1015 QualType dst (importer.Import(src));
Sean Callanan0617fcb2010-11-09 22:37:10 +00001016
1017 return dst.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001018}
1019
Greg Clayton526e5af2010-11-13 03:52:47 +00001020
1021clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001022ClangASTContext::CopyDecl (ASTContext *dst_ast,
1023 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001024 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001025{
Sean Callanan79439e82010-11-18 02:56:27 +00001026 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001027 FileManager file_manager (file_system_options);
1028 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001029 *src_ast, file_manager,
1030 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001031
1032 return importer.Import(source_decl);
1033}
1034
Sean Callanan23a30272010-07-16 00:00:27 +00001035bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00001036ClangASTContext::AreTypesSame(ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001037 clang_type_t type1,
Sean Callanan5056ab02012-02-18 02:01:03 +00001038 clang_type_t type2,
1039 bool ignore_qualifiers)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001040{
Sean Callanan5056ab02012-02-18 02:01:03 +00001041 QualType type1_qual = QualType::getFromOpaquePtr(type1);
1042 QualType type2_qual = QualType::getFromOpaquePtr(type2);
1043
1044 if (ignore_qualifiers)
1045 {
1046 type1_qual = type1_qual.getUnqualifiedType();
1047 type2_qual = type2_qual.getUnqualifiedType();
1048 }
1049
1050 return ast->hasSameType (type1_qual,
1051 type2_qual);
Sean Callanan4dcca2622010-07-15 22:30:52 +00001052}
1053
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001054#pragma mark CVR modifiers
1055
Greg Clayton1be10fc2010-09-29 01:12:09 +00001056clang_type_t
1057ClangASTContext::AddConstModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001058{
1059 if (clang_type)
1060 {
1061 QualType result(QualType::getFromOpaquePtr(clang_type));
1062 result.addConst();
1063 return result.getAsOpaquePtr();
1064 }
1065 return NULL;
1066}
1067
Greg Clayton1be10fc2010-09-29 01:12:09 +00001068clang_type_t
1069ClangASTContext::AddRestrictModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001070{
1071 if (clang_type)
1072 {
1073 QualType result(QualType::getFromOpaquePtr(clang_type));
1074 result.getQualifiers().setRestrict (true);
1075 return result.getAsOpaquePtr();
1076 }
1077 return NULL;
1078}
1079
Greg Clayton1be10fc2010-09-29 01:12:09 +00001080clang_type_t
1081ClangASTContext::AddVolatileModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001082{
1083 if (clang_type)
1084 {
1085 QualType result(QualType::getFromOpaquePtr(clang_type));
1086 result.getQualifiers().setVolatile (true);
1087 return result.getAsOpaquePtr();
1088 }
1089 return NULL;
1090}
1091
Greg Clayton6beaaa62011-01-17 03:46:26 +00001092
1093clang_type_t
1094ClangASTContext::GetTypeForDecl (TagDecl *decl)
1095{
1096 // No need to call the getASTContext() accessor (which can create the AST
1097 // if it isn't created yet, because we can't have created a decl in this
1098 // AST if our AST didn't already exist...
1099 if (m_ast_ap.get())
1100 return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1101 return NULL;
1102}
1103
1104clang_type_t
1105ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1106{
1107 // No need to call the getASTContext() accessor (which can create the AST
1108 // if it isn't created yet, because we can't have created a decl in this
1109 // AST if our AST didn't already exist...
1110 if (m_ast_ap.get())
1111 return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1112 return NULL;
1113}
1114
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001115#pragma mark Structure, Unions, Classes
1116
Greg Clayton1be10fc2010-09-29 01:12:09 +00001117clang_type_t
Greg Clayton55561e92011-10-26 03:31:36 +00001118ClangASTContext::CreateRecordType (DeclContext *decl_ctx, AccessType access_type, const char *name, int kind, LanguageType language)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001119{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001120 ASTContext *ast = getASTContext();
1121 assert (ast != NULL);
Sean Callanana2424172010-10-25 00:29:48 +00001122
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001123 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001124 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001125
Greg Clayton9e409562010-07-28 02:04:09 +00001126
Greg Claytone1be9962011-08-24 23:50:00 +00001127 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001128 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001129 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001130 bool isInternal = false;
1131 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
1132 }
1133
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001134 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1135 // we will need to update this code. I was told to currently always use
1136 // the CXXRecordDecl class since we often don't know from debug information
1137 // if something is struct or a class, so we default to always use the more
1138 // complete definition just in case.
Greg Claytonf0705c82011-10-22 03:33:13 +00001139 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1140 (TagDecl::TagKind)kind,
1141 decl_ctx,
1142 SourceLocation(),
1143 SourceLocation(),
1144 name && name[0] ? &ast->Idents.get(name) : NULL);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001145
1146 if (!name)
1147 decl->setAnonymousStructOrUnion(true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001148
Greg Clayton55561e92011-10-26 03:31:36 +00001149 if (decl_ctx)
1150 {
1151 if (access_type != eAccessNone)
1152 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
1153 decl_ctx->addDecl (decl);
1154 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001155 return ast->getTagDeclType(decl).getAsOpaquePtr();
1156}
1157
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001158static TemplateParameterList *
1159CreateTemplateParameterList (ASTContext *ast,
1160 const ClangASTContext::TemplateParameterInfos &template_param_infos,
1161 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1162{
1163 const bool parameter_pack = false;
1164 const bool is_typename = false;
1165 const unsigned depth = 0;
1166 const size_t num_template_params = template_param_infos.GetSize();
1167 for (size_t i=0; i<num_template_params; ++i)
1168 {
1169 const char *name = template_param_infos.names[i];
1170 if (template_param_infos.args[i].getAsIntegral())
1171 {
1172 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1173 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1174 SourceLocation(),
1175 SourceLocation(),
1176 depth,
1177 i,
1178 &ast->Idents.get(name),
1179 template_param_infos.args[i].getIntegralType(),
1180 parameter_pack,
1181 NULL));
1182
1183 }
1184 else
1185 {
1186 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1187 ast->getTranslationUnitDecl(), // Is this the right decl context?
1188 SourceLocation(),
1189 SourceLocation(),
1190 depth,
1191 i,
1192 &ast->Idents.get(name),
1193 is_typename,
1194 parameter_pack));
1195 }
1196 }
1197
1198 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1199 SourceLocation(),
1200 SourceLocation(),
1201 &template_param_decls.front(),
1202 template_param_decls.size(),
1203 SourceLocation());
1204 return template_param_list;
1205}
1206
1207clang::FunctionTemplateDecl *
1208ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1209 clang::FunctionDecl *func_decl,
1210 const char *name,
1211 const TemplateParameterInfos &template_param_infos)
1212{
1213// /// \brief Create a function template node.
1214 ASTContext *ast = getASTContext();
1215
1216 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1217
1218 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1219 template_param_infos,
1220 template_param_decls);
1221 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1222 decl_ctx,
1223 func_decl->getLocation(),
1224 func_decl->getDeclName(),
1225 template_param_list,
1226 func_decl);
1227
1228 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1229 i < template_param_decl_count;
1230 ++i)
1231 {
1232 // TODO: verify which decl context we should put template_param_decls into..
1233 template_param_decls[i]->setDeclContext (func_decl);
1234 }
1235
1236 return func_tmpl_decl;
1237}
1238
1239void
1240ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1241 clang::FunctionTemplateDecl *func_tmpl_decl,
1242 const TemplateParameterInfos &infos)
1243{
1244 TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1245 infos.args.data(),
1246 infos.args.size());
1247
1248 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1249 &template_args,
1250 NULL);
1251}
1252
1253
Greg Claytonf0705c82011-10-22 03:33:13 +00001254ClassTemplateDecl *
1255ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001256 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001257 const char *class_name,
1258 int kind,
1259 const TemplateParameterInfos &template_param_infos)
1260{
1261 ASTContext *ast = getASTContext();
1262
1263 ClassTemplateDecl *class_template_decl = NULL;
1264 if (decl_ctx == NULL)
1265 decl_ctx = ast->getTranslationUnitDecl();
1266
1267 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1268 DeclarationName decl_name (&identifier_info);
1269
1270 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
1271 for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos)
1272 {
1273 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(*pos);
1274 if (class_template_decl)
1275 return class_template_decl;
1276 }
1277
1278 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf0705c82011-10-22 03:33:13 +00001279
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001280 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1281 template_param_infos,
1282 template_param_decls);
Greg Claytonf0705c82011-10-22 03:33:13 +00001283
1284 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1285 (TagDecl::TagKind)kind,
1286 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1287 SourceLocation(),
1288 SourceLocation(),
1289 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001290
1291 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1292 i < template_param_decl_count;
1293 ++i)
1294 {
1295 template_param_decls[i]->setDeclContext (template_cxx_decl);
1296 }
1297
Sean Callananb5c79622011-11-19 01:35:08 +00001298 // With templated classes, we say that a class is templated with
1299 // specializations, but that the bare class has no functions.
1300 template_cxx_decl->startDefinition();
1301 template_cxx_decl->completeDefinition();
1302
Greg Claytonf0705c82011-10-22 03:33:13 +00001303 class_template_decl = ClassTemplateDecl::Create (*ast,
1304 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1305 SourceLocation(),
1306 decl_name,
1307 template_param_list,
1308 template_cxx_decl,
1309 NULL);
1310
1311 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001312 {
Greg Clayton55561e92011-10-26 03:31:36 +00001313 if (access_type != eAccessNone)
1314 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan5b26f272012-02-04 08:49:35 +00001315
1316 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1317 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1318
Greg Claytonf0705c82011-10-22 03:33:13 +00001319 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001320
1321#ifdef LLDB_CONFIGURATION_DEBUG
1322 VerifyDecl(class_template_decl);
1323#endif
1324 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001325
1326 return class_template_decl;
1327}
1328
1329
1330ClassTemplateSpecializationDecl *
1331ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1332 ClassTemplateDecl *class_template_decl,
1333 int kind,
1334 const TemplateParameterInfos &template_param_infos)
1335{
1336 ASTContext *ast = getASTContext();
1337 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1338 (TagDecl::TagKind)kind,
1339 decl_ctx,
1340 SourceLocation(),
1341 SourceLocation(),
1342 class_template_decl,
1343 &template_param_infos.args.front(),
1344 template_param_infos.args.size(),
1345 NULL);
1346
1347 return class_template_specialization_decl;
1348}
1349
1350lldb::clang_type_t
1351ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1352{
1353 if (class_template_specialization_decl)
1354 {
1355 ASTContext *ast = getASTContext();
1356 if (ast)
1357 return ast->getTagDeclType(class_template_specialization_decl).getAsOpaquePtr();
1358 }
1359 return NULL;
1360}
1361
Greg Clayton6beaaa62011-01-17 03:46:26 +00001362bool
1363ClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1364{
1365 if (clang_type == NULL)
1366 return false;
1367
1368 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1369
1370 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1371 switch (type_class)
1372 {
1373 case clang::Type::Record:
1374 {
1375 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1376 if (cxx_record_decl)
1377 {
1378 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001379 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001380 return true;
1381 }
1382 }
1383 break;
1384
1385 case clang::Type::Enum:
1386 {
1387 EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1388 if (enum_decl)
1389 {
1390 enum_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001391 enum_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001392 return true;
1393 }
1394 }
1395 break;
1396
1397 case clang::Type::ObjCObject:
1398 case clang::Type::ObjCInterface:
1399 {
Sean Callanan78e37602011-01-27 04:42:51 +00001400 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00001401 assert (objc_class_type);
1402 if (objc_class_type)
1403 {
1404 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1405
1406 if (class_interface_decl)
1407 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001408 class_interface_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001409 class_interface_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001410 return true;
1411 }
1412 }
1413 }
1414 break;
1415
1416 case clang::Type::Typedef:
1417 return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Sean Callanan912855f2011-08-11 23:56:13 +00001418
1419 case clang::Type::Elaborated:
1420 return ClangASTContext::SetHasExternalStorage (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001421
1422 default:
1423 break;
1424 }
1425 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001426}
1427
Greg Claytona3c444a2010-10-01 23:13:49 +00001428static bool
1429IsOperator (const char *name, OverloadedOperatorKind &op_kind)
1430{
1431 if (name == NULL || name[0] == '\0')
1432 return false;
1433
Sean Callanana43f20d2010-12-10 19:51:54 +00001434#define OPERATOR_PREFIX "operator"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001435#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
Sean Callananbfeff8c2010-12-10 02:15:55 +00001436
1437 const char *post_op_name = NULL;
1438
Sean Callanana43f20d2010-12-10 19:51:54 +00001439 bool no_space = true;
Sean Callananbfeff8c2010-12-10 02:15:55 +00001440
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001441 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
Greg Claytona3c444a2010-10-01 23:13:49 +00001442 return false;
1443
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001444 post_op_name = name + OPERATOR_PREFIX_LENGTH;
1445
Sean Callanana43f20d2010-12-10 19:51:54 +00001446 if (post_op_name[0] == ' ')
1447 {
1448 post_op_name++;
1449 no_space = false;
1450 }
1451
1452#undef OPERATOR_PREFIX
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001453#undef OPERATOR_PREFIX_LENGTH
Sean Callanana43f20d2010-12-10 19:51:54 +00001454
Greg Claytona3c444a2010-10-01 23:13:49 +00001455 // This is an operator, set the overloaded operator kind to invalid
1456 // in case this is a conversion operator...
1457 op_kind = NUM_OVERLOADED_OPERATORS;
1458
1459 switch (post_op_name[0])
1460 {
Sean Callananbfeff8c2010-12-10 02:15:55 +00001461 default:
1462 if (no_space)
1463 return false;
1464 break;
Greg Claytona3c444a2010-10-01 23:13:49 +00001465 case 'n':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001466 if (no_space)
1467 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001468 if (strcmp (post_op_name, "new") == 0)
1469 op_kind = OO_New;
1470 else if (strcmp (post_op_name, "new[]") == 0)
1471 op_kind = OO_Array_New;
1472 break;
1473
1474 case 'd':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001475 if (no_space)
1476 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001477 if (strcmp (post_op_name, "delete") == 0)
1478 op_kind = OO_Delete;
1479 else if (strcmp (post_op_name, "delete[]") == 0)
1480 op_kind = OO_Array_Delete;
1481 break;
1482
1483 case '+':
1484 if (post_op_name[1] == '\0')
1485 op_kind = OO_Plus;
1486 else if (post_op_name[2] == '\0')
1487 {
1488 if (post_op_name[1] == '=')
1489 op_kind = OO_PlusEqual;
1490 else if (post_op_name[1] == '+')
1491 op_kind = OO_PlusPlus;
1492 }
1493 break;
1494
1495 case '-':
1496 if (post_op_name[1] == '\0')
1497 op_kind = OO_Minus;
1498 else if (post_op_name[2] == '\0')
1499 {
1500 switch (post_op_name[1])
1501 {
1502 case '=': op_kind = OO_MinusEqual; break;
1503 case '-': op_kind = OO_MinusMinus; break;
1504 case '>': op_kind = OO_Arrow; break;
1505 }
1506 }
1507 else if (post_op_name[3] == '\0')
1508 {
1509 if (post_op_name[2] == '*')
1510 op_kind = OO_ArrowStar; break;
1511 }
1512 break;
1513
1514 case '*':
1515 if (post_op_name[1] == '\0')
1516 op_kind = OO_Star;
1517 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1518 op_kind = OO_StarEqual;
1519 break;
1520
1521 case '/':
1522 if (post_op_name[1] == '\0')
1523 op_kind = OO_Slash;
1524 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1525 op_kind = OO_SlashEqual;
1526 break;
1527
1528 case '%':
1529 if (post_op_name[1] == '\0')
1530 op_kind = OO_Percent;
1531 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1532 op_kind = OO_PercentEqual;
1533 break;
1534
1535
1536 case '^':
1537 if (post_op_name[1] == '\0')
1538 op_kind = OO_Caret;
1539 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1540 op_kind = OO_CaretEqual;
1541 break;
1542
1543 case '&':
1544 if (post_op_name[1] == '\0')
1545 op_kind = OO_Amp;
1546 else if (post_op_name[2] == '\0')
1547 {
1548 switch (post_op_name[1])
1549 {
1550 case '=': op_kind = OO_AmpEqual; break;
1551 case '&': op_kind = OO_AmpAmp; break;
1552 }
1553 }
1554 break;
1555
1556 case '|':
1557 if (post_op_name[1] == '\0')
1558 op_kind = OO_Pipe;
1559 else if (post_op_name[2] == '\0')
1560 {
1561 switch (post_op_name[1])
1562 {
1563 case '=': op_kind = OO_PipeEqual; break;
1564 case '|': op_kind = OO_PipePipe; break;
1565 }
1566 }
1567 break;
1568
1569 case '~':
1570 if (post_op_name[1] == '\0')
1571 op_kind = OO_Tilde;
1572 break;
1573
1574 case '!':
1575 if (post_op_name[1] == '\0')
1576 op_kind = OO_Exclaim;
1577 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1578 op_kind = OO_ExclaimEqual;
1579 break;
1580
1581 case '=':
1582 if (post_op_name[1] == '\0')
1583 op_kind = OO_Equal;
1584 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1585 op_kind = OO_EqualEqual;
1586 break;
1587
1588 case '<':
1589 if (post_op_name[1] == '\0')
1590 op_kind = OO_Less;
1591 else if (post_op_name[2] == '\0')
1592 {
1593 switch (post_op_name[1])
1594 {
1595 case '<': op_kind = OO_LessLess; break;
1596 case '=': op_kind = OO_LessEqual; break;
1597 }
1598 }
1599 else if (post_op_name[3] == '\0')
1600 {
1601 if (post_op_name[2] == '=')
1602 op_kind = OO_LessLessEqual;
1603 }
1604 break;
1605
1606 case '>':
1607 if (post_op_name[1] == '\0')
1608 op_kind = OO_Greater;
1609 else if (post_op_name[2] == '\0')
1610 {
1611 switch (post_op_name[1])
1612 {
1613 case '>': op_kind = OO_GreaterGreater; break;
1614 case '=': op_kind = OO_GreaterEqual; break;
1615 }
1616 }
1617 else if (post_op_name[1] == '>' &&
1618 post_op_name[2] == '=' &&
1619 post_op_name[3] == '\0')
1620 {
1621 op_kind = OO_GreaterGreaterEqual;
1622 }
1623 break;
1624
1625 case ',':
1626 if (post_op_name[1] == '\0')
1627 op_kind = OO_Comma;
1628 break;
1629
1630 case '(':
1631 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1632 op_kind = OO_Call;
1633 break;
1634
1635 case '[':
1636 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1637 op_kind = OO_Subscript;
1638 break;
1639 }
1640
1641 return true;
1642}
Greg Clayton6beaaa62011-01-17 03:46:26 +00001643
Greg Clayton090d0982011-06-19 03:43:27 +00001644static inline bool
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001645check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001646{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001647 // Special-case call since it can take any number of operands
1648 if(op_kind == OO_Call)
1649 return true;
1650
Greg Clayton090d0982011-06-19 03:43:27 +00001651 // The parameter count doens't include "this"
1652 if (num_params == 0)
1653 return unary;
1654 if (num_params == 1)
1655 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001656 else
Greg Clayton090d0982011-06-19 03:43:27 +00001657 return false;
1658}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001659
Greg Clayton090d0982011-06-19 03:43:27 +00001660bool
1661ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1662{
Sean Callanan5b26f272012-02-04 08:49:35 +00001663 switch (op_kind)
1664 {
1665 default:
1666 break;
1667 // C++ standard allows any number of arguments to new/delete
1668 case OO_New:
1669 case OO_Array_New:
1670 case OO_Delete:
1671 case OO_Array_Delete:
1672 return true;
1673 }
1674
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001675#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (op_kind, Unary, Binary, num_params);
Greg Clayton090d0982011-06-19 03:43:27 +00001676 switch (op_kind)
1677 {
1678#include "clang/Basic/OperatorKinds.def"
1679 default: break;
1680 }
1681 return false;
1682}
1683
Greg Claytona51ed9b2010-09-23 01:09:21 +00001684CXXMethodDecl *
Sean Callanan61da09b2010-09-17 02:58:26 +00001685ClangASTContext::AddMethodToCXXRecordType
1686(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001687 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001688 clang_type_t record_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001689 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001690 clang_type_t method_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001691 lldb::AccessType access,
Greg Clayton0fffff52010-09-24 05:15:53 +00001692 bool is_virtual,
1693 bool is_static,
Greg Claytonf51de672010-10-01 02:31:07 +00001694 bool is_inline,
Sean Callananc1b732d2011-11-01 18:07:13 +00001695 bool is_explicit,
Sean Callanandbb58392011-11-02 01:38:59 +00001696 bool is_attr_used,
1697 bool is_artificial
Greg Claytona51ed9b2010-09-23 01:09:21 +00001698)
Sean Callanan61da09b2010-09-17 02:58:26 +00001699{
Sean Callananfc55f5d2010-09-21 00:44:12 +00001700 if (!record_opaque_type || !method_opaque_type || !name)
Johnny Chend440bcc2010-09-28 16:10:54 +00001701 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001702
Greg Clayton6beaaa62011-01-17 03:46:26 +00001703 assert(ast);
Sean Callanan61da09b2010-09-17 02:58:26 +00001704
Greg Clayton6beaaa62011-01-17 03:46:26 +00001705 IdentifierTable *identifier_table = &ast->Idents;
Sean Callanan61da09b2010-09-17 02:58:26 +00001706
1707 assert(identifier_table);
1708
Sean Callananfc55f5d2010-09-21 00:44:12 +00001709 QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00001710
Greg Clayton6beaaa62011-01-17 03:46:26 +00001711 CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
Sean Callanan61da09b2010-09-17 02:58:26 +00001712
Greg Clayton0fffff52010-09-24 05:15:53 +00001713 if (cxx_record_decl == NULL)
Greg Claytona51ed9b2010-09-23 01:09:21 +00001714 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001715
Greg Clayton0fffff52010-09-24 05:15:53 +00001716 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001717
Greg Claytonf51de672010-10-01 02:31:07 +00001718 CXXMethodDecl *cxx_method_decl = NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001719
Greg Claytonf51de672010-10-01 02:31:07 +00001720 DeclarationName decl_name (&identifier_table->get(name));
Greg Clayton878eaf12010-10-01 03:45:20 +00001721
Sean Callanan78e37602011-01-27 04:42:51 +00001722 const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
Greg Clayton878eaf12010-10-01 03:45:20 +00001723
Greg Clayton90a2acd2010-10-02 01:40:05 +00001724 if (function_Type == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001725 return NULL;
1726
Sean Callanan78e37602011-01-27 04:42:51 +00001727 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
Greg Clayton878eaf12010-10-01 03:45:20 +00001728
1729 if (!method_function_prototype)
1730 return NULL;
1731
1732 unsigned int num_params = method_function_prototype->getNumArgs();
1733
Sean Callanandbb58392011-11-02 01:38:59 +00001734 CXXDestructorDecl *cxx_dtor_decl(NULL);
1735 CXXConstructorDecl *cxx_ctor_decl(NULL);
1736
Greg Clayton878eaf12010-10-01 03:45:20 +00001737 if (name[0] == '~')
Greg Claytonf51de672010-10-01 02:31:07 +00001738 {
Sean Callanandbb58392011-11-02 01:38:59 +00001739 cxx_dtor_decl = CXXDestructorDecl::Create (*ast,
1740 cxx_record_decl,
1741 SourceLocation(),
1742 DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1743 method_qual_type,
1744 NULL,
1745 is_inline,
1746 is_artificial);
1747 cxx_method_decl = cxx_dtor_decl;
Greg Clayton878eaf12010-10-01 03:45:20 +00001748 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001749 else if (decl_name == cxx_record_decl->getDeclName())
Greg Clayton878eaf12010-10-01 03:45:20 +00001750 {
Sean Callanandbb58392011-11-02 01:38:59 +00001751 cxx_ctor_decl = CXXConstructorDecl::Create (*ast,
1752 cxx_record_decl,
1753 SourceLocation(),
1754 DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1755 method_qual_type,
1756 NULL, // TypeSourceInfo *
1757 is_explicit,
1758 is_inline,
1759 is_artificial,
1760 false /*is_constexpr*/);
1761 cxx_method_decl = cxx_ctor_decl;
Greg Claytonf51de672010-10-01 02:31:07 +00001762 }
1763 else
Greg Clayton878eaf12010-10-01 03:45:20 +00001764 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001765
1766 OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1767 if (IsOperator (name, op_kind))
Greg Clayton878eaf12010-10-01 03:45:20 +00001768 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001769 if (op_kind != NUM_OVERLOADED_OPERATORS)
1770 {
Greg Clayton090d0982011-06-19 03:43:27 +00001771 // Check the number of operator parameters. Sometimes we have
1772 // seen bad DWARF that doesn't correctly describe operators and
1773 // if we try to create a methed and add it to the class, clang
1774 // will assert and crash, so we need to make sure things are
1775 // acceptable.
1776 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
1777 return NULL;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001778 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001779 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001780 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001781 DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001782 method_qual_type,
1783 NULL, // TypeSourceInfo *
Greg Claytona3c444a2010-10-01 23:13:49 +00001784 is_static,
1785 SC_None,
Sean Callananfb0b7582011-03-15 00:17:19 +00001786 is_inline,
Sean Callanan880e6802011-10-07 23:18:13 +00001787 false /*is_constexpr*/,
Sean Callananfb0b7582011-03-15 00:17:19 +00001788 SourceLocation());
Greg Claytona3c444a2010-10-01 23:13:49 +00001789 }
1790 else if (num_params == 0)
1791 {
1792 // Conversion operators don't take params...
Greg Clayton6beaaa62011-01-17 03:46:26 +00001793 cxx_method_decl = CXXConversionDecl::Create (*ast,
Greg Claytona3c444a2010-10-01 23:13:49 +00001794 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001795 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001796 DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
Greg Claytona3c444a2010-10-01 23:13:49 +00001797 method_qual_type,
1798 NULL, // TypeSourceInfo *
1799 is_inline,
Sean Callananfb0b7582011-03-15 00:17:19 +00001800 is_explicit,
Sean Callanan880e6802011-10-07 23:18:13 +00001801 false /*is_constexpr*/,
Sean Callananfb0b7582011-03-15 00:17:19 +00001802 SourceLocation());
Greg Claytona3c444a2010-10-01 23:13:49 +00001803 }
Greg Clayton878eaf12010-10-01 03:45:20 +00001804 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001805
1806 if (cxx_method_decl == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001807 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001808 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001809 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001810 SourceLocation(),
Greg Claytona3c444a2010-10-01 23:13:49 +00001811 DeclarationNameInfo (decl_name, SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001812 method_qual_type,
1813 NULL, // TypeSourceInfo *
1814 is_static,
1815 SC_None,
Sean Callananfb0b7582011-03-15 00:17:19 +00001816 is_inline,
Sean Callanan880e6802011-10-07 23:18:13 +00001817 false /*is_constexpr*/,
Sean Callananfb0b7582011-03-15 00:17:19 +00001818 SourceLocation());
Greg Clayton878eaf12010-10-01 03:45:20 +00001819 }
Greg Claytonf51de672010-10-01 02:31:07 +00001820 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001821
Greg Clayton1be10fc2010-09-29 01:12:09 +00001822 AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
Greg Clayton0fffff52010-09-24 05:15:53 +00001823
1824 cxx_method_decl->setAccess (access_specifier);
1825 cxx_method_decl->setVirtualAsWritten (is_virtual);
Sean Callanane2ef6e32010-09-23 03:01:22 +00001826
Sean Callananc1b732d2011-11-01 18:07:13 +00001827 if (is_attr_used)
1828 cxx_method_decl->addAttr(::new (*ast) UsedAttr(SourceRange(), *ast));
1829
Sean Callananfc55f5d2010-09-21 00:44:12 +00001830 // Populate the method decl with parameter decls
Sean Callananfc55f5d2010-09-21 00:44:12 +00001831
Charles Davis8c444c42011-05-19 23:33:46 +00001832 llvm::SmallVector<ParmVarDecl *, 12> params;
Sean Callananfc55f5d2010-09-21 00:44:12 +00001833
1834 for (int param_index = 0;
1835 param_index < num_params;
1836 ++param_index)
1837 {
Charles Davis8c444c42011-05-19 23:33:46 +00001838 params.push_back (ParmVarDecl::Create (*ast,
1839 cxx_method_decl,
1840 SourceLocation(),
1841 SourceLocation(),
1842 NULL, // anonymous
1843 method_function_prototype->getArgType(param_index),
1844 NULL,
1845 SC_None,
1846 SC_None,
1847 NULL));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001848 }
1849
Sean Callanan880e6802011-10-07 23:18:13 +00001850 cxx_method_decl->setParams (ArrayRef<ParmVarDecl*>(params));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001851
Greg Clayton0fffff52010-09-24 05:15:53 +00001852 cxx_record_decl->addDecl (cxx_method_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001853
Greg Clayton8b867b42011-11-02 02:06:20 +00001854 // Sometimes the debug info will mention a constructor (default/copy/move),
1855 // destructor, or assignment operator (copy/move) but there won't be any
1856 // version of this in the code. So we check if the function was artificially
1857 // generated and if it is trivial and this lets the compiler/backend know
1858 // that it can inline the IR for these when it needs to and we can avoid a
1859 // "missing function" error when running expressions.
1860
Sean Callanandbb58392011-11-02 01:38:59 +00001861 if (is_artificial)
1862 {
Greg Clayton8b867b42011-11-02 02:06:20 +00001863 if (cxx_ctor_decl &&
1864 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
1865 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
1866 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
Sean Callanandbb58392011-11-02 01:38:59 +00001867 {
1868 cxx_ctor_decl->setDefaulted();
1869 cxx_ctor_decl->setTrivial(true);
1870 }
Greg Clayton8b867b42011-11-02 02:06:20 +00001871 else if (cxx_dtor_decl)
Sean Callanandbb58392011-11-02 01:38:59 +00001872 {
Greg Clayton8b867b42011-11-02 02:06:20 +00001873 if (cxx_record_decl->hasTrivialDestructor())
1874 {
1875 cxx_dtor_decl->setDefaulted();
1876 cxx_dtor_decl->setTrivial(true);
1877 }
1878 }
1879 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
1880 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
1881 {
1882 cxx_method_decl->setDefaulted();
1883 cxx_method_decl->setTrivial(true);
Sean Callanandbb58392011-11-02 01:38:59 +00001884 }
1885 }
1886
Sean Callanan5e9e1992011-10-26 01:06:27 +00001887#ifdef LLDB_CONFIGURATION_DEBUG
1888 VerifyDecl(cxx_method_decl);
1889#endif
Greg Claytonc432c192011-01-20 04:18:48 +00001890
1891// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
1892// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
1893// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
1894// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
1895// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
1896// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
1897// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
1898// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
1899// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
Greg Claytona51ed9b2010-09-23 01:09:21 +00001900 return cxx_method_decl;
Sean Callanan61da09b2010-09-17 02:58:26 +00001901}
1902
Jim Inghame3ae82a2011-11-12 01:36:43 +00001903clang::FieldDecl *
Greg Clayton8cf05932010-07-22 18:30:50 +00001904ClangASTContext::AddFieldToRecordType
1905(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001906 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001907 clang_type_t record_clang_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001908 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001909 clang_type_t field_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001910 AccessType access,
1911 uint32_t bitfield_bit_size
1912)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001913{
1914 if (record_clang_type == NULL || field_type == NULL)
Jim Inghame3ae82a2011-11-12 01:36:43 +00001915 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001916
Jim Inghame3ae82a2011-11-12 01:36:43 +00001917 FieldDecl *field = NULL;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001918 IdentifierTable *identifier_table = &ast->Idents;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001919
Greg Clayton6beaaa62011-01-17 03:46:26 +00001920 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001921 assert (identifier_table != NULL);
1922
1923 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
1924
Sean Callanan78e37602011-01-27 04:42:51 +00001925 const clang::Type *clang_type = record_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001926 if (clang_type)
1927 {
1928 const RecordType *record_type = dyn_cast<RecordType>(clang_type);
1929
1930 if (record_type)
1931 {
1932 RecordDecl *record_decl = record_type->getDecl();
1933
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001934 clang::Expr *bit_width = NULL;
1935 if (bitfield_bit_size != 0)
1936 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001937 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1938 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001939 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00001940 field = FieldDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001941 record_decl,
1942 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00001943 SourceLocation(),
Greg Clayton8cf05932010-07-22 18:30:50 +00001944 name ? &identifier_table->get(name) : NULL, // Identifier
1945 QualType::getFromOpaquePtr(field_type), // Field type
Sean Callanancc427fa2011-07-30 02:42:06 +00001946 NULL, // TInfo *
Greg Clayton8cf05932010-07-22 18:30:50 +00001947 bit_width, // BitWidth
Sean Callanancc427fa2011-07-30 02:42:06 +00001948 false, // Mutable
1949 false); // HasInit
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001950
1951 if (!name)
1952 field->setImplicit();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001953
Greg Clayton8cf05932010-07-22 18:30:50 +00001954 field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001955
1956 if (field)
1957 {
1958 record_decl->addDecl(field);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001959
1960#ifdef LLDB_CONFIGURATION_DEBUG
1961 VerifyDecl(field);
1962#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001963 }
1964 }
Greg Clayton9e409562010-07-28 02:04:09 +00001965 else
1966 {
Sean Callanan78e37602011-01-27 04:42:51 +00001967 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
Greg Clayton9e409562010-07-28 02:04:09 +00001968 if (objc_class_type)
1969 {
Greg Clayton0fffff52010-09-24 05:15:53 +00001970 bool is_synthesized = false;
Jim Inghame3ae82a2011-11-12 01:36:43 +00001971 field = ClangASTContext::AddObjCClassIVar (ast,
Sean Callanan6e6a7c72010-09-16 20:01:08 +00001972 record_clang_type,
Greg Clayton9e409562010-07-28 02:04:09 +00001973 name,
1974 field_type,
1975 access,
1976 bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00001977 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00001978 }
1979 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001980 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00001981 return field;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001982}
1983
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001984static clang::AccessSpecifier UnifyAccessSpecifiers (clang::AccessSpecifier lhs,
1985 clang::AccessSpecifier rhs)
1986{
1987 clang::AccessSpecifier ret = lhs;
1988
1989 // Make the access equal to the stricter of the field and the nested field's access
1990 switch (ret)
1991 {
1992 case clang::AS_none:
1993 break;
1994 case clang::AS_private:
1995 break;
1996 case clang::AS_protected:
1997 if (rhs == AS_private)
1998 ret = AS_private;
1999 break;
2000 case clang::AS_public:
2001 ret = rhs;
2002 break;
2003 }
2004
2005 return ret;
2006}
2007
2008void
2009ClangASTContext::BuildIndirectFields (clang::ASTContext *ast,
2010 lldb::clang_type_t record_clang_type)
2011{
2012 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
2013
2014 const RecordType *record_type = record_qual_type->getAs<RecordType>();
2015
2016 if (!record_type)
2017 return;
2018
2019 RecordDecl *record_decl = record_type->getDecl();
2020
2021 if (!record_decl)
2022 return;
2023
2024 typedef llvm::SmallVector <IndirectFieldDecl *, 1> IndirectFieldVector;
2025
2026 IndirectFieldVector indirect_fields;
2027
2028 for (RecordDecl::field_iterator fi = record_decl->field_begin(), fe = record_decl->field_end();
2029 fi != fe;
2030 ++fi)
2031 {
2032 if (fi->isAnonymousStructOrUnion())
2033 {
2034 QualType field_qual_type = fi->getType();
2035
2036 const RecordType *field_record_type = field_qual_type->getAs<RecordType>();
2037
2038 if (!field_record_type)
2039 continue;
2040
2041 RecordDecl *field_record_decl = field_record_type->getDecl();
2042
2043 if (!field_record_decl)
2044 continue;
2045
2046 for (RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
2047 di != de;
2048 ++di)
2049 {
2050 if (FieldDecl *nested_field_decl = dyn_cast<FieldDecl>(*di))
2051 {
2052 NamedDecl **chain = new (*ast) NamedDecl*[2];
2053 chain[0] = *fi;
2054 chain[1] = nested_field_decl;
2055 IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*ast,
2056 record_decl,
2057 SourceLocation(),
2058 nested_field_decl->getIdentifier(),
2059 nested_field_decl->getType(),
2060 chain,
2061 2);
2062
2063 indirect_field->setAccess(UnifyAccessSpecifiers(fi->getAccess(),
2064 nested_field_decl->getAccess()));
2065
2066 indirect_fields.push_back(indirect_field);
2067 }
2068 else if (IndirectFieldDecl *nested_indirect_field_decl = dyn_cast<IndirectFieldDecl>(*di))
2069 {
2070 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
2071 NamedDecl **chain = new (*ast) NamedDecl*[nested_chain_size + 1];
2072 chain[0] = *fi;
2073
2074 int chain_index = 1;
2075 for (IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
2076 nce = nested_indirect_field_decl->chain_end();
2077 nci < nce;
2078 ++nci)
2079 {
2080 chain[chain_index] = *nci;
2081 chain_index++;
2082 }
2083
2084 IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*ast,
2085 record_decl,
2086 SourceLocation(),
2087 nested_indirect_field_decl->getIdentifier(),
2088 nested_indirect_field_decl->getType(),
2089 chain,
2090 nested_chain_size + 1);
2091
2092 indirect_field->setAccess(UnifyAccessSpecifiers(fi->getAccess(),
2093 nested_indirect_field_decl->getAccess()));
2094
2095 indirect_fields.push_back(indirect_field);
2096 }
2097 }
2098 }
2099 }
2100
2101 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
2102 ifi < ife;
2103 ++ifi)
2104 {
2105 record_decl->addDecl(*ifi);
2106 }
2107}
2108
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002109bool
2110ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
2111{
2112 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
2113}
2114
2115bool
2116ClangASTContext::FieldIsBitfield
2117(
Greg Clayton6beaaa62011-01-17 03:46:26 +00002118 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002119 FieldDecl* field,
2120 uint32_t& bitfield_bit_size
2121)
2122{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002123 if (ast == NULL || field == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002124 return false;
2125
2126 if (field->isBitField())
2127 {
2128 Expr* bit_width_expr = field->getBitWidth();
2129 if (bit_width_expr)
2130 {
2131 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002132 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002133 {
2134 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
2135 return true;
2136 }
2137 }
2138 }
2139 return false;
2140}
2141
2142bool
2143ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
2144{
2145 if (record_decl == NULL)
2146 return false;
2147
2148 if (!record_decl->field_empty())
2149 return true;
2150
2151 // No fields, lets check this is a CXX record and check the base classes
2152 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2153 if (cxx_record_decl)
2154 {
2155 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2156 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2157 base_class != base_class_end;
2158 ++base_class)
2159 {
2160 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2161 if (RecordHasFields(base_class_decl))
2162 return true;
2163 }
2164 }
2165 return false;
2166}
2167
2168void
Greg Clayton6beaaa62011-01-17 03:46:26 +00002169ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002170{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002171 if (clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002172 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002173 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2174
Sean Callanan78e37602011-01-27 04:42:51 +00002175 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00002176 if (record_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002177 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002178 RecordDecl *record_decl = record_type->getDecl();
2179 if (record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002180 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002181 uint32_t field_idx;
2182 RecordDecl::field_iterator field, field_end;
2183 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2184 field != field_end;
2185 ++field, ++field_idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002186 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002187 // If no accessibility was assigned, assign the correct one
2188 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2189 field->setAccess ((AccessSpecifier)default_accessibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002190 }
2191 }
2192 }
2193 }
2194}
2195
2196#pragma mark C++ Base Classes
2197
2198CXXBaseSpecifier *
Greg Clayton1be10fc2010-09-29 01:12:09 +00002199ClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002200{
2201 if (base_class_type)
Greg Claytone6371122010-07-30 20:30:44 +00002202 return new CXXBaseSpecifier (SourceRange(),
2203 is_virtual,
2204 base_of_class,
2205 ConvertAccessTypeToAccessSpecifier (access),
Sean Callanan2c777c42011-01-18 23:32:05 +00002206 getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
2207 SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002208 return NULL;
2209}
2210
Greg Clayton0b42ac32010-07-02 01:29:13 +00002211void
2212ClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
2213{
2214 for (unsigned i=0; i<num_base_classes; ++i)
2215 {
2216 delete base_classes[i];
2217 base_classes[i] = NULL;
2218 }
2219}
2220
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002221bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002222ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002223{
2224 if (class_clang_type)
2225 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002226 CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
2227 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002228 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002229 cxx_record_decl->setBases(base_classes, num_base_classes);
2230 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002231 }
2232 }
2233 return false;
2234}
Greg Clayton8cf05932010-07-22 18:30:50 +00002235#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002236
Greg Clayton1be10fc2010-09-29 01:12:09 +00002237clang_type_t
Greg Clayton8cf05932010-07-22 18:30:50 +00002238ClangASTContext::CreateObjCClass
2239(
2240 const char *name,
2241 DeclContext *decl_ctx,
2242 bool isForwardDecl,
2243 bool isInternal
2244)
2245{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002246 ASTContext *ast = getASTContext();
2247 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00002248 assert (name && name[0]);
2249 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00002250 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00002251
2252 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
2253 // we will need to update this code. I was told to currently always use
2254 // the CXXRecordDecl class since we often don't know from debug information
2255 // if something is struct or a class, so we default to always use the more
2256 // complete definition just in case.
Greg Clayton6beaaa62011-01-17 03:46:26 +00002257 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00002258 decl_ctx,
2259 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00002260 &ast->Idents.get(name),
Sean Callanan5b26f272012-02-04 08:49:35 +00002261 NULL,
Greg Clayton8cf05932010-07-22 18:30:50 +00002262 SourceLocation(),
Sean Callanan5b26f272012-02-04 08:49:35 +00002263 /*isForwardDecl,*/
Greg Clayton8cf05932010-07-22 18:30:50 +00002264 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00002265
Greg Clayton6beaaa62011-01-17 03:46:26 +00002266 return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00002267}
2268
2269bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002270ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
Greg Clayton8cf05932010-07-22 18:30:50 +00002271{
2272 if (class_opaque_type && super_opaque_type)
2273 {
2274 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2275 QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
Sean Callanan78e37602011-01-27 04:42:51 +00002276 const clang::Type *class_type = class_qual_type.getTypePtr();
2277 const clang::Type *super_type = super_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00002278 if (class_type && super_type)
2279 {
Sean Callanan78e37602011-01-27 04:42:51 +00002280 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2281 const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00002282 if (objc_class_type && objc_super_type)
2283 {
2284 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2285 ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
2286 if (class_interface_decl && super_interface_decl)
2287 {
2288 class_interface_decl->setSuperClass(super_interface_decl);
2289 return true;
2290 }
2291 }
2292 }
2293 }
2294 return false;
2295}
2296
2297
Jim Inghame3ae82a2011-11-12 01:36:43 +00002298FieldDecl *
Greg Clayton8cf05932010-07-22 18:30:50 +00002299ClangASTContext::AddObjCClassIVar
2300(
Greg Clayton6beaaa62011-01-17 03:46:26 +00002301 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002302 clang_type_t class_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00002303 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002304 clang_type_t ivar_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00002305 AccessType access,
2306 uint32_t bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00002307 bool is_synthesized
Greg Clayton8cf05932010-07-22 18:30:50 +00002308)
2309{
2310 if (class_opaque_type == NULL || ivar_opaque_type == NULL)
Jim Inghame3ae82a2011-11-12 01:36:43 +00002311 return NULL;
Greg Clayton8cf05932010-07-22 18:30:50 +00002312
Jim Inghame3ae82a2011-11-12 01:36:43 +00002313 ObjCIvarDecl *field = NULL;
2314
Greg Clayton6beaaa62011-01-17 03:46:26 +00002315 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton8cf05932010-07-22 18:30:50 +00002316
Greg Clayton6beaaa62011-01-17 03:46:26 +00002317 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00002318 assert (identifier_table != NULL);
2319
2320 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2321
Sean Callanan78e37602011-01-27 04:42:51 +00002322 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00002323 if (class_type)
2324 {
Sean Callanan78e37602011-01-27 04:42:51 +00002325 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00002326
2327 if (objc_class_type)
2328 {
2329 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2330
2331 if (class_interface_decl)
2332 {
2333 clang::Expr *bit_width = NULL;
2334 if (bitfield_bit_size != 0)
2335 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002336 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
2337 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Greg Clayton8cf05932010-07-22 18:30:50 +00002338 }
2339
Jim Inghame3ae82a2011-11-12 01:36:43 +00002340 field = ObjCIvarDecl::Create (*ast,
2341 class_interface_decl,
2342 SourceLocation(),
2343 SourceLocation(),
2344 &identifier_table->get(name), // Identifier
2345 QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
2346 NULL, // TypeSourceInfo *
2347 ConvertAccessTypeToObjCIvarAccessControl (access),
2348 bit_width,
2349 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00002350
2351 if (field)
2352 {
2353 class_interface_decl->addDecl(field);
Sean Callanan5e9e1992011-10-26 01:06:27 +00002354
2355#ifdef LLDB_CONFIGURATION_DEBUG
2356 VerifyDecl(field);
2357#endif
2358
Jim Inghame3ae82a2011-11-12 01:36:43 +00002359 return field;
Greg Clayton9e409562010-07-28 02:04:09 +00002360 }
Greg Clayton8cf05932010-07-22 18:30:50 +00002361 }
2362 }
2363 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002364 return NULL;
2365}
2366
2367bool
2368ClangASTContext::AddObjCClassProperty
2369(
2370 ASTContext *ast,
2371 clang_type_t class_opaque_type,
2372 const char *property_name,
2373 clang_type_t property_opaque_type,
2374 ObjCIvarDecl *ivar_decl,
2375 const char *property_setter_name,
2376 const char *property_getter_name,
2377 uint32_t property_attributes
2378)
2379{
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002380 if (class_opaque_type == NULL || property_name == NULL || property_name[0] == '\0')
Jim Inghame3ae82a2011-11-12 01:36:43 +00002381 return false;
2382
2383 IdentifierTable *identifier_table = &ast->Idents;
2384
2385 assert (ast != NULL);
2386 assert (identifier_table != NULL);
2387
2388 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2389 const clang::Type *class_type = class_qual_type.getTypePtr();
2390 if (class_type)
2391 {
2392 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2393
2394 if (objc_class_type)
2395 {
2396 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2397
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002398 clang_type_t property_opaque_type_to_access;
2399
2400 if (property_opaque_type)
2401 property_opaque_type_to_access = property_opaque_type;
2402 else if (ivar_decl)
2403 property_opaque_type_to_access = ivar_decl->getType().getAsOpaquePtr();
2404
Jim Inghame3ae82a2011-11-12 01:36:43 +00002405 // FIXME: For now, we don't know how to add properties if we don't have their associated ivar.
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002406 if (class_interface_decl && property_opaque_type_to_access)
Jim Inghame3ae82a2011-11-12 01:36:43 +00002407 {
2408 clang::TypeSourceInfo *prop_type_source;
2409 if (ivar_decl)
2410 prop_type_source = ast->CreateTypeSourceInfo (ivar_decl->getType());
2411 else
2412 prop_type_source = ast->CreateTypeSourceInfo (QualType::getFromOpaquePtr(property_opaque_type));
2413
2414 ObjCPropertyDecl *property_decl = ObjCPropertyDecl::Create(*ast,
2415 class_interface_decl,
2416 SourceLocation(), // Source Location
2417 &identifier_table->get(property_name),
2418 SourceLocation(), //Source Location for AT
Sean Callanand5f33a82012-03-01 02:03:47 +00002419 SourceLocation(), //Source location for (
Jim Inghame3ae82a2011-11-12 01:36:43 +00002420 prop_type_source
2421 );
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002422 if (property_decl)
2423 {
Jim Inghame3ae82a2011-11-12 01:36:43 +00002424 class_interface_decl->addDecl (property_decl);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002425
2426 Selector setter_sel, getter_sel;
2427
Jim Inghame3ae82a2011-11-12 01:36:43 +00002428 if (property_setter_name != NULL)
2429 {
2430 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
2431 clang::IdentifierInfo *setter_ident = &identifier_table->get(property_setter_no_colon.c_str());
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002432 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
Jim Inghame3ae82a2011-11-12 01:36:43 +00002433 property_decl->setSetterName(setter_sel);
2434 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
2435 }
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002436 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
2437 {
2438 std::string setter_sel_string("set");
2439 setter_sel_string.push_back(::toupper(property_name[0]));
2440 setter_sel_string.append(&property_name[1]);
2441 clang::IdentifierInfo *setter_ident = &identifier_table->get(setter_sel_string.c_str());
2442 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
2443 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002444
2445 if (property_getter_name != NULL)
2446 {
2447 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_getter_name);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002448 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Jim Inghame3ae82a2011-11-12 01:36:43 +00002449 property_decl->setGetterName(getter_sel);
2450 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002451 }
2452 else
2453 {
2454 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_name);
2455 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Jim Inghame3ae82a2011-11-12 01:36:43 +00002456 }
2457
2458 if (ivar_decl)
2459 property_decl->setPropertyIvarDecl (ivar_decl);
2460
2461 if (property_attributes & DW_APPLE_PROPERTY_readonly)
2462 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
2463 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
2464 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
2465 if (property_attributes & DW_APPLE_PROPERTY_assign)
2466 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
2467 if (property_attributes & DW_APPLE_PROPERTY_retain)
2468 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
2469 if (property_attributes & DW_APPLE_PROPERTY_copy)
2470 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
2471 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
2472 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002473
2474 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
2475 {
2476 QualType result_type = QualType::getFromOpaquePtr(property_opaque_type_to_access);
2477
2478 const bool isInstance = true;
2479 const bool isVariadic = false;
2480 const bool isSynthesized = false;
2481 const bool isImplicitlyDeclared = true;
2482 const bool isDefined = false;
2483 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2484 const bool HasRelatedResultType = false;
2485
2486 ObjCMethodDecl *getter = ObjCMethodDecl::Create(*ast,
2487 SourceLocation(),
2488 SourceLocation(),
2489 getter_sel,
2490 result_type,
2491 NULL,
2492 class_interface_decl,
2493 isInstance,
2494 isVariadic,
2495 isSynthesized,
2496 isImplicitlyDeclared,
2497 isDefined,
2498 impControl,
2499 HasRelatedResultType);
2500
2501 getter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(), ArrayRef<SourceLocation>());
2502
2503 class_interface_decl->addDecl(getter);
2504 }
2505
2506 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
2507 {
2508 QualType result_type = ast->VoidTy;
2509
2510 const bool isInstance = true;
2511 const bool isVariadic = false;
2512 const bool isSynthesized = false;
2513 const bool isImplicitlyDeclared = true;
2514 const bool isDefined = false;
2515 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2516 const bool HasRelatedResultType = false;
2517
2518 ObjCMethodDecl *setter = ObjCMethodDecl::Create(*ast,
2519 SourceLocation(),
2520 SourceLocation(),
2521 setter_sel,
2522 result_type,
2523 NULL,
2524 class_interface_decl,
2525 isInstance,
2526 isVariadic,
2527 isSynthesized,
2528 isImplicitlyDeclared,
2529 isDefined,
2530 impControl,
2531 HasRelatedResultType);
2532
2533 llvm::SmallVector<ParmVarDecl *, 1> params;
2534
2535 params.push_back (ParmVarDecl::Create (*ast,
2536 setter,
2537 SourceLocation(),
2538 SourceLocation(),
2539 NULL, // anonymous
2540 QualType::getFromOpaquePtr(property_opaque_type_to_access),
2541 NULL,
2542 SC_Auto,
2543 SC_Auto,
2544 NULL));
2545
2546 setter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
2547
2548 class_interface_decl->addDecl(setter);
2549 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002550
2551 return true;
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002552 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002553 }
2554 }
2555 }
Greg Clayton8cf05932010-07-22 18:30:50 +00002556 return false;
2557}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002558
Greg Clayton9e409562010-07-28 02:04:09 +00002559bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002560ClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
Greg Clayton9e409562010-07-28 02:04:09 +00002561{
2562 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2563
Sean Callanan78e37602011-01-27 04:42:51 +00002564 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton9e409562010-07-28 02:04:09 +00002565 if (class_type)
2566 {
Sean Callanan78e37602011-01-27 04:42:51 +00002567 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton9e409562010-07-28 02:04:09 +00002568
2569 if (objc_class_type)
2570 return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
2571 }
2572 return false;
2573}
2574
2575bool
2576ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
2577{
2578 while (class_interface_decl)
2579 {
2580 if (class_interface_decl->ivar_size() > 0)
2581 return true;
2582
2583 if (check_superclass)
2584 class_interface_decl = class_interface_decl->getSuperClass();
2585 else
2586 break;
2587 }
2588 return false;
2589}
Greg Clayton0fffff52010-09-24 05:15:53 +00002590
Greg Clayton1be10fc2010-09-29 01:12:09 +00002591ObjCMethodDecl *
Greg Clayton0fffff52010-09-24 05:15:53 +00002592ClangASTContext::AddMethodToObjCObjectType
2593(
Greg Clayton6beaaa62011-01-17 03:46:26 +00002594 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002595 clang_type_t class_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00002596 const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
Greg Clayton1be10fc2010-09-29 01:12:09 +00002597 clang_type_t method_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00002598 lldb::AccessType access
2599)
2600{
2601 if (class_opaque_type == NULL || method_opaque_type == NULL)
2602 return NULL;
2603
Greg Clayton6beaaa62011-01-17 03:46:26 +00002604 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton0fffff52010-09-24 05:15:53 +00002605
Greg Clayton6beaaa62011-01-17 03:46:26 +00002606 assert (ast != NULL);
Greg Clayton0fffff52010-09-24 05:15:53 +00002607 assert (identifier_table != NULL);
2608
2609 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2610
Sean Callanan78e37602011-01-27 04:42:51 +00002611 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton0fffff52010-09-24 05:15:53 +00002612 if (class_type == NULL)
2613 return NULL;
2614
Sean Callanan78e37602011-01-27 04:42:51 +00002615 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton0fffff52010-09-24 05:15:53 +00002616
2617 if (objc_class_type == NULL)
2618 return NULL;
2619
2620 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2621
2622 if (class_interface_decl == NULL)
2623 return NULL;
Greg Clayton9e409562010-07-28 02:04:09 +00002624
Greg Clayton0fffff52010-09-24 05:15:53 +00002625 const char *selector_start = ::strchr (name, ' ');
2626 if (selector_start == NULL)
2627 return NULL;
2628
2629 selector_start++;
2630 if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
2631 return NULL;
2632 llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
2633
Greg Clayton450e3f32010-10-12 02:24:53 +00002634 size_t len = 0;
Greg Clayton0fffff52010-09-24 05:15:53 +00002635 const char *start;
Greg Clayton450e3f32010-10-12 02:24:53 +00002636 //printf ("name = '%s'\n", name);
2637
2638 unsigned num_selectors_with_args = 0;
2639 for (start = selector_start;
Greg Clayton0fffff52010-09-24 05:15:53 +00002640 start && *start != '\0' && *start != ']';
Greg Clayton450e3f32010-10-12 02:24:53 +00002641 start += len)
Greg Clayton0fffff52010-09-24 05:15:53 +00002642 {
Greg Clayton450e3f32010-10-12 02:24:53 +00002643 len = ::strcspn(start, ":]");
Greg Clayton90f90cd2010-10-27 04:01:14 +00002644 bool has_arg = (start[len] == ':');
2645 if (has_arg)
Greg Clayton450e3f32010-10-12 02:24:53 +00002646 ++num_selectors_with_args;
Greg Clayton0fffff52010-09-24 05:15:53 +00002647 selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
Greg Clayton90f90cd2010-10-27 04:01:14 +00002648 if (has_arg)
2649 len += 1;
Greg Clayton0fffff52010-09-24 05:15:53 +00002650 }
2651
2652
2653 if (selector_idents.size() == 0)
2654 return 0;
2655
Greg Clayton6beaaa62011-01-17 03:46:26 +00002656 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
Greg Clayton0fffff52010-09-24 05:15:53 +00002657 selector_idents.data());
2658
2659 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
2660
2661 // Populate the method decl with parameter decls
Sean Callanan78e37602011-01-27 04:42:51 +00002662 const clang::Type *method_type(method_qual_type.getTypePtr());
Greg Clayton0fffff52010-09-24 05:15:53 +00002663
2664 if (method_type == NULL)
2665 return NULL;
2666
Sean Callanan78e37602011-01-27 04:42:51 +00002667 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00002668
2669 if (!method_function_prototype)
2670 return NULL;
2671
2672
2673 bool is_variadic = false;
2674 bool is_synthesized = false;
2675 bool is_defined = false;
2676 ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
2677
2678 const unsigned num_args = method_function_prototype->getNumArgs();
2679
Greg Clayton6beaaa62011-01-17 03:46:26 +00002680 ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00002681 SourceLocation(), // beginLoc,
2682 SourceLocation(), // endLoc,
2683 method_selector,
2684 method_function_prototype->getResultType(),
2685 NULL, // TypeSourceInfo *ResultTInfo,
2686 GetDeclContextForType (class_opaque_type),
2687 name[0] == '-',
2688 is_variadic,
2689 is_synthesized,
Sean Callanan880e6802011-10-07 23:18:13 +00002690 true, // is_implicitly_declared
Greg Clayton0fffff52010-09-24 05:15:53 +00002691 is_defined,
2692 imp_control,
Sean Callanan880e6802011-10-07 23:18:13 +00002693 false /*has_related_result_type*/);
Greg Clayton0fffff52010-09-24 05:15:53 +00002694
2695
2696 if (objc_method_decl == NULL)
2697 return NULL;
2698
2699 if (num_args > 0)
2700 {
2701 llvm::SmallVector<ParmVarDecl *, 12> params;
2702
2703 for (int param_index = 0; param_index < num_args; ++param_index)
2704 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002705 params.push_back (ParmVarDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00002706 objc_method_decl,
2707 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00002708 SourceLocation(),
Greg Clayton0fffff52010-09-24 05:15:53 +00002709 NULL, // anonymous
2710 method_function_prototype->getArgType(param_index),
2711 NULL,
2712 SC_Auto,
2713 SC_Auto,
2714 NULL));
2715 }
2716
Sean Callanan880e6802011-10-07 23:18:13 +00002717 objc_method_decl->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
Greg Clayton0fffff52010-09-24 05:15:53 +00002718 }
2719
2720 class_interface_decl->addDecl (objc_method_decl);
2721
Sean Callanan5e9e1992011-10-26 01:06:27 +00002722#ifdef LLDB_CONFIGURATION_DEBUG
2723 VerifyDecl(objc_method_decl);
2724#endif
Greg Clayton0fffff52010-09-24 05:15:53 +00002725
2726 return objc_method_decl;
2727}
2728
Greg Clayton402230e2012-02-03 01:30:30 +00002729size_t
2730ClangASTContext::GetNumTemplateArguments (clang::ASTContext *ast, clang_type_t clang_type)
2731{
2732 if (clang_type)
2733 {
2734 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2735
2736 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2737 switch (type_class)
2738 {
2739 case clang::Type::Record:
2740 if (GetCompleteQualType (ast, qual_type))
2741 {
2742 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2743 if (cxx_record_decl)
2744 {
2745 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
2746 if (template_decl)
2747 return template_decl->getTemplateArgs().size();
2748 }
2749 }
2750 break;
2751
2752 case clang::Type::Typedef:
2753 return ClangASTContext::GetNumTemplateArguments (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2754 default:
2755 break;
2756 }
2757 }
2758 return 0;
2759}
2760
2761clang_type_t
2762ClangASTContext::GetTemplateArgument (clang::ASTContext *ast, clang_type_t clang_type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
2763{
2764 if (clang_type)
2765 {
2766 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2767
2768 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2769 switch (type_class)
2770 {
2771 case clang::Type::Record:
2772 if (GetCompleteQualType (ast, qual_type))
2773 {
2774 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2775 if (cxx_record_decl)
2776 {
2777 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
2778 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
2779 {
2780 const TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
2781 switch (template_arg.getKind())
2782 {
2783 case clang::TemplateArgument::Null:
2784 kind = eTemplateArgumentKindNull;
2785 return NULL;
2786
2787 case clang::TemplateArgument::Type:
2788 kind = eTemplateArgumentKindType;
2789 return template_arg.getAsType().getAsOpaquePtr();
2790
2791 case clang::TemplateArgument::Declaration:
2792 kind = eTemplateArgumentKindDeclaration;
2793 return NULL;
2794
2795 case clang::TemplateArgument::Integral:
2796 kind = eTemplateArgumentKindIntegral;
2797 return template_arg.getIntegralType().getAsOpaquePtr();
2798
2799 case clang::TemplateArgument::Template:
2800 kind = eTemplateArgumentKindTemplate;
2801 return NULL;
2802
2803 case clang::TemplateArgument::TemplateExpansion:
2804 kind = eTemplateArgumentKindTemplateExpansion;
2805 return NULL;
2806
2807 case clang::TemplateArgument::Expression:
2808 kind = eTemplateArgumentKindExpression;
2809 return NULL;
2810
2811 case clang::TemplateArgument::Pack:
2812 kind = eTemplateArgumentKindPack;
2813 return NULL;
2814
2815 default:
2816 assert (!"Unhandled TemplateArgument::ArgKind");
2817 kind = eTemplateArgumentKindNull;
2818 return NULL;
2819 }
2820 }
2821 }
2822 }
2823 break;
2824
2825 case clang::Type::Typedef:
2826 return ClangASTContext::GetTemplateArgument (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), arg_idx, kind);
2827 default:
2828 break;
2829 }
2830 }
2831 kind = eTemplateArgumentKindNull;
2832 return NULL;
2833}
Greg Clayton0fffff52010-09-24 05:15:53 +00002834
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002835uint32_t
Greg Clayton73b472d2010-10-27 03:32:59 +00002836ClangASTContext::GetTypeInfo
2837(
2838 clang_type_t clang_type,
Greg Clayton6beaaa62011-01-17 03:46:26 +00002839 clang::ASTContext *ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002840 clang_type_t *pointee_or_element_clang_type
2841)
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002842{
2843 if (clang_type == NULL)
Greg Clayton73b472d2010-10-27 03:32:59 +00002844 return 0;
2845
2846 if (pointee_or_element_clang_type)
2847 *pointee_or_element_clang_type = NULL;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002848
2849 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2850
2851 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2852 switch (type_class)
2853 {
Sean Callanana2424172010-10-25 00:29:48 +00002854 case clang::Type::Builtin:
2855 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2856 {
Sean Callanana2424172010-10-25 00:29:48 +00002857 case clang::BuiltinType::ObjCId:
2858 case clang::BuiltinType::ObjCClass:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002859 if (ast && pointee_or_element_clang_type)
2860 *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Sean Callanana2424172010-10-25 00:29:48 +00002861 return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
Enrico Granataf9fa6ee2011-07-12 00:18:11 +00002862 break;
2863 case clang::BuiltinType::Bool:
2864 case clang::BuiltinType::Char_U:
2865 case clang::BuiltinType::UChar:
2866 case clang::BuiltinType::WChar_U:
2867 case clang::BuiltinType::Char16:
2868 case clang::BuiltinType::Char32:
2869 case clang::BuiltinType::UShort:
2870 case clang::BuiltinType::UInt:
2871 case clang::BuiltinType::ULong:
2872 case clang::BuiltinType::ULongLong:
2873 case clang::BuiltinType::UInt128:
2874 case clang::BuiltinType::Char_S:
2875 case clang::BuiltinType::SChar:
2876 case clang::BuiltinType::WChar_S:
2877 case clang::BuiltinType::Short:
2878 case clang::BuiltinType::Int:
2879 case clang::BuiltinType::Long:
2880 case clang::BuiltinType::LongLong:
2881 case clang::BuiltinType::Int128:
2882 case clang::BuiltinType::Float:
2883 case clang::BuiltinType::Double:
2884 case clang::BuiltinType::LongDouble:
2885 return eTypeIsBuiltIn | eTypeHasValue | eTypeIsScalar;
Greg Clayton73b472d2010-10-27 03:32:59 +00002886 default:
2887 break;
Sean Callanana2424172010-10-25 00:29:48 +00002888 }
2889 return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002890
2891 case clang::Type::BlockPointer:
2892 if (pointee_or_element_clang_type)
2893 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2894 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2895
Greg Clayton49462ea2011-01-15 02:52:14 +00002896 case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002897
2898 case clang::Type::ConstantArray:
2899 case clang::Type::DependentSizedArray:
2900 case clang::Type::IncompleteArray:
2901 case clang::Type::VariableArray:
2902 if (pointee_or_element_clang_type)
2903 *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2904 return eTypeHasChildren | eTypeIsArray;
2905
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002906 case clang::Type::DependentName: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002907 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
2908 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
2909 case clang::Type::Decltype: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002910
2911 case clang::Type::Enum:
2912 if (pointee_or_element_clang_type)
2913 *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2914 return eTypeIsEnumeration | eTypeHasValue;
2915
Sean Callanan912855f2011-08-11 23:56:13 +00002916 case clang::Type::Elaborated:
2917 return ClangASTContext::GetTypeInfo (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2918 ast,
2919 pointee_or_element_clang_type);
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002920 case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector;
2921 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
2922 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002923 case clang::Type::InjectedClassName: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002924
2925 case clang::Type::LValueReference:
2926 case clang::Type::RValueReference:
2927 if (pointee_or_element_clang_type)
2928 *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2929 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2930
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002931 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002932
2933 case clang::Type::ObjCObjectPointer:
2934 if (pointee_or_element_clang_type)
2935 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2936 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2937
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002938 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2939 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
Greg Clayton73b472d2010-10-27 03:32:59 +00002940
2941 case clang::Type::Pointer:
2942 if (pointee_or_element_clang_type)
2943 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2944 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2945
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002946 case clang::Type::Record:
2947 if (qual_type->getAsCXXRecordDecl())
2948 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2949 else
2950 return eTypeHasChildren | eTypeIsStructUnion;
2951 break;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002952 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
2953 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
2954 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
Greg Clayton73b472d2010-10-27 03:32:59 +00002955
2956 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002957 return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00002958 ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002959 pointee_or_element_clang_type);
2960
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002961 case clang::Type::TypeOfExpr: return 0;
2962 case clang::Type::TypeOf: return 0;
2963 case clang::Type::UnresolvedUsing: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002964 case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector;
2965 default: return 0;
2966 }
2967 return 0;
2968}
2969
Greg Clayton9e409562010-07-28 02:04:09 +00002970
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002971#pragma mark Aggregate Types
2972
2973bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002974ClangASTContext::IsAggregateType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002975{
2976 if (clang_type == NULL)
2977 return false;
2978
2979 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2980
Greg Clayton737b9322010-09-13 03:32:57 +00002981 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2982 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002983 {
Greg Claytone1a916a2010-07-21 22:12:05 +00002984 case clang::Type::IncompleteArray:
2985 case clang::Type::VariableArray:
2986 case clang::Type::ConstantArray:
2987 case clang::Type::ExtVector:
2988 case clang::Type::Vector:
2989 case clang::Type::Record:
Greg Clayton9e409562010-07-28 02:04:09 +00002990 case clang::Type::ObjCObject:
2991 case clang::Type::ObjCInterface:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002992 return true;
Sean Callanan912855f2011-08-11 23:56:13 +00002993 case clang::Type::Elaborated:
2994 return ClangASTContext::IsAggregateType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Claytone1a916a2010-07-21 22:12:05 +00002995 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002996 return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002997
2998 default:
2999 break;
3000 }
3001 // The clang type does have a value
3002 return false;
3003}
3004
3005uint32_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00003006ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003007{
Greg Clayton6beaaa62011-01-17 03:46:26 +00003008 if (clang_type == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003009 return 0;
3010
3011 uint32_t num_children = 0;
Greg Clayton6beaaa62011-01-17 03:46:26 +00003012 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00003013 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3014 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003015 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003016 case clang::Type::Builtin:
3017 switch (cast<clang::BuiltinType>(qual_type)->getKind())
3018 {
Greg Clayton73b472d2010-10-27 03:32:59 +00003019 case clang::BuiltinType::ObjCId: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003020 case clang::BuiltinType::ObjCClass: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003021 num_children = 1;
Greg Clayton73b472d2010-10-27 03:32:59 +00003022 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003023
3024 default:
3025 break;
3026 }
3027 break;
Greg Clayton54979cd2010-12-15 05:08:08 +00003028
Greg Clayton49462ea2011-01-15 02:52:14 +00003029 case clang::Type::Complex: return 0;
Greg Clayton54979cd2010-12-15 05:08:08 +00003030
Greg Claytone1a916a2010-07-21 22:12:05 +00003031 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00003032 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003033 {
3034 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3035 const RecordDecl *record_decl = record_type->getDecl();
3036 assert(record_decl);
3037 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3038 if (cxx_record_decl)
3039 {
3040 if (omit_empty_base_classes)
3041 {
3042 // Check each base classes to see if it or any of its
3043 // base classes contain any fields. This can help
3044 // limit the noise in variable views by not having to
3045 // show base classes that contain no members.
3046 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3047 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3048 base_class != base_class_end;
3049 ++base_class)
3050 {
3051 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3052
3053 // Skip empty base classes
3054 if (RecordHasFields(base_class_decl) == false)
3055 continue;
3056
3057 num_children++;
3058 }
3059 }
3060 else
3061 {
3062 // Include all base classes
3063 num_children += cxx_record_decl->getNumBases();
3064 }
3065
3066 }
3067 RecordDecl::field_iterator field, field_end;
3068 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
3069 ++num_children;
3070 }
3071 break;
3072
Greg Clayton9e409562010-07-28 02:04:09 +00003073 case clang::Type::ObjCObject:
3074 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00003075 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00003076 {
Sean Callanan78e37602011-01-27 04:42:51 +00003077 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003078 assert (objc_class_type);
3079 if (objc_class_type)
3080 {
3081 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3082
3083 if (class_interface_decl)
3084 {
3085
3086 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3087 if (superclass_interface_decl)
3088 {
3089 if (omit_empty_base_classes)
3090 {
3091 if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
3092 ++num_children;
3093 }
3094 else
3095 ++num_children;
3096 }
3097
3098 num_children += class_interface_decl->ivar_size();
3099 }
3100 }
3101 }
3102 break;
3103
3104 case clang::Type::ObjCObjectPointer:
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003105 {
Sean Callanan78e37602011-01-27 04:42:51 +00003106 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003107 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00003108 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
3109 pointee_type.getAsOpaquePtr(),
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003110 omit_empty_base_classes);
3111 // If this type points to a simple type, then it has 1 child
3112 if (num_pointee_children == 0)
3113 num_children = 1;
3114 else
3115 num_children = num_pointee_children;
3116 }
3117 break;
Greg Clayton9e409562010-07-28 02:04:09 +00003118
Greg Claytone1a916a2010-07-21 22:12:05 +00003119 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003120 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
3121 break;
3122
Greg Claytone1a916a2010-07-21 22:12:05 +00003123 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003124 {
Sean Callanan78e37602011-01-27 04:42:51 +00003125 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Greg Clayton54979cd2010-12-15 05:08:08 +00003126 QualType pointee_type (pointer_type->getPointeeType());
Greg Clayton6beaaa62011-01-17 03:46:26 +00003127 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
3128 pointee_type.getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00003129 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003130 if (num_pointee_children == 0)
Greg Clayton54979cd2010-12-15 05:08:08 +00003131 {
3132 // We have a pointer to a pointee type that claims it has no children.
3133 // We will want to look at
3134 num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
3135 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003136 else
3137 num_children = num_pointee_children;
3138 }
3139 break;
3140
Greg Clayton73b472d2010-10-27 03:32:59 +00003141 case clang::Type::LValueReference:
3142 case clang::Type::RValueReference:
3143 {
Sean Callanan78e37602011-01-27 04:42:51 +00003144 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00003145 QualType pointee_type = reference_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00003146 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
3147 pointee_type.getAsOpaquePtr(),
Greg Clayton73b472d2010-10-27 03:32:59 +00003148 omit_empty_base_classes);
3149 // If this type points to a simple type, then it has 1 child
3150 if (num_pointee_children == 0)
3151 num_children = 1;
3152 else
3153 num_children = num_pointee_children;
3154 }
3155 break;
3156
3157
Greg Claytone1a916a2010-07-21 22:12:05 +00003158 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00003159 num_children = ClangASTContext::GetNumChildren (ast,
3160 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3161 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003162 break;
Sean Callanan912855f2011-08-11 23:56:13 +00003163
3164 case clang::Type::Elaborated:
3165 num_children = ClangASTContext::GetNumChildren (ast,
3166 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3167 omit_empty_base_classes);
3168 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003169
3170 default:
3171 break;
3172 }
3173 return num_children;
3174}
3175
Greg Claytonbf2331c2011-09-09 23:04:00 +00003176uint32_t
3177ClangASTContext::GetNumDirectBaseClasses (clang::ASTContext *ast, clang_type_t clang_type)
3178{
3179 if (clang_type == NULL)
3180 return 0;
3181
3182 uint32_t count = 0;
3183 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3184 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3185 switch (type_class)
3186 {
3187 case clang::Type::Record:
3188 if (GetCompleteQualType (ast, qual_type))
3189 {
3190 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3191 if (cxx_record_decl)
3192 count = cxx_record_decl->getNumBases();
3193 }
3194 break;
3195
3196 case clang::Type::ObjCObject:
3197 case clang::Type::ObjCInterface:
3198 if (GetCompleteQualType (ast, qual_type))
3199 {
3200 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
3201 if (objc_class_type)
3202 {
3203 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3204
3205 if (class_interface_decl && class_interface_decl->getSuperClass())
3206 count = 1;
3207 }
3208 }
3209 break;
3210
3211
3212 case clang::Type::Typedef:
3213 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3214 break;
3215
3216 case clang::Type::Elaborated:
3217 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3218 break;
3219
3220 default:
3221 break;
3222 }
3223 return count;
3224}
3225
3226uint32_t
3227ClangASTContext::GetNumVirtualBaseClasses (clang::ASTContext *ast,
3228 clang_type_t clang_type)
3229{
3230 if (clang_type == NULL)
3231 return 0;
3232
3233 uint32_t count = 0;
3234 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3235 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3236 switch (type_class)
3237 {
3238 case clang::Type::Record:
3239 if (GetCompleteQualType (ast, qual_type))
3240 {
3241 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3242 if (cxx_record_decl)
3243 count = cxx_record_decl->getNumVBases();
3244 }
3245 break;
3246
3247 case clang::Type::Typedef:
3248 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3249 break;
3250
3251 case clang::Type::Elaborated:
3252 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3253 break;
3254
3255 default:
3256 break;
3257 }
3258 return count;
3259}
3260
3261uint32_t
3262ClangASTContext::GetNumFields (clang::ASTContext *ast, clang_type_t clang_type)
3263{
3264 if (clang_type == NULL)
3265 return 0;
3266
3267 uint32_t count = 0;
3268 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3269 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3270 switch (type_class)
3271 {
3272 case clang::Type::Record:
3273 if (GetCompleteQualType (ast, qual_type))
3274 {
3275 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
3276 if (record_type)
3277 {
3278 RecordDecl *record_decl = record_type->getDecl();
3279 if (record_decl)
3280 {
3281 uint32_t field_idx = 0;
3282 RecordDecl::field_iterator field, field_end;
3283 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
3284 ++field_idx;
3285 count = field_idx;
3286 }
3287 }
3288 }
3289 break;
3290
3291 case clang::Type::Typedef:
3292 count = ClangASTContext::GetNumFields (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3293 break;
3294
3295 case clang::Type::Elaborated:
3296 count = ClangASTContext::GetNumFields (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3297 break;
3298
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003299 case clang::Type::ObjCObject:
3300 case clang::Type::ObjCInterface:
3301 if (GetCompleteQualType (ast, qual_type))
3302 {
3303 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3304 if (objc_class_type)
3305 {
3306 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3307
3308 if (class_interface_decl)
3309 count = class_interface_decl->ivar_size();
3310 }
3311 }
3312 break;
3313
Greg Claytonbf2331c2011-09-09 23:04:00 +00003314 default:
3315 break;
3316 }
3317 return count;
3318}
3319
3320clang_type_t
3321ClangASTContext::GetDirectBaseClassAtIndex (clang::ASTContext *ast,
3322 clang_type_t clang_type,
3323 uint32_t idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003324 uint32_t *bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003325{
3326 if (clang_type == NULL)
3327 return 0;
3328
3329 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3330 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3331 switch (type_class)
3332 {
3333 case clang::Type::Record:
3334 if (GetCompleteQualType (ast, qual_type))
3335 {
3336 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3337 if (cxx_record_decl)
3338 {
3339 uint32_t curr_idx = 0;
3340 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3341 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3342 base_class != base_class_end;
3343 ++base_class, ++curr_idx)
3344 {
3345 if (curr_idx == idx)
3346 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003347 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003348 {
3349 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3350 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3351// if (base_class->isVirtual())
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003352// *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003353// else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003354 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003355 }
3356 return base_class->getType().getAsOpaquePtr();
3357 }
3358 }
3359 }
3360 }
3361 break;
3362
3363 case clang::Type::ObjCObject:
3364 case clang::Type::ObjCInterface:
3365 if (idx == 0 && GetCompleteQualType (ast, qual_type))
3366 {
3367 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
3368 if (objc_class_type)
3369 {
3370 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3371
3372 if (class_interface_decl)
3373 {
3374 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3375 if (superclass_interface_decl)
3376 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003377 if (bit_offset_ptr)
3378 *bit_offset_ptr = 0;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003379 return ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr();
3380 }
3381 }
3382 }
3383 }
3384 break;
3385
3386
3387 case clang::Type::Typedef:
3388 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3389 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3390 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003391 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003392
3393 case clang::Type::Elaborated:
3394 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3395 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3396 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003397 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003398
3399 default:
3400 break;
3401 }
3402 return NULL;
3403}
3404
3405clang_type_t
3406ClangASTContext::GetVirtualBaseClassAtIndex (clang::ASTContext *ast,
3407 clang_type_t clang_type,
3408 uint32_t idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003409 uint32_t *bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003410{
3411 if (clang_type == NULL)
3412 return 0;
3413
3414 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3415 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3416 switch (type_class)
3417 {
3418 case clang::Type::Record:
3419 if (GetCompleteQualType (ast, qual_type))
3420 {
3421 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3422 if (cxx_record_decl)
3423 {
3424 uint32_t curr_idx = 0;
3425 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3426 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
3427 base_class != base_class_end;
3428 ++base_class, ++curr_idx)
3429 {
3430 if (curr_idx == idx)
3431 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003432 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003433 {
3434 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3435 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003436 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003437
3438 }
3439 return base_class->getType().getAsOpaquePtr();
3440 }
3441 }
3442 }
3443 }
3444 break;
3445
3446 case clang::Type::Typedef:
3447 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3448 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3449 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003450 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003451
3452 case clang::Type::Elaborated:
3453 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3454 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3455 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003456 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003457
3458 default:
3459 break;
3460 }
3461 return NULL;
3462}
3463
3464clang_type_t
3465ClangASTContext::GetFieldAtIndex (clang::ASTContext *ast,
3466 clang_type_t clang_type,
3467 uint32_t idx,
3468 std::string& name,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003469 uint32_t *bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003470{
3471 if (clang_type == NULL)
3472 return 0;
3473
3474 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3475 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3476 switch (type_class)
3477 {
3478 case clang::Type::Record:
3479 if (GetCompleteQualType (ast, qual_type))
3480 {
3481 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3482 const RecordDecl *record_decl = record_type->getDecl();
3483 uint32_t field_idx = 0;
3484 RecordDecl::field_iterator field, field_end;
3485 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
3486 {
3487 if (idx == field_idx)
3488 {
3489 // Print the member type if requested
3490 // Print the member name and equal sign
3491 name.assign(field->getNameAsString());
3492
3493 // Figure out the type byte size (field_type_info.first) and
3494 // alignment (field_type_info.second) from the AST context.
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003495 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003496 {
3497 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003498 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003499 }
3500
3501 return field->getType().getAsOpaquePtr();
3502 }
3503 }
3504 }
3505 break;
3506
3507 case clang::Type::ObjCObject:
3508 case clang::Type::ObjCInterface:
3509 if (GetCompleteQualType (ast, qual_type))
3510 {
3511 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3512 assert (objc_class_type);
3513 if (objc_class_type)
3514 {
3515 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3516
3517 if (class_interface_decl)
3518 {
3519 if (idx < (class_interface_decl->ivar_size()))
3520 {
3521 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3522 uint32_t ivar_idx = 0;
3523
3524 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
3525 {
3526 if (ivar_idx == idx)
3527 {
3528 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3529
3530 QualType ivar_qual_type(ivar_decl->getType());
3531
3532 name.assign(ivar_decl->getNameAsString());
3533
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003534 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003535 {
3536 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003537 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003538 }
3539
3540 return ivar_qual_type.getAsOpaquePtr();
3541 }
3542 }
3543 }
3544 }
3545 }
3546 }
3547 break;
3548
3549
3550 case clang::Type::Typedef:
3551 return ClangASTContext::GetFieldAtIndex (ast,
3552 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3553 idx,
3554 name,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003555 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003556
3557 case clang::Type::Elaborated:
3558 return ClangASTContext::GetFieldAtIndex (ast,
3559 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3560 idx,
3561 name,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003562 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003563
3564 default:
3565 break;
3566 }
3567 return NULL;
3568}
3569
3570
Greg Clayton54979cd2010-12-15 05:08:08 +00003571// If a pointer to a pointee type (the clang_type arg) says that it has no
3572// children, then we either need to trust it, or override it and return a
3573// different result. For example, an "int *" has one child that is an integer,
3574// but a function pointer doesn't have any children. Likewise if a Record type
3575// claims it has no children, then there really is nothing to show.
3576uint32_t
3577ClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
3578{
3579 if (clang_type == NULL)
3580 return 0;
3581
3582 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3583 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3584 switch (type_class)
3585 {
Greg Clayton97a43712011-01-08 22:26:47 +00003586 case clang::Type::Builtin:
3587 switch (cast<clang::BuiltinType>(qual_type)->getKind())
3588 {
Greg Clayton7260f622011-04-18 08:33:37 +00003589 case clang::BuiltinType::UnknownAny:
Greg Clayton97a43712011-01-08 22:26:47 +00003590 case clang::BuiltinType::Void:
3591 case clang::BuiltinType::NullPtr:
3592 return 0;
3593 case clang::BuiltinType::Bool:
3594 case clang::BuiltinType::Char_U:
3595 case clang::BuiltinType::UChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00003596 case clang::BuiltinType::WChar_U:
Greg Clayton97a43712011-01-08 22:26:47 +00003597 case clang::BuiltinType::Char16:
3598 case clang::BuiltinType::Char32:
3599 case clang::BuiltinType::UShort:
3600 case clang::BuiltinType::UInt:
3601 case clang::BuiltinType::ULong:
3602 case clang::BuiltinType::ULongLong:
3603 case clang::BuiltinType::UInt128:
3604 case clang::BuiltinType::Char_S:
3605 case clang::BuiltinType::SChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00003606 case clang::BuiltinType::WChar_S:
Greg Clayton97a43712011-01-08 22:26:47 +00003607 case clang::BuiltinType::Short:
3608 case clang::BuiltinType::Int:
3609 case clang::BuiltinType::Long:
3610 case clang::BuiltinType::LongLong:
3611 case clang::BuiltinType::Int128:
3612 case clang::BuiltinType::Float:
3613 case clang::BuiltinType::Double:
3614 case clang::BuiltinType::LongDouble:
3615 case clang::BuiltinType::Dependent:
3616 case clang::BuiltinType::Overload:
Greg Clayton97a43712011-01-08 22:26:47 +00003617 case clang::BuiltinType::ObjCId:
3618 case clang::BuiltinType::ObjCClass:
3619 case clang::BuiltinType::ObjCSel:
Sean Callanand12cf8bb2011-05-15 22:34:38 +00003620 case clang::BuiltinType::BoundMember:
Greg Claytonf0705c82011-10-22 03:33:13 +00003621 case clang::BuiltinType::Half:
3622 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytoned3ae702011-11-09 19:04:58 +00003623 case clang::BuiltinType::PseudoObject:
Greg Clayton97a43712011-01-08 22:26:47 +00003624 return 1;
3625 }
3626 break;
3627
Greg Clayton49462ea2011-01-15 02:52:14 +00003628 case clang::Type::Complex: return 1;
Greg Clayton54979cd2010-12-15 05:08:08 +00003629 case clang::Type::Pointer: return 1;
3630 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
3631 case clang::Type::LValueReference: return 1;
3632 case clang::Type::RValueReference: return 1;
3633 case clang::Type::MemberPointer: return 0;
3634 case clang::Type::ConstantArray: return 0;
3635 case clang::Type::IncompleteArray: return 0;
3636 case clang::Type::VariableArray: return 0;
3637 case clang::Type::DependentSizedArray: return 0;
3638 case clang::Type::DependentSizedExtVector: return 0;
3639 case clang::Type::Vector: return 0;
3640 case clang::Type::ExtVector: return 0;
3641 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
3642 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
3643 case clang::Type::UnresolvedUsing: return 0;
3644 case clang::Type::Paren: return 0;
3645 case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00003646 case clang::Type::Elaborated: return ClangASTContext::GetNumPointeeChildren (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton54979cd2010-12-15 05:08:08 +00003647 case clang::Type::TypeOfExpr: return 0;
3648 case clang::Type::TypeOf: return 0;
3649 case clang::Type::Decltype: return 0;
3650 case clang::Type::Record: return 0;
3651 case clang::Type::Enum: return 1;
Greg Clayton54979cd2010-12-15 05:08:08 +00003652 case clang::Type::TemplateTypeParm: return 1;
3653 case clang::Type::SubstTemplateTypeParm: return 1;
3654 case clang::Type::TemplateSpecialization: return 1;
3655 case clang::Type::InjectedClassName: return 0;
3656 case clang::Type::DependentName: return 1;
3657 case clang::Type::DependentTemplateSpecialization: return 1;
3658 case clang::Type::ObjCObject: return 0;
3659 case clang::Type::ObjCInterface: return 0;
3660 case clang::Type::ObjCObjectPointer: return 1;
3661 default:
3662 break;
3663 }
3664 return 0;
3665}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003666
Greg Clayton1be10fc2010-09-29 01:12:09 +00003667clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003668ClangASTContext::GetChildClangTypeAtIndex
3669(
Jim Inghamd555bac2011-06-24 22:03:24 +00003670 ExecutionContext *exe_ctx,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003671 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003672 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003673 uint32_t idx,
3674 bool transparent_pointers,
3675 bool omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003676 bool ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003677 std::string& child_name,
3678 uint32_t &child_byte_size,
3679 int32_t &child_byte_offset,
3680 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003681 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003682 bool &child_is_base_class,
3683 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003684)
3685{
3686 if (parent_clang_type)
3687
Jim Inghamd555bac2011-06-24 22:03:24 +00003688 return GetChildClangTypeAtIndex (exe_ctx,
3689 getASTContext(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003690 parent_name,
3691 parent_clang_type,
3692 idx,
3693 transparent_pointers,
3694 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003695 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003696 child_name,
3697 child_byte_size,
3698 child_byte_offset,
3699 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003700 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003701 child_is_base_class,
3702 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003703 return NULL;
3704}
3705
Greg Clayton1be10fc2010-09-29 01:12:09 +00003706clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003707ClangASTContext::GetChildClangTypeAtIndex
3708(
Jim Inghamd555bac2011-06-24 22:03:24 +00003709 ExecutionContext *exe_ctx,
Greg Clayton6beaaa62011-01-17 03:46:26 +00003710 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003711 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003712 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003713 uint32_t idx,
3714 bool transparent_pointers,
3715 bool omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003716 bool ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003717 std::string& child_name,
3718 uint32_t &child_byte_size,
3719 int32_t &child_byte_offset,
3720 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003721 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003722 bool &child_is_base_class,
3723 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003724)
3725{
3726 if (parent_clang_type == NULL)
3727 return NULL;
3728
Greg Clayton6beaaa62011-01-17 03:46:26 +00003729 if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003730 {
3731 uint32_t bit_offset;
3732 child_bitfield_bit_size = 0;
3733 child_bitfield_bit_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003734 child_is_base_class = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003735 QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00003736 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
3737 switch (parent_type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003738 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003739 case clang::Type::Builtin:
3740 switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
3741 {
3742 case clang::BuiltinType::ObjCId:
3743 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00003744 child_name = "isa";
Greg Clayton6beaaa62011-01-17 03:46:26 +00003745 child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
3746 return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003747
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003748 default:
3749 break;
3750 }
3751 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003752
Greg Claytone1a916a2010-07-21 22:12:05 +00003753 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00003754 if (GetCompleteQualType (ast, parent_qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003755 {
3756 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
3757 const RecordDecl *record_decl = record_type->getDecl();
3758 assert(record_decl);
Greg Clayton6beaaa62011-01-17 03:46:26 +00003759 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003760 uint32_t child_idx = 0;
3761
3762 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3763 if (cxx_record_decl)
3764 {
3765 // We might have base classes to print out first
3766 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3767 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3768 base_class != base_class_end;
3769 ++base_class)
3770 {
3771 const CXXRecordDecl *base_class_decl = NULL;
3772
3773 // Skip empty base classes
3774 if (omit_empty_base_classes)
3775 {
3776 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3777 if (RecordHasFields(base_class_decl) == false)
3778 continue;
3779 }
3780
3781 if (idx == child_idx)
3782 {
3783 if (base_class_decl == NULL)
3784 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3785
3786
3787 if (base_class->isVirtual())
Greg Clayton6ed95942011-01-22 07:12:45 +00003788 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003789 else
Greg Clayton6ed95942011-01-22 07:12:45 +00003790 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003791
3792 // Base classes should be a multiple of 8 bits in size
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003793 child_byte_offset = bit_offset/8;
Greg Claytone3055942011-06-30 02:28:26 +00003794
3795 child_name = ClangASTType::GetTypeNameForQualType(base_class->getType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003796
Greg Clayton6beaaa62011-01-17 03:46:26 +00003797 uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003798
Jim Inghamf46b3382011-04-15 23:42:06 +00003799 // Base classes bit sizes should be a multiple of 8 bits in size
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003800 assert (clang_type_info_bit_size % 8 == 0);
3801 child_byte_size = clang_type_info_bit_size / 8;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003802 child_is_base_class = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003803 return base_class->getType().getAsOpaquePtr();
3804 }
3805 // We don't increment the child index in the for loop since we might
3806 // be skipping empty base classes
3807 ++child_idx;
3808 }
3809 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003810 // Make sure index is in range...
3811 uint32_t field_idx = 0;
3812 RecordDecl::field_iterator field, field_end;
3813 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
3814 {
3815 if (idx == child_idx)
3816 {
3817 // Print the member type if requested
3818 // Print the member name and equal sign
3819 child_name.assign(field->getNameAsString().c_str());
3820
3821 // Figure out the type byte size (field_type_info.first) and
3822 // alignment (field_type_info.second) from the AST context.
Greg Clayton6beaaa62011-01-17 03:46:26 +00003823 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
Greg Claytonc982c762010-07-09 20:39:50 +00003824 assert(field_idx < record_layout.getFieldCount());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003825
3826 child_byte_size = field_type_info.first / 8;
3827
3828 // Figure out the field offset within the current struct/union/class type
3829 bit_offset = record_layout.getFieldOffset (field_idx);
3830 child_byte_offset = bit_offset / 8;
Greg Clayton6beaaa62011-01-17 03:46:26 +00003831 if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003832 child_bitfield_bit_offset = bit_offset % 8;
3833
3834 return field->getType().getAsOpaquePtr();
3835 }
3836 }
3837 }
3838 break;
3839
Greg Clayton9e409562010-07-28 02:04:09 +00003840 case clang::Type::ObjCObject:
3841 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00003842 if (GetCompleteQualType (ast, parent_qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00003843 {
Sean Callanan78e37602011-01-27 04:42:51 +00003844 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003845 assert (objc_class_type);
3846 if (objc_class_type)
3847 {
3848 uint32_t child_idx = 0;
3849 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3850
3851 if (class_interface_decl)
3852 {
3853
Greg Clayton6beaaa62011-01-17 03:46:26 +00003854 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Clayton9e409562010-07-28 02:04:09 +00003855 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3856 if (superclass_interface_decl)
3857 {
3858 if (omit_empty_base_classes)
3859 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003860 if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
Greg Clayton9e409562010-07-28 02:04:09 +00003861 {
3862 if (idx == 0)
3863 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003864 QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
Greg Clayton9e409562010-07-28 02:04:09 +00003865
3866
3867 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
3868
Greg Clayton6beaaa62011-01-17 03:46:26 +00003869 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003870
3871 child_byte_size = ivar_type_info.first / 8;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003872 child_byte_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003873 child_is_base_class = true;
Greg Clayton9e409562010-07-28 02:04:09 +00003874
3875 return ivar_qual_type.getAsOpaquePtr();
3876 }
3877
3878 ++child_idx;
3879 }
3880 }
3881 else
3882 ++child_idx;
3883 }
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003884
3885 const uint32_t superclass_idx = child_idx;
Greg Clayton9e409562010-07-28 02:04:09 +00003886
3887 if (idx < (child_idx + class_interface_decl->ivar_size()))
3888 {
3889 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3890
3891 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
3892 {
3893 if (child_idx == idx)
3894 {
Jim Inghamf80bc3f2011-12-08 02:53:10 +00003895 ObjCIvarDecl* ivar_decl = *ivar_pos;
Greg Clayton9e409562010-07-28 02:04:09 +00003896
3897 QualType ivar_qual_type(ivar_decl->getType());
3898
3899 child_name.assign(ivar_decl->getNameAsString().c_str());
3900
Greg Clayton6beaaa62011-01-17 03:46:26 +00003901 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003902
3903 child_byte_size = ivar_type_info.first / 8;
3904
3905 // Figure out the field offset within the current struct/union/class type
Jim Inghamd555bac2011-06-24 22:03:24 +00003906 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
3907 // that doesn't account for the space taken up by unbacked properties, or from
3908 // the changing size of base classes that are newer than this class.
3909 // So if we have a process around that we can ask about this object, do so.
3910 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
Greg Claytonc14ee322011-09-22 04:58:26 +00003911 Process *process = NULL;
3912 if (exe_ctx)
3913 process = exe_ctx->GetProcessPtr();
3914 if (process)
Jim Inghamd555bac2011-06-24 22:03:24 +00003915 {
Greg Claytonc14ee322011-09-22 04:58:26 +00003916 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
Jim Inghamd555bac2011-06-24 22:03:24 +00003917 if (objc_runtime != NULL)
3918 {
Enrico Granata6f3533f2011-07-29 19:53:35 +00003919 ClangASTType parent_ast_type (ast, parent_qual_type.getAsOpaquePtr());
Jim Inghamd555bac2011-06-24 22:03:24 +00003920 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
3921 }
3922 }
3923
Jim Inghamf80bc3f2011-12-08 02:53:10 +00003924 // Setting this to UINT32_MAX to make sure we don't compute it twice...
3925 bit_offset = UINT32_MAX;
3926
Jim Inghamd555bac2011-06-24 22:03:24 +00003927 if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
3928 {
3929 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
3930 child_byte_offset = bit_offset / 8;
3931 }
Jim Inghamf80bc3f2011-12-08 02:53:10 +00003932
3933 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
3934 // of a bitfield within its containing object. So regardless of where we get the byte
3935 // offset from, we still need to get the bit offset for bitfields from the layout.
3936
3937 if (ClangASTContext::FieldIsBitfield (ast, ivar_decl, child_bitfield_bit_size))
3938 {
3939 if (bit_offset == UINT32_MAX)
3940 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
3941
3942 child_bitfield_bit_offset = bit_offset % 8;
3943 }
Greg Clayton9e409562010-07-28 02:04:09 +00003944 return ivar_qual_type.getAsOpaquePtr();
3945 }
3946 ++child_idx;
3947 }
3948 }
3949 }
3950 }
3951 }
3952 break;
3953
3954 case clang::Type::ObjCObjectPointer:
3955 {
Sean Callanan78e37602011-01-27 04:42:51 +00003956 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003957 QualType pointee_type = pointer_type->getPointeeType();
3958
3959 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3960 {
Greg Claytone221f822011-01-21 01:59:00 +00003961 child_is_deref_of_parent = false;
3962 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00003963 return GetChildClangTypeAtIndex (exe_ctx,
3964 ast,
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003965 parent_name,
3966 pointer_type->getPointeeType().getAsOpaquePtr(),
3967 idx,
3968 transparent_pointers,
3969 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003970 ignore_array_bounds,
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003971 child_name,
3972 child_byte_size,
3973 child_byte_offset,
3974 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003975 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003976 child_is_base_class,
3977 tmp_child_is_deref_of_parent);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003978 }
3979 else
3980 {
Greg Claytone221f822011-01-21 01:59:00 +00003981 child_is_deref_of_parent = true;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003982 if (parent_name)
3983 {
3984 child_name.assign(1, '*');
3985 child_name += parent_name;
3986 }
3987
3988 // We have a pointer to an simple type
Sean Callanan5b26f272012-02-04 08:49:35 +00003989 if (idx == 0 && GetCompleteQualType(ast, pointee_type))
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003990 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003991 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003992 assert(clang_type_info.first % 8 == 0);
3993 child_byte_size = clang_type_info.first / 8;
3994 child_byte_offset = 0;
3995 return pointee_type.getAsOpaquePtr();
3996 }
3997 }
Greg Clayton9e409562010-07-28 02:04:09 +00003998 }
3999 break;
4000
Greg Claytone1a916a2010-07-21 22:12:05 +00004001 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004002 {
4003 const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4004 const uint64_t element_count = array->getSize().getLimitedValue();
4005
Greg Claytondaf515f2011-07-09 20:12:33 +00004006 if (ignore_array_bounds || idx < element_count)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004007 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004008 if (GetCompleteQualType (ast, array->getElementType()))
4009 {
4010 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004011
Greg Clayton6beaaa62011-01-17 03:46:26 +00004012 char element_name[64];
4013 ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004014
Greg Clayton6beaaa62011-01-17 03:46:26 +00004015 child_name.assign(element_name);
4016 assert(field_type_info.first % 8 == 0);
4017 child_byte_size = field_type_info.first / 8;
Greg Claytondaf515f2011-07-09 20:12:33 +00004018 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
Greg Clayton6beaaa62011-01-17 03:46:26 +00004019 return array->getElementType().getAsOpaquePtr();
4020 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004021 }
4022 }
4023 break;
4024
Greg Claytone1a916a2010-07-21 22:12:05 +00004025 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004026 {
Sean Callanan78e37602011-01-27 04:42:51 +00004027 const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004028 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton97a43712011-01-08 22:26:47 +00004029
4030 // Don't dereference "void *" pointers
4031 if (pointee_type->isVoidType())
4032 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004033
4034 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4035 {
Greg Claytone221f822011-01-21 01:59:00 +00004036 child_is_deref_of_parent = false;
4037 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00004038 return GetChildClangTypeAtIndex (exe_ctx,
4039 ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004040 parent_name,
4041 pointer_type->getPointeeType().getAsOpaquePtr(),
4042 idx,
4043 transparent_pointers,
4044 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00004045 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004046 child_name,
4047 child_byte_size,
4048 child_byte_offset,
4049 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00004050 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00004051 child_is_base_class,
4052 tmp_child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004053 }
4054 else
4055 {
Greg Claytone221f822011-01-21 01:59:00 +00004056 child_is_deref_of_parent = true;
4057
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004058 if (parent_name)
4059 {
4060 child_name.assign(1, '*');
4061 child_name += parent_name;
4062 }
4063
4064 // We have a pointer to an simple type
4065 if (idx == 0)
4066 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004067 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004068 assert(clang_type_info.first % 8 == 0);
4069 child_byte_size = clang_type_info.first / 8;
4070 child_byte_offset = 0;
4071 return pointee_type.getAsOpaquePtr();
4072 }
4073 }
4074 }
4075 break;
4076
Greg Clayton73b472d2010-10-27 03:32:59 +00004077 case clang::Type::LValueReference:
4078 case clang::Type::RValueReference:
4079 {
Sean Callanan78e37602011-01-27 04:42:51 +00004080 const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00004081 QualType pointee_type(reference_type->getPointeeType());
4082 clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
4083 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
4084 {
Greg Claytone221f822011-01-21 01:59:00 +00004085 child_is_deref_of_parent = false;
4086 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00004087 return GetChildClangTypeAtIndex (exe_ctx,
4088 ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00004089 parent_name,
4090 pointee_clang_type,
4091 idx,
4092 transparent_pointers,
4093 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00004094 ignore_array_bounds,
Greg Clayton73b472d2010-10-27 03:32:59 +00004095 child_name,
4096 child_byte_size,
4097 child_byte_offset,
4098 child_bitfield_bit_size,
4099 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00004100 child_is_base_class,
4101 tmp_child_is_deref_of_parent);
Greg Clayton73b472d2010-10-27 03:32:59 +00004102 }
4103 else
4104 {
4105 if (parent_name)
4106 {
4107 child_name.assign(1, '&');
4108 child_name += parent_name;
4109 }
4110
4111 // We have a pointer to an simple type
4112 if (idx == 0)
4113 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004114 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Clayton73b472d2010-10-27 03:32:59 +00004115 assert(clang_type_info.first % 8 == 0);
4116 child_byte_size = clang_type_info.first / 8;
4117 child_byte_offset = 0;
4118 return pointee_type.getAsOpaquePtr();
4119 }
4120 }
4121 }
4122 break;
4123
Greg Claytone1a916a2010-07-21 22:12:05 +00004124 case clang::Type::Typedef:
Jim Inghamd555bac2011-06-24 22:03:24 +00004125 return GetChildClangTypeAtIndex (exe_ctx,
4126 ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004127 parent_name,
Sean Callanan48114472010-12-13 01:26:27 +00004128 cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004129 idx,
4130 transparent_pointers,
4131 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00004132 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004133 child_name,
4134 child_byte_size,
4135 child_byte_offset,
4136 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00004137 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00004138 child_is_base_class,
4139 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004140 break;
Sean Callanan912855f2011-08-11 23:56:13 +00004141
4142 case clang::Type::Elaborated:
4143 return GetChildClangTypeAtIndex (exe_ctx,
4144 ast,
4145 parent_name,
4146 cast<ElaboratedType>(parent_qual_type)->getNamedType().getAsOpaquePtr(),
4147 idx,
4148 transparent_pointers,
4149 omit_empty_base_classes,
4150 ignore_array_bounds,
4151 child_name,
4152 child_byte_size,
4153 child_byte_offset,
4154 child_bitfield_bit_size,
4155 child_bitfield_bit_offset,
4156 child_is_base_class,
4157 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004158
4159 default:
4160 break;
4161 }
4162 }
Greg Clayton19503a22010-07-23 15:37:46 +00004163 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004164}
4165
4166static inline bool
4167BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
4168{
Greg Clayton6beaaa62011-01-17 03:46:26 +00004169 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004170}
4171
4172static uint32_t
4173GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
4174{
4175 uint32_t num_bases = 0;
4176 if (cxx_record_decl)
4177 {
4178 if (omit_empty_base_classes)
4179 {
4180 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4181 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4182 base_class != base_class_end;
4183 ++base_class)
4184 {
4185 // Skip empty base classes
4186 if (omit_empty_base_classes)
4187 {
4188 if (BaseSpecifierIsEmpty (base_class))
4189 continue;
4190 }
4191 ++num_bases;
4192 }
4193 }
4194 else
4195 num_bases = cxx_record_decl->getNumBases();
4196 }
4197 return num_bases;
4198}
4199
4200
4201static uint32_t
4202GetIndexForRecordBase
4203(
4204 const RecordDecl *record_decl,
4205 const CXXBaseSpecifier *base_spec,
4206 bool omit_empty_base_classes
4207)
4208{
4209 uint32_t child_idx = 0;
4210
4211 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4212
4213// const char *super_name = record_decl->getNameAsCString();
4214// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
4215// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
4216//
4217 if (cxx_record_decl)
4218 {
4219 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4220 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4221 base_class != base_class_end;
4222 ++base_class)
4223 {
4224 if (omit_empty_base_classes)
4225 {
4226 if (BaseSpecifierIsEmpty (base_class))
4227 continue;
4228 }
4229
4230// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
4231// child_idx,
4232// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
4233//
4234//
4235 if (base_class == base_spec)
4236 return child_idx;
4237 ++child_idx;
4238 }
4239 }
4240
4241 return UINT32_MAX;
4242}
4243
4244
4245static uint32_t
4246GetIndexForRecordChild
4247(
4248 const RecordDecl *record_decl,
4249 NamedDecl *canonical_decl,
4250 bool omit_empty_base_classes
4251)
4252{
4253 uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
4254
4255// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4256//
4257//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
4258// if (cxx_record_decl)
4259// {
4260// CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4261// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4262// base_class != base_class_end;
4263// ++base_class)
4264// {
4265// if (omit_empty_base_classes)
4266// {
4267// if (BaseSpecifierIsEmpty (base_class))
4268// continue;
4269// }
4270//
4271//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
4272//// record_decl->getNameAsCString(),
4273//// canonical_decl->getNameAsCString(),
4274//// child_idx,
4275//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
4276//
4277//
4278// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4279// if (curr_base_class_decl == canonical_decl)
4280// {
4281// return child_idx;
4282// }
4283// ++child_idx;
4284// }
4285// }
4286//
4287// const uint32_t num_bases = child_idx;
4288 RecordDecl::field_iterator field, field_end;
4289 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4290 field != field_end;
4291 ++field, ++child_idx)
4292 {
4293// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
4294// record_decl->getNameAsCString(),
4295// canonical_decl->getNameAsCString(),
4296// child_idx - num_bases,
4297// field->getNameAsCString());
4298
4299 if (field->getCanonicalDecl() == canonical_decl)
4300 return child_idx;
4301 }
4302
4303 return UINT32_MAX;
4304}
4305
4306// Look for a child member (doesn't include base classes, but it does include
4307// their members) in the type hierarchy. Returns an index path into "clang_type"
4308// on how to reach the appropriate member.
4309//
4310// class A
4311// {
4312// public:
4313// int m_a;
4314// int m_b;
4315// };
4316//
4317// class B
4318// {
4319// };
4320//
4321// class C :
4322// public B,
4323// public A
4324// {
4325// };
4326//
4327// If we have a clang type that describes "class C", and we wanted to looked
4328// "m_b" in it:
4329//
4330// With omit_empty_base_classes == false we would get an integer array back with:
4331// { 1, 1 }
4332// The first index 1 is the child index for "class A" within class C
4333// The second index 1 is the child index for "m_b" within class A
4334//
4335// With omit_empty_base_classes == true we would get an integer array back with:
4336// { 0, 1 }
4337// 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)
4338// The second index 1 is the child index for "m_b" within class A
4339
4340size_t
4341ClangASTContext::GetIndexOfChildMemberWithName
4342(
Greg Clayton6beaaa62011-01-17 03:46:26 +00004343 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00004344 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004345 const char *name,
4346 bool omit_empty_base_classes,
4347 std::vector<uint32_t>& child_indexes
4348)
4349{
4350 if (clang_type && name && name[0])
4351 {
4352 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00004353 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4354 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004355 {
Greg Claytone1a916a2010-07-21 22:12:05 +00004356 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00004357 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004358 {
4359 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4360 const RecordDecl *record_decl = record_type->getDecl();
4361
4362 assert(record_decl);
4363 uint32_t child_idx = 0;
4364
4365 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4366
4367 // Try and find a field that matches NAME
4368 RecordDecl::field_iterator field, field_end;
4369 StringRef name_sref(name);
4370 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4371 field != field_end;
4372 ++field, ++child_idx)
4373 {
4374 if (field->getName().equals (name_sref))
4375 {
4376 // We have to add on the number of base classes to this index!
4377 child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
4378 return child_indexes.size();
4379 }
4380 }
4381
4382 if (cxx_record_decl)
4383 {
4384 const RecordDecl *parent_record_decl = cxx_record_decl;
4385
4386 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
4387
4388 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
4389 // Didn't find things easily, lets let clang do its thang...
Sean Callanancc427fa2011-07-30 02:42:06 +00004390 IdentifierInfo & ident_ref = ast->Idents.get(name_sref);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004391 DeclarationName decl_name(&ident_ref);
4392
4393 CXXBasePaths paths;
4394 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
4395 decl_name.getAsOpaquePtr(),
4396 paths))
4397 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004398 CXXBasePaths::const_paths_iterator path, path_end = paths.end();
4399 for (path = paths.begin(); path != path_end; ++path)
4400 {
4401 const size_t num_path_elements = path->size();
4402 for (size_t e=0; e<num_path_elements; ++e)
4403 {
4404 CXXBasePathElement elem = (*path)[e];
4405
4406 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
4407 if (child_idx == UINT32_MAX)
4408 {
4409 child_indexes.clear();
4410 return 0;
4411 }
4412 else
4413 {
4414 child_indexes.push_back (child_idx);
4415 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
4416 }
4417 }
4418 DeclContext::lookup_iterator named_decl_pos;
4419 for (named_decl_pos = path->Decls.first;
4420 named_decl_pos != path->Decls.second && parent_record_decl;
4421 ++named_decl_pos)
4422 {
4423 //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
4424
4425 child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
4426 if (child_idx == UINT32_MAX)
4427 {
4428 child_indexes.clear();
4429 return 0;
4430 }
4431 else
4432 {
4433 child_indexes.push_back (child_idx);
4434 }
4435 }
4436 }
4437 return child_indexes.size();
4438 }
4439 }
4440
4441 }
4442 break;
4443
Greg Clayton9e409562010-07-28 02:04:09 +00004444 case clang::Type::ObjCObject:
4445 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00004446 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00004447 {
4448 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00004449 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00004450 assert (objc_class_type);
4451 if (objc_class_type)
4452 {
4453 uint32_t child_idx = 0;
4454 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4455
4456 if (class_interface_decl)
4457 {
4458 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4459 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4460
Greg Clayton6ba78152010-09-18 02:11:07 +00004461 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
Greg Clayton9e409562010-07-28 02:04:09 +00004462 {
4463 const ObjCIvarDecl* ivar_decl = *ivar_pos;
4464
4465 if (ivar_decl->getName().equals (name_sref))
4466 {
4467 if ((!omit_empty_base_classes && superclass_interface_decl) ||
4468 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
4469 ++child_idx;
4470
4471 child_indexes.push_back (child_idx);
4472 return child_indexes.size();
4473 }
4474 }
4475
4476 if (superclass_interface_decl)
4477 {
4478 // The super class index is always zero for ObjC classes,
4479 // so we push it onto the child indexes in case we find
4480 // an ivar in our superclass...
4481 child_indexes.push_back (0);
4482
Greg Clayton6beaaa62011-01-17 03:46:26 +00004483 if (GetIndexOfChildMemberWithName (ast,
4484 ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00004485 name,
4486 omit_empty_base_classes,
4487 child_indexes))
4488 {
4489 // We did find an ivar in a superclass so just
4490 // return the results!
4491 return child_indexes.size();
4492 }
4493
4494 // We didn't find an ivar matching "name" in our
4495 // superclass, pop the superclass zero index that
4496 // we pushed on above.
4497 child_indexes.pop_back();
4498 }
4499 }
4500 }
4501 }
4502 break;
4503
4504 case clang::Type::ObjCObjectPointer:
4505 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004506 return GetIndexOfChildMemberWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00004507 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
4508 name,
4509 omit_empty_base_classes,
4510 child_indexes);
4511 }
4512 break;
4513
4514
Greg Claytone1a916a2010-07-21 22:12:05 +00004515 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004516 {
4517// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4518// const uint64_t element_count = array->getSize().getLimitedValue();
4519//
4520// if (idx < element_count)
4521// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004522// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004523//
4524// char element_name[32];
4525// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
4526//
4527// child_name.assign(element_name);
4528// assert(field_type_info.first % 8 == 0);
4529// child_byte_size = field_type_info.first / 8;
4530// child_byte_offset = idx * child_byte_size;
4531// return array->getElementType().getAsOpaquePtr();
4532// }
4533 }
4534 break;
4535
Greg Claytone1a916a2010-07-21 22:12:05 +00004536// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004537// {
4538// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
4539// QualType pointee_type = mem_ptr_type->getPointeeType();
4540//
4541// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4542// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004543// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004544// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
4545// name);
4546// }
4547// }
4548// break;
4549//
Greg Claytone1a916a2010-07-21 22:12:05 +00004550 case clang::Type::LValueReference:
4551 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004552 {
Sean Callanan78e37602011-01-27 04:42:51 +00004553 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004554 QualType pointee_type = reference_type->getPointeeType();
4555
4556 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4557 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004558 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004559 reference_type->getPointeeType().getAsOpaquePtr(),
4560 name,
4561 omit_empty_base_classes,
4562 child_indexes);
4563 }
4564 }
4565 break;
4566
Greg Claytone1a916a2010-07-21 22:12:05 +00004567 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004568 {
Sean Callanan78e37602011-01-27 04:42:51 +00004569 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004570 QualType pointee_type = pointer_type->getPointeeType();
4571
4572 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4573 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004574 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004575 pointer_type->getPointeeType().getAsOpaquePtr(),
4576 name,
4577 omit_empty_base_classes,
4578 child_indexes);
4579 }
4580 else
4581 {
4582// if (parent_name)
4583// {
4584// child_name.assign(1, '*');
4585// child_name += parent_name;
4586// }
4587//
4588// // We have a pointer to an simple type
4589// if (idx == 0)
4590// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004591// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004592// assert(clang_type_info.first % 8 == 0);
4593// child_byte_size = clang_type_info.first / 8;
4594// child_byte_offset = 0;
4595// return pointee_type.getAsOpaquePtr();
4596// }
4597 }
4598 }
4599 break;
4600
Greg Claytone1a916a2010-07-21 22:12:05 +00004601 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00004602 return GetIndexOfChildMemberWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00004603 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004604 name,
4605 omit_empty_base_classes,
4606 child_indexes);
4607
4608 default:
4609 break;
4610 }
4611 }
4612 return 0;
4613}
4614
4615
4616// Get the index of the child of "clang_type" whose name matches. This function
4617// doesn't descend into the children, but only looks one level deep and name
4618// matches can include base class names.
4619
4620uint32_t
4621ClangASTContext::GetIndexOfChildWithName
4622(
Greg Clayton6beaaa62011-01-17 03:46:26 +00004623 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00004624 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004625 const char *name,
4626 bool omit_empty_base_classes
4627)
4628{
4629 if (clang_type && name && name[0])
4630 {
4631 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00004632
Greg Clayton737b9322010-09-13 03:32:57 +00004633 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
Greg Clayton9e409562010-07-28 02:04:09 +00004634
Greg Clayton737b9322010-09-13 03:32:57 +00004635 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004636 {
Greg Claytone1a916a2010-07-21 22:12:05 +00004637 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00004638 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004639 {
4640 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4641 const RecordDecl *record_decl = record_type->getDecl();
4642
4643 assert(record_decl);
4644 uint32_t child_idx = 0;
4645
4646 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4647
4648 if (cxx_record_decl)
4649 {
4650 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4651 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4652 base_class != base_class_end;
4653 ++base_class)
4654 {
4655 // Skip empty base classes
4656 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4657 if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
4658 continue;
4659
Greg Claytone3055942011-06-30 02:28:26 +00004660 std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType()));
4661 if (base_class_type_name.compare (name) == 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004662 return child_idx;
4663 ++child_idx;
4664 }
4665 }
4666
4667 // Try and find a field that matches NAME
4668 RecordDecl::field_iterator field, field_end;
4669 StringRef name_sref(name);
4670 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4671 field != field_end;
4672 ++field, ++child_idx)
4673 {
4674 if (field->getName().equals (name_sref))
4675 return child_idx;
4676 }
4677
4678 }
4679 break;
4680
Greg Clayton9e409562010-07-28 02:04:09 +00004681 case clang::Type::ObjCObject:
4682 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00004683 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00004684 {
4685 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00004686 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00004687 assert (objc_class_type);
4688 if (objc_class_type)
4689 {
4690 uint32_t child_idx = 0;
4691 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4692
4693 if (class_interface_decl)
4694 {
4695 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4696 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4697
4698 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
4699 {
4700 const ObjCIvarDecl* ivar_decl = *ivar_pos;
4701
4702 if (ivar_decl->getName().equals (name_sref))
4703 {
4704 if ((!omit_empty_base_classes && superclass_interface_decl) ||
4705 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
4706 ++child_idx;
4707
4708 return child_idx;
4709 }
4710 }
4711
4712 if (superclass_interface_decl)
4713 {
4714 if (superclass_interface_decl->getName().equals (name_sref))
4715 return 0;
4716 }
4717 }
4718 }
4719 }
4720 break;
4721
4722 case clang::Type::ObjCObjectPointer:
4723 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004724 return GetIndexOfChildWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00004725 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
4726 name,
4727 omit_empty_base_classes);
4728 }
4729 break;
4730
Greg Claytone1a916a2010-07-21 22:12:05 +00004731 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004732 {
4733// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4734// const uint64_t element_count = array->getSize().getLimitedValue();
4735//
4736// if (idx < element_count)
4737// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004738// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004739//
4740// char element_name[32];
4741// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
4742//
4743// child_name.assign(element_name);
4744// assert(field_type_info.first % 8 == 0);
4745// child_byte_size = field_type_info.first / 8;
4746// child_byte_offset = idx * child_byte_size;
4747// return array->getElementType().getAsOpaquePtr();
4748// }
4749 }
4750 break;
4751
Greg Claytone1a916a2010-07-21 22:12:05 +00004752// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004753// {
4754// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
4755// QualType pointee_type = mem_ptr_type->getPointeeType();
4756//
4757// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4758// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004759// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004760// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
4761// name);
4762// }
4763// }
4764// break;
4765//
Greg Claytone1a916a2010-07-21 22:12:05 +00004766 case clang::Type::LValueReference:
4767 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004768 {
Sean Callanan78e37602011-01-27 04:42:51 +00004769 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004770 QualType pointee_type = reference_type->getPointeeType();
4771
4772 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4773 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004774 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004775 reference_type->getPointeeType().getAsOpaquePtr(),
4776 name,
4777 omit_empty_base_classes);
4778 }
4779 }
4780 break;
4781
Greg Claytone1a916a2010-07-21 22:12:05 +00004782 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004783 {
Sean Callanan78e37602011-01-27 04:42:51 +00004784 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004785 QualType pointee_type = pointer_type->getPointeeType();
4786
4787 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4788 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004789 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004790 pointer_type->getPointeeType().getAsOpaquePtr(),
4791 name,
4792 omit_empty_base_classes);
4793 }
4794 else
4795 {
4796// if (parent_name)
4797// {
4798// child_name.assign(1, '*');
4799// child_name += parent_name;
4800// }
4801//
4802// // We have a pointer to an simple type
4803// if (idx == 0)
4804// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004805// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004806// assert(clang_type_info.first % 8 == 0);
4807// child_byte_size = clang_type_info.first / 8;
4808// child_byte_offset = 0;
4809// return pointee_type.getAsOpaquePtr();
4810// }
4811 }
4812 }
4813 break;
4814
Greg Claytone1a916a2010-07-21 22:12:05 +00004815 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00004816 return GetIndexOfChildWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00004817 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004818 name,
4819 omit_empty_base_classes);
4820
4821 default:
4822 break;
4823 }
4824 }
4825 return UINT32_MAX;
4826}
4827
4828#pragma mark TagType
4829
4830bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004831ClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004832{
4833 if (tag_clang_type)
4834 {
4835 QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00004836 const clang::Type *clang_type = tag_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004837 if (clang_type)
4838 {
Sean Callanan78e37602011-01-27 04:42:51 +00004839 const TagType *tag_type = dyn_cast<TagType>(clang_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004840 if (tag_type)
4841 {
4842 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
4843 if (tag_decl)
4844 {
4845 tag_decl->setTagKind ((TagDecl::TagKind)kind);
4846 return true;
4847 }
4848 }
4849 }
4850 }
4851 return false;
4852}
4853
4854
4855#pragma mark DeclContext Functions
4856
4857DeclContext *
Greg Clayton1be10fc2010-09-29 01:12:09 +00004858ClangASTContext::GetDeclContextForType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004859{
4860 if (clang_type == NULL)
4861 return NULL;
4862
4863 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00004864 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4865 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004866 {
Sean Callanancc427fa2011-07-30 02:42:06 +00004867 case clang::Type::UnaryTransform: break;
Greg Clayton9e409562010-07-28 02:04:09 +00004868 case clang::Type::FunctionNoProto: break;
4869 case clang::Type::FunctionProto: break;
4870 case clang::Type::IncompleteArray: break;
4871 case clang::Type::VariableArray: break;
4872 case clang::Type::ConstantArray: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004873 case clang::Type::DependentSizedArray: break;
Greg Clayton9e409562010-07-28 02:04:09 +00004874 case clang::Type::ExtVector: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004875 case clang::Type::DependentSizedExtVector: break;
Greg Clayton9e409562010-07-28 02:04:09 +00004876 case clang::Type::Vector: break;
4877 case clang::Type::Builtin: break;
4878 case clang::Type::BlockPointer: break;
4879 case clang::Type::Pointer: break;
4880 case clang::Type::LValueReference: break;
4881 case clang::Type::RValueReference: break;
4882 case clang::Type::MemberPointer: break;
4883 case clang::Type::Complex: break;
4884 case clang::Type::ObjCObject: break;
4885 case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
4886 case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
4887 case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl();
4888 case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl();
Sean Callanan48114472010-12-13 01:26:27 +00004889 case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00004890 case clang::Type::Elaborated: return ClangASTContext::GetDeclContextForType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00004891 case clang::Type::TypeOfExpr: break;
4892 case clang::Type::TypeOf: break;
4893 case clang::Type::Decltype: break;
4894 //case clang::Type::QualifiedName: break;
4895 case clang::Type::TemplateSpecialization: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004896 case clang::Type::DependentTemplateSpecialization: break;
4897 case clang::Type::TemplateTypeParm: break;
4898 case clang::Type::SubstTemplateTypeParm: break;
4899 case clang::Type::SubstTemplateTypeParmPack:break;
4900 case clang::Type::PackExpansion: break;
4901 case clang::Type::UnresolvedUsing: break;
4902 case clang::Type::Paren: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004903 case clang::Type::Attributed: break;
4904 case clang::Type::Auto: break;
4905 case clang::Type::InjectedClassName: break;
4906 case clang::Type::DependentName: break;
Greg Claytonea3e7d52011-10-08 00:49:15 +00004907 case clang::Type::Atomic: break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004908 }
4909 // No DeclContext in this type...
4910 return NULL;
4911}
4912
4913#pragma mark Namespace Declarations
4914
4915NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00004916ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004917{
Greg Clayton030a2042011-10-14 21:34:45 +00004918 NamespaceDecl *namespace_decl = NULL;
Greg Clayton9d3d6882011-10-31 23:51:19 +00004919 ASTContext *ast = getASTContext();
4920 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
4921 if (decl_ctx == NULL)
4922 decl_ctx = translation_unit_decl;
4923
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004924 if (name)
4925 {
Greg Clayton030a2042011-10-14 21:34:45 +00004926 IdentifierInfo &identifier_info = ast->Idents.get(name);
4927 DeclarationName decl_name (&identifier_info);
4928 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
4929 for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos)
4930 {
4931 namespace_decl = dyn_cast<clang::NamespaceDecl>(*pos);
4932 if (namespace_decl)
4933 return namespace_decl;
4934 }
4935
Sean Callanan5b26f272012-02-04 08:49:35 +00004936 namespace_decl = NamespaceDecl::Create(*ast,
4937 decl_ctx,
4938 false,
4939 SourceLocation(),
4940 SourceLocation(),
4941 &identifier_info,
4942 NULL);
Greg Clayton030a2042011-10-14 21:34:45 +00004943
Greg Clayton9d3d6882011-10-31 23:51:19 +00004944 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004945 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00004946 else
4947 {
4948 if (decl_ctx == translation_unit_decl)
4949 {
4950 namespace_decl = translation_unit_decl->getAnonymousNamespace();
4951 if (namespace_decl)
4952 return namespace_decl;
4953
Sean Callanan5b26f272012-02-04 08:49:35 +00004954 namespace_decl = NamespaceDecl::Create(*ast,
4955 decl_ctx,
4956 false,
4957 SourceLocation(),
4958 SourceLocation(),
4959 NULL,
4960 NULL);
Greg Clayton9d3d6882011-10-31 23:51:19 +00004961 translation_unit_decl->setAnonymousNamespace (namespace_decl);
4962 translation_unit_decl->addDecl (namespace_decl);
4963 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
4964 }
4965 else
4966 {
4967 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
4968 if (parent_namespace_decl)
4969 {
4970 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
4971 if (namespace_decl)
4972 return namespace_decl;
Sean Callanan5b26f272012-02-04 08:49:35 +00004973 namespace_decl = NamespaceDecl::Create(*ast,
4974 decl_ctx,
4975 false,
4976 SourceLocation(),
4977 SourceLocation(),
4978 NULL,
4979 NULL);
Greg Clayton9d3d6882011-10-31 23:51:19 +00004980 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
4981 parent_namespace_decl->addDecl (namespace_decl);
4982 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
4983 }
4984 else
4985 {
4986 // BAD!!!
4987 }
4988 }
4989
4990
4991 if (namespace_decl)
4992 {
4993 // If we make it here, we are creating the anonymous namespace decl
4994 // for the first time, so we need to do the using directive magic
4995 // like SEMA does
4996 UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast,
4997 decl_ctx,
4998 SourceLocation(),
4999 SourceLocation(),
5000 NestedNameSpecifierLoc(),
5001 SourceLocation(),
5002 namespace_decl,
5003 decl_ctx);
5004 using_directive_decl->setImplicit();
5005 decl_ctx->addDecl(using_directive_decl);
5006 }
5007 }
5008#ifdef LLDB_CONFIGURATION_DEBUG
5009 VerifyDecl(namespace_decl);
5010#endif
Greg Clayton030a2042011-10-14 21:34:45 +00005011 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005012}
5013
5014
5015#pragma mark Function Types
5016
5017FunctionDecl *
Greg Clayton147e1fa2011-10-14 22:47:18 +00005018ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx, const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005019{
Greg Clayton147e1fa2011-10-14 22:47:18 +00005020 FunctionDecl *func_decl = NULL;
5021 ASTContext *ast = getASTContext();
5022 if (decl_ctx == NULL)
5023 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005024
Greg Clayton147e1fa2011-10-14 22:47:18 +00005025 if (name && name[0])
5026 {
5027 func_decl = FunctionDecl::Create (*ast,
5028 decl_ctx,
5029 SourceLocation(),
5030 SourceLocation(),
5031 DeclarationName (&ast->Idents.get(name)),
5032 QualType::getFromOpaquePtr(function_clang_type),
5033 NULL,
5034 (FunctionDecl::StorageClass)storage,
5035 (FunctionDecl::StorageClass)storage,
5036 is_inline);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005037 }
Greg Clayton147e1fa2011-10-14 22:47:18 +00005038 else
5039 {
5040 func_decl = FunctionDecl::Create (*ast,
5041 decl_ctx,
5042 SourceLocation(),
5043 SourceLocation(),
5044 DeclarationName (),
5045 QualType::getFromOpaquePtr(function_clang_type),
5046 NULL,
5047 (FunctionDecl::StorageClass)storage,
5048 (FunctionDecl::StorageClass)storage,
5049 is_inline);
5050 }
5051 if (func_decl)
5052 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00005053
5054#ifdef LLDB_CONFIGURATION_DEBUG
5055 VerifyDecl(func_decl);
5056#endif
5057
Greg Clayton147e1fa2011-10-14 22:47:18 +00005058 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005059}
5060
Greg Clayton1be10fc2010-09-29 01:12:09 +00005061clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00005062ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00005063 clang_type_t result_type,
5064 clang_type_t *args,
Sean Callananc81256a2010-09-16 20:40:25 +00005065 unsigned num_args,
5066 bool is_variadic,
5067 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005068{
Greg Clayton6beaaa62011-01-17 03:46:26 +00005069 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005070 std::vector<QualType> qual_type_args;
5071 for (unsigned i=0; i<num_args; ++i)
5072 qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
5073
5074 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00005075 FunctionProtoType::ExtProtoInfo proto_info;
5076 proto_info.Variadic = is_variadic;
Sean Callananfb0b7582011-03-15 00:17:19 +00005077 proto_info.ExceptionSpecType = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00005078 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00005079 proto_info.RefQualifier = RQ_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00005080 proto_info.NumExceptions = 0;
5081 proto_info.Exceptions = NULL;
5082
Greg Clayton147e1fa2011-10-14 22:47:18 +00005083 return ast->getFunctionType (QualType::getFromOpaquePtr(result_type),
5084 qual_type_args.empty() ? NULL : &qual_type_args.front(),
5085 qual_type_args.size(),
5086 proto_info).getAsOpaquePtr(); // NoReturn);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005087}
5088
5089ParmVarDecl *
Greg Clayton1be10fc2010-09-29 01:12:09 +00005090ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005091{
Greg Clayton6beaaa62011-01-17 03:46:26 +00005092 ASTContext *ast = getASTContext();
5093 assert (ast != NULL);
5094 return ParmVarDecl::Create(*ast,
5095 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005096 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00005097 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00005098 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callananc81256a2010-09-16 20:40:25 +00005099 QualType::getFromOpaquePtr(param_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005100 NULL,
5101 (VarDecl::StorageClass)storage,
5102 (VarDecl::StorageClass)storage,
5103 0);
5104}
5105
5106void
5107ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
5108{
5109 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00005110 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005111}
5112
5113
5114#pragma mark Array Types
5115
Greg Clayton1be10fc2010-09-29 01:12:09 +00005116clang_type_t
5117ClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005118{
5119 if (element_type)
5120 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00005121 ASTContext *ast = getASTContext();
5122 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005123 llvm::APInt ap_element_count (64, element_count);
Greg Clayton6beaaa62011-01-17 03:46:26 +00005124 return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005125 ap_element_count,
5126 ArrayType::Normal,
5127 0).getAsOpaquePtr(); // ElemQuals
5128 }
5129 return NULL;
5130}
5131
5132
5133#pragma mark TagDecl
5134
5135bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005136ClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005137{
5138 if (clang_type)
5139 {
5140 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00005141 const clang::Type *t = qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005142 if (t)
5143 {
Sean Callanan78e37602011-01-27 04:42:51 +00005144 const TagType *tag_type = dyn_cast<TagType>(t);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005145 if (tag_type)
5146 {
5147 TagDecl *tag_decl = tag_type->getDecl();
5148 if (tag_decl)
5149 {
5150 tag_decl->startDefinition();
5151 return true;
5152 }
5153 }
Sean Callanan5b26f272012-02-04 08:49:35 +00005154
5155 const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(t);
5156 if (object_type)
5157 {
5158 ObjCInterfaceDecl *interface_decl = object_type->getInterface();
5159 if (interface_decl)
5160 {
5161 interface_decl->startDefinition();
5162 return true;
5163 }
5164 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005165 }
5166 }
5167 return false;
5168}
5169
5170bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005171ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005172{
5173 if (clang_type)
5174 {
5175 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton14372242010-09-29 03:44:17 +00005176
5177 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5178
5179 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005180 {
Greg Clayton14372242010-09-29 03:44:17 +00005181 cxx_record_decl->completeDefinition();
5182
5183 return true;
5184 }
5185
Sean Callanan78e37602011-01-27 04:42:51 +00005186 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
Sean Callanana2424172010-10-25 00:29:48 +00005187
5188 if (objc_class_type)
5189 {
Sean Callanan5b26f272012-02-04 08:49:35 +00005190 // ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5191 // class_interface_decl->completeDefinition();
Sean Callanana2424172010-10-25 00:29:48 +00005192 }
5193
Greg Clayton14372242010-09-29 03:44:17 +00005194 const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
5195
5196 if (enum_type)
5197 {
5198 EnumDecl *enum_decl = enum_type->getDecl();
5199
5200 if (enum_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005201 {
Greg Clayton14372242010-09-29 03:44:17 +00005202 /// TODO This really needs to be fixed.
5203
5204 unsigned NumPositiveBits = 1;
5205 unsigned NumNegativeBits = 0;
5206
Greg Clayton6beaaa62011-01-17 03:46:26 +00005207 ASTContext *ast = getASTContext();
Greg Claytone02b8502010-10-12 04:29:14 +00005208
5209 QualType promotion_qual_type;
5210 // If the enum integer type is less than an integer in bit width,
5211 // then we must promote it to an integer size.
Greg Clayton6beaaa62011-01-17 03:46:26 +00005212 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
Greg Claytone02b8502010-10-12 04:29:14 +00005213 {
5214 if (enum_decl->getIntegerType()->isSignedIntegerType())
Greg Clayton6beaaa62011-01-17 03:46:26 +00005215 promotion_qual_type = ast->IntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00005216 else
Greg Clayton6beaaa62011-01-17 03:46:26 +00005217 promotion_qual_type = ast->UnsignedIntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00005218 }
5219 else
5220 promotion_qual_type = enum_decl->getIntegerType();
5221
5222 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Clayton14372242010-09-29 03:44:17 +00005223 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005224 }
5225 }
5226 }
5227 return false;
5228}
5229
5230
5231#pragma mark Enumeration Types
5232
Greg Clayton1be10fc2010-09-29 01:12:09 +00005233clang_type_t
Greg Claytonca512b32011-01-14 04:54:56 +00005234ClangASTContext::CreateEnumerationType
5235(
5236 const char *name,
5237 DeclContext *decl_ctx,
5238 const Declaration &decl,
5239 clang_type_t integer_qual_type
5240)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005241{
5242 // TODO: Do something intelligent with the Declaration object passed in
5243 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00005244 ASTContext *ast = getASTContext();
5245 assert (ast != NULL);
Greg Claytone02b8502010-10-12 04:29:14 +00005246
5247 // TODO: ask about these...
5248// const bool IsScoped = false;
5249// const bool IsFixed = false;
5250
Greg Clayton6beaaa62011-01-17 03:46:26 +00005251 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00005252 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00005253 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00005254 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00005255 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callanan48114472010-12-13 01:26:27 +00005256 NULL,
5257 false, // IsScoped
5258 false, // IsScopedUsingClassTag
5259 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00005260
5261
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005262 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00005263 {
5264 // TODO: check if we should be setting the promotion type too?
5265 enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00005266
5267 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
5268
Greg Clayton6beaaa62011-01-17 03:46:26 +00005269 return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
Greg Clayton83ff3892010-09-12 23:17:56 +00005270 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005271 return NULL;
5272}
5273
Greg Clayton1be10fc2010-09-29 01:12:09 +00005274clang_type_t
5275ClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
5276{
5277 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
5278
Sean Callanan78e37602011-01-27 04:42:51 +00005279 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Greg Clayton1be10fc2010-09-29 01:12:09 +00005280 if (clang_type)
5281 {
5282 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5283 if (enum_type)
5284 {
5285 EnumDecl *enum_decl = enum_type->getDecl();
5286 if (enum_decl)
5287 return enum_decl->getIntegerType().getAsOpaquePtr();
5288 }
5289 }
5290 return NULL;
5291}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005292bool
5293ClangASTContext::AddEnumerationValueToEnumerationType
5294(
Greg Clayton1be10fc2010-09-29 01:12:09 +00005295 clang_type_t enum_clang_type,
5296 clang_type_t enumerator_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005297 const Declaration &decl,
5298 const char *name,
5299 int64_t enum_value,
5300 uint32_t enum_value_bit_size
5301)
5302{
5303 if (enum_clang_type && enumerator_clang_type && name)
5304 {
5305 // TODO: Do something intelligent with the Declaration object passed in
5306 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00005307 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005308 IdentifierTable *identifier_table = getIdentifierTable();
5309
Greg Clayton6beaaa62011-01-17 03:46:26 +00005310 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005311 assert (identifier_table != NULL);
5312 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
5313
Sean Callanan78e37602011-01-27 04:42:51 +00005314 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005315 if (clang_type)
5316 {
5317 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5318
5319 if (enum_type)
5320 {
5321 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
5322 enum_llvm_apsint = enum_value;
5323 EnumConstantDecl *enumerator_decl =
Greg Clayton6beaaa62011-01-17 03:46:26 +00005324 EnumConstantDecl::Create (*ast,
5325 enum_type->getDecl(),
5326 SourceLocation(),
5327 name ? &identifier_table->get(name) : NULL, // Identifier
5328 QualType::getFromOpaquePtr(enumerator_clang_type),
5329 NULL,
5330 enum_llvm_apsint);
5331
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005332 if (enumerator_decl)
5333 {
5334 enum_type->getDecl()->addDecl(enumerator_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00005335
5336#ifdef LLDB_CONFIGURATION_DEBUG
5337 VerifyDecl(enumerator_decl);
5338#endif
5339
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005340 return true;
5341 }
5342 }
5343 }
5344 }
5345 return false;
5346}
5347
5348#pragma mark Pointers & References
5349
Greg Clayton1be10fc2010-09-29 01:12:09 +00005350clang_type_t
5351ClangASTContext::CreatePointerType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005352{
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00005353 return CreatePointerType (getASTContext(), clang_type);
5354}
5355
5356clang_type_t
5357ClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
5358{
5359 if (ast && clang_type)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005360 {
5361 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5362
Greg Clayton737b9322010-09-13 03:32:57 +00005363 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5364 switch (type_class)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005365 {
5366 case clang::Type::ObjCObject:
5367 case clang::Type::ObjCInterface:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00005368 return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005369
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005370 default:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00005371 return ast->getPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005372 }
5373 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005374 return NULL;
5375}
5376
Greg Clayton1be10fc2010-09-29 01:12:09 +00005377clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00005378ClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
5379 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005380{
5381 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00005382 return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005383 return NULL;
5384}
5385
Greg Clayton1be10fc2010-09-29 01:12:09 +00005386clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00005387ClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
5388 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005389{
5390 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00005391 return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005392 return NULL;
5393}
5394
Greg Clayton1be10fc2010-09-29 01:12:09 +00005395clang_type_t
5396ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
Greg Clayton9b81a312010-06-12 01:20:30 +00005397{
5398 if (clang_pointee_type && clang_pointee_type)
5399 return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
5400 QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
5401 return NULL;
5402}
5403
Greg Clayton1a65ae12011-01-25 23:55:37 +00005404uint32_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005405ClangASTContext::GetPointerBitSize ()
5406{
Greg Clayton6beaaa62011-01-17 03:46:26 +00005407 ASTContext *ast = getASTContext();
5408 return ast->getTypeSize(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005409}
5410
5411bool
Greg Claytondea8cb42011-06-29 22:09:02 +00005412ClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
5413{
5414 QualType pointee_qual_type;
5415 if (clang_type)
5416 {
5417 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5418 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5419 bool success = false;
5420 switch (type_class)
5421 {
5422 case clang::Type::Builtin:
5423 if (cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
5424 {
5425 if (dynamic_pointee_type)
5426 *dynamic_pointee_type = clang_type;
5427 return true;
5428 }
5429 break;
5430
5431 case clang::Type::ObjCObjectPointer:
5432 if (dynamic_pointee_type)
5433 *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5434 return true;
5435
5436 case clang::Type::Pointer:
5437 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
5438 success = true;
5439 break;
5440
5441 case clang::Type::LValueReference:
5442 case clang::Type::RValueReference:
5443 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
5444 success = true;
5445 break;
5446
5447 case clang::Type::Typedef:
Greg Claytonaffb03b2011-07-08 18:27:39 +00005448 return ClangASTContext::IsPossibleDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
Sean Callanan912855f2011-08-11 23:56:13 +00005449
5450 case clang::Type::Elaborated:
5451 return ClangASTContext::IsPossibleDynamicType (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), dynamic_pointee_type);
5452
Greg Claytondea8cb42011-06-29 22:09:02 +00005453 default:
5454 break;
5455 }
5456
5457 if (success)
5458 {
5459 // Check to make sure what we are pointing too is a possible dynamic C++ type
5460 // We currently accept any "void *" (in case we have a class that has been
5461 // watered down to an opaque pointer) and virtual C++ classes.
5462 const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
5463 switch (pointee_type_class)
5464 {
5465 case clang::Type::Builtin:
5466 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
5467 {
5468 case clang::BuiltinType::UnknownAny:
5469 case clang::BuiltinType::Void:
5470 if (dynamic_pointee_type)
5471 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5472 return true;
5473
5474 case clang::BuiltinType::NullPtr:
5475 case clang::BuiltinType::Bool:
5476 case clang::BuiltinType::Char_U:
5477 case clang::BuiltinType::UChar:
5478 case clang::BuiltinType::WChar_U:
5479 case clang::BuiltinType::Char16:
5480 case clang::BuiltinType::Char32:
5481 case clang::BuiltinType::UShort:
5482 case clang::BuiltinType::UInt:
5483 case clang::BuiltinType::ULong:
5484 case clang::BuiltinType::ULongLong:
5485 case clang::BuiltinType::UInt128:
5486 case clang::BuiltinType::Char_S:
5487 case clang::BuiltinType::SChar:
5488 case clang::BuiltinType::WChar_S:
5489 case clang::BuiltinType::Short:
5490 case clang::BuiltinType::Int:
5491 case clang::BuiltinType::Long:
5492 case clang::BuiltinType::LongLong:
5493 case clang::BuiltinType::Int128:
5494 case clang::BuiltinType::Float:
5495 case clang::BuiltinType::Double:
5496 case clang::BuiltinType::LongDouble:
5497 case clang::BuiltinType::Dependent:
5498 case clang::BuiltinType::Overload:
5499 case clang::BuiltinType::ObjCId:
5500 case clang::BuiltinType::ObjCClass:
5501 case clang::BuiltinType::ObjCSel:
5502 case clang::BuiltinType::BoundMember:
Greg Claytonf0705c82011-10-22 03:33:13 +00005503 case clang::BuiltinType::Half:
5504 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytoned3ae702011-11-09 19:04:58 +00005505 case clang::BuiltinType::PseudoObject:
Greg Claytondea8cb42011-06-29 22:09:02 +00005506 break;
5507 }
5508 break;
5509
5510 case clang::Type::Record:
5511 {
5512 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
5513 if (cxx_record_decl)
5514 {
5515 if (GetCompleteQualType (ast, pointee_qual_type))
5516 {
5517 success = cxx_record_decl->isDynamicClass();
5518 }
5519 else
5520 {
5521 // We failed to get the complete type, so we have to
5522 // treat this as a void * which we might possibly be
5523 // able to complete
5524 success = true;
5525 }
5526 if (success)
5527 {
5528 if (dynamic_pointee_type)
5529 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5530 return true;
5531 }
5532 }
5533 }
5534 break;
5535
5536 case clang::Type::ObjCObject:
5537 case clang::Type::ObjCInterface:
5538 {
5539 const clang::ObjCObjectType *objc_class_type = pointee_qual_type->getAsObjCQualifiedInterfaceType();
5540 if (objc_class_type)
5541 {
5542 GetCompleteQualType (ast, pointee_qual_type);
5543 if (dynamic_pointee_type)
5544 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5545 return true;
5546 }
5547 }
5548 break;
5549
5550 default:
5551 break;
5552 }
5553 }
5554 }
5555 if (dynamic_pointee_type)
5556 *dynamic_pointee_type = NULL;
5557 return false;
5558}
5559
5560
5561bool
Greg Clayton007d5be2011-05-30 00:49:24 +00005562ClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
5563{
5564 QualType pointee_qual_type;
5565 if (clang_type)
5566 {
5567 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5568 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5569 bool success = false;
5570 switch (type_class)
5571 {
5572 case clang::Type::Pointer:
5573 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
5574 success = true;
5575 break;
5576
5577 case clang::Type::LValueReference:
5578 case clang::Type::RValueReference:
5579 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
5580 success = true;
5581 break;
5582
5583 case clang::Type::Typedef:
5584 return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
5585
Sean Callanan912855f2011-08-11 23:56:13 +00005586 case clang::Type::Elaborated:
5587 return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5588
Greg Clayton007d5be2011-05-30 00:49:24 +00005589 default:
5590 break;
5591 }
5592
5593 if (success)
5594 {
5595 // Check to make sure what we are pointing too is a possible dynamic C++ type
5596 // We currently accept any "void *" (in case we have a class that has been
5597 // watered down to an opaque pointer) and virtual C++ classes.
5598 const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
5599 switch (pointee_type_class)
5600 {
5601 case clang::Type::Builtin:
5602 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
5603 {
5604 case clang::BuiltinType::UnknownAny:
5605 case clang::BuiltinType::Void:
5606 if (dynamic_pointee_type)
5607 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5608 return true;
5609
5610 case clang::BuiltinType::NullPtr:
5611 case clang::BuiltinType::Bool:
5612 case clang::BuiltinType::Char_U:
5613 case clang::BuiltinType::UChar:
5614 case clang::BuiltinType::WChar_U:
5615 case clang::BuiltinType::Char16:
5616 case clang::BuiltinType::Char32:
5617 case clang::BuiltinType::UShort:
5618 case clang::BuiltinType::UInt:
5619 case clang::BuiltinType::ULong:
5620 case clang::BuiltinType::ULongLong:
5621 case clang::BuiltinType::UInt128:
5622 case clang::BuiltinType::Char_S:
5623 case clang::BuiltinType::SChar:
5624 case clang::BuiltinType::WChar_S:
5625 case clang::BuiltinType::Short:
5626 case clang::BuiltinType::Int:
5627 case clang::BuiltinType::Long:
5628 case clang::BuiltinType::LongLong:
5629 case clang::BuiltinType::Int128:
5630 case clang::BuiltinType::Float:
5631 case clang::BuiltinType::Double:
5632 case clang::BuiltinType::LongDouble:
5633 case clang::BuiltinType::Dependent:
5634 case clang::BuiltinType::Overload:
5635 case clang::BuiltinType::ObjCId:
5636 case clang::BuiltinType::ObjCClass:
5637 case clang::BuiltinType::ObjCSel:
5638 case clang::BuiltinType::BoundMember:
Greg Claytonf0705c82011-10-22 03:33:13 +00005639 case clang::BuiltinType::Half:
5640 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytoned3ae702011-11-09 19:04:58 +00005641 case clang::BuiltinType::PseudoObject:
Greg Clayton007d5be2011-05-30 00:49:24 +00005642 break;
5643 }
5644 break;
5645 case clang::Type::Record:
5646 {
5647 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
5648 if (cxx_record_decl)
5649 {
5650 if (GetCompleteQualType (ast, pointee_qual_type))
5651 {
Greg Claytona13ad2ad2011-06-02 01:26:44 +00005652 success = cxx_record_decl->isDynamicClass();
Greg Clayton007d5be2011-05-30 00:49:24 +00005653 }
5654 else
5655 {
5656 // We failed to get the complete type, so we have to
5657 // treat this as a void * which we might possibly be
5658 // able to complete
5659 success = true;
5660 }
5661 if (success)
5662 {
5663 if (dynamic_pointee_type)
5664 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5665 return true;
5666 }
5667 }
5668 }
5669 break;
5670
5671 default:
5672 break;
5673 }
5674 }
5675 }
5676 if (dynamic_pointee_type)
5677 *dynamic_pointee_type = NULL;
5678 return false;
5679}
5680
Sean Callanan98298012011-10-27 19:41:13 +00005681bool
5682ClangASTContext::IsReferenceType (clang_type_t clang_type, clang_type_t *target_type)
5683{
5684 if (clang_type == NULL)
5685 return false;
5686
5687 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5688 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5689
5690 switch (type_class)
5691 {
5692 case clang::Type::LValueReference:
5693 if (target_type)
5694 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5695 return true;
5696 case clang::Type::RValueReference:
5697 if (target_type)
5698 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5699 return true;
5700 case clang::Type::Typedef:
5701 return ClangASTContext::IsReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5702 case clang::Type::Elaborated:
5703 return ClangASTContext::IsReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5704 default:
5705 break;
5706 }
5707
5708 return false;
5709}
Greg Clayton007d5be2011-05-30 00:49:24 +00005710
5711bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005712ClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005713{
5714 if (clang_type == NULL)
5715 return false;
5716
5717 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00005718 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5719 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005720 {
Sean Callanana2424172010-10-25 00:29:48 +00005721 case clang::Type::Builtin:
5722 switch (cast<clang::BuiltinType>(qual_type)->getKind())
5723 {
5724 default:
5725 break;
5726 case clang::BuiltinType::ObjCId:
5727 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00005728 return true;
5729 }
5730 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00005731 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005732 if (target_type)
5733 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5734 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005735 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005736 if (target_type)
5737 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5738 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005739 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005740 if (target_type)
5741 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5742 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005743 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005744 if (target_type)
5745 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5746 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005747 case clang::Type::LValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005748 if (target_type)
5749 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5750 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005751 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005752 if (target_type)
5753 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5754 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005755 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00005756 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00005757 case clang::Type::Elaborated:
5758 return ClangASTContext::IsPointerOrReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005759 default:
5760 break;
5761 }
5762 return false;
5763}
5764
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005765bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005766ClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005767{
5768 if (!clang_type)
5769 return false;
5770
5771 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5772 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
5773
5774 if (builtin_type)
5775 {
5776 if (builtin_type->isInteger())
Jim Inghamef651602011-12-22 19:12:40 +00005777 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005778 is_signed = builtin_type->isSignedInteger();
Jim Inghamef651602011-12-22 19:12:40 +00005779 return true;
5780 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005781 }
5782
5783 return false;
5784}
5785
5786bool
Greg Claytonaffb03b2011-07-08 18:27:39 +00005787ClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t *target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005788{
Greg Claytonaffb03b2011-07-08 18:27:39 +00005789 if (target_type)
5790 *target_type = NULL;
5791
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005792 if (clang_type)
5793 {
5794 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00005795 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5796 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005797 {
Sean Callanana2424172010-10-25 00:29:48 +00005798 case clang::Type::Builtin:
5799 switch (cast<clang::BuiltinType>(qual_type)->getKind())
5800 {
5801 default:
5802 break;
5803 case clang::BuiltinType::ObjCId:
5804 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00005805 return true;
5806 }
5807 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00005808 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005809 if (target_type)
5810 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5811 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005812 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005813 if (target_type)
5814 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5815 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005816 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005817 if (target_type)
5818 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5819 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005820 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005821 if (target_type)
5822 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5823 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005824 case clang::Type::Typedef:
Greg Claytonaffb03b2011-07-08 18:27:39 +00005825 return ClangASTContext::IsPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
Sean Callanan912855f2011-08-11 23:56:13 +00005826 case clang::Type::Elaborated:
5827 return ClangASTContext::IsPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), target_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005828 default:
5829 break;
5830 }
5831 }
5832 return false;
5833}
5834
5835bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005836ClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005837{
5838 if (clang_type)
5839 {
5840 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5841
5842 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
5843 {
5844 clang::BuiltinType::Kind kind = BT->getKind();
5845 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
5846 {
5847 count = 1;
5848 is_complex = false;
5849 return true;
5850 }
5851 }
5852 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
5853 {
5854 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
5855 {
5856 count = 2;
5857 is_complex = true;
5858 return true;
5859 }
5860 }
5861 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
5862 {
5863 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
5864 {
5865 count = VT->getNumElements();
5866 is_complex = false;
5867 return true;
5868 }
5869 }
5870 }
5871 return false;
5872}
5873
Enrico Granata9fc19442011-07-06 02:13:41 +00005874bool
5875ClangASTContext::IsScalarType (lldb::clang_type_t clang_type)
5876{
5877 bool is_signed;
5878 if (ClangASTContext::IsIntegerType(clang_type, is_signed))
5879 return true;
5880
5881 uint32_t count;
5882 bool is_complex;
5883 return ClangASTContext::IsFloatingPointType(clang_type, count, is_complex) && !is_complex;
5884}
5885
5886bool
5887ClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type)
5888{
5889 if (!IsPointerType(clang_type))
5890 return false;
5891
5892 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5893 lldb::clang_type_t pointee_type = qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr();
5894 return IsScalarType(pointee_type);
5895}
5896
5897bool
5898ClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type)
5899{
Sean Callanan0caa21c2012-01-19 23:54:24 +00005900 clang_type = GetAsArrayType(clang_type);
5901
5902 if (clang_type == 0)
Enrico Granata9fc19442011-07-06 02:13:41 +00005903 return false;
5904
5905 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5906 lldb::clang_type_t item_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
5907 return IsScalarType(item_type);
5908}
5909
Greg Clayton8f92f0a2010-10-14 22:52:14 +00005910
5911bool
5912ClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
5913{
5914 if (clang_type)
5915 {
5916 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5917
5918 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5919 if (cxx_record_decl)
5920 {
5921 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
5922 return true;
5923 }
5924 }
5925 class_name.clear();
5926 return false;
5927}
5928
5929
Greg Clayton0fffff52010-09-24 05:15:53 +00005930bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005931ClangASTContext::IsCXXClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00005932{
5933 if (clang_type)
5934 {
5935 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5936 if (qual_type->getAsCXXRecordDecl() != NULL)
5937 return true;
5938 }
5939 return false;
5940}
5941
Greg Clayton20568dd2011-10-13 23:13:20 +00005942bool
5943ClangASTContext::IsBeingDefined (lldb::clang_type_t clang_type)
5944{
5945 if (clang_type)
5946 {
5947 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5948 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type);
5949 if (tag_type)
5950 return tag_type->isBeingDefined();
5951 }
5952 return false;
5953}
5954
Greg Clayton0fffff52010-09-24 05:15:53 +00005955bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005956ClangASTContext::IsObjCClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00005957{
5958 if (clang_type)
5959 {
5960 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5961 if (qual_type->isObjCObjectOrInterfaceType())
5962 return true;
5963 }
5964 return false;
5965}
5966
Sean Callanan72772842012-02-22 23:57:45 +00005967bool
5968ClangASTContext::IsObjCObjectPointerType (lldb::clang_type_t clang_type, clang_type_t *class_type)
5969{
5970 if (clang_type)
5971 {
5972 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5973 if (qual_type->isObjCObjectPointerType())
5974 {
5975 if (class_type)
5976 {
5977 *class_type = NULL;
5978
5979 if (!qual_type->isObjCClassType() &&
5980 !qual_type->isObjCIdType())
5981 {
5982 const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type);
Sean Callanand7dabe22012-03-10 01:59:11 +00005983 if (!obj_pointer_type)
5984 *class_type = NULL;
Sean Callanan1fc91ad2012-03-10 02:00:32 +00005985 else
5986 *class_type = QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr();
Sean Callanan72772842012-02-22 23:57:45 +00005987 }
5988 }
5989 return true;
5990 }
5991 }
5992 return false;
5993}
5994
5995bool
5996ClangASTContext::GetObjCClassName (lldb::clang_type_t clang_type,
5997 std::string &class_name)
5998{
5999 if (!clang_type)
6000 return false;
6001
6002 const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(QualType::getFromOpaquePtr(clang_type));
6003 if (!object_type)
6004 return false;
6005
6006 const ObjCInterfaceDecl *interface = object_type->getInterface();
6007 if (!interface)
6008 return false;
6009
6010 class_name = interface->getNameAsString();
6011 return true;
6012}
Greg Clayton0fffff52010-09-24 05:15:53 +00006013
Greg Clayton73b472d2010-10-27 03:32:59 +00006014bool
6015ClangASTContext::IsCharType (clang_type_t clang_type)
6016{
6017 if (clang_type)
6018 return QualType::getFromOpaquePtr(clang_type)->isCharType();
6019 return false;
6020}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006021
6022bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00006023ClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006024{
Greg Clayton73b472d2010-10-27 03:32:59 +00006025 clang_type_t pointee_or_element_clang_type = NULL;
6026 Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
6027
6028 if (pointee_or_element_clang_type == NULL)
6029 return false;
6030
6031 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006032 {
Greg Clayton73b472d2010-10-27 03:32:59 +00006033 QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
6034
6035 if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006036 {
Greg Clayton73b472d2010-10-27 03:32:59 +00006037 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6038 if (type_flags.Test (eTypeIsArray))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006039 {
Greg Clayton73b472d2010-10-27 03:32:59 +00006040 // We know the size of the array and it could be a C string
6041 // since it is an array of characters
6042 length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
6043 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006044 }
Greg Clayton73b472d2010-10-27 03:32:59 +00006045 else
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006046 {
Greg Clayton73b472d2010-10-27 03:32:59 +00006047 length = 0;
6048 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006049 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006050
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006051 }
6052 }
6053 return false;
6054}
6055
6056bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00006057ClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
Greg Clayton737b9322010-09-13 03:32:57 +00006058{
6059 if (clang_type)
6060 {
6061 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6062
6063 if (qual_type->isFunctionPointerType())
6064 return true;
6065
6066 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6067 switch (type_class)
6068 {
Sean Callananfb0b7582011-03-15 00:17:19 +00006069 default:
6070 break;
Greg Clayton737b9322010-09-13 03:32:57 +00006071 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00006072 return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00006073 case clang::Type::Elaborated:
6074 return ClangASTContext::IsFunctionPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00006075
6076 case clang::Type::LValueReference:
6077 case clang::Type::RValueReference:
6078 {
Sean Callanan78e37602011-01-27 04:42:51 +00006079 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00006080 if (reference_type)
6081 return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
6082 }
6083 break;
6084 }
6085 }
6086 return false;
6087}
6088
Greg Clayton73b472d2010-10-27 03:32:59 +00006089size_t
6090ClangASTContext::GetArraySize (clang_type_t clang_type)
6091{
6092 if (clang_type)
6093 {
Greg Claytonef37d68a2011-07-09 17:12:27 +00006094 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
6095 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6096 switch (type_class)
6097 {
6098 case clang::Type::ConstantArray:
6099 {
6100 const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
6101 if (array)
6102 return array->getSize().getLimitedValue();
6103 }
6104 break;
6105
6106 case clang::Type::Typedef:
6107 return ClangASTContext::GetArraySize(cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00006108
6109 case clang::Type::Elaborated:
6110 return ClangASTContext::GetArraySize(cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Enrico Granataf9fa6ee2011-07-12 00:18:11 +00006111
6112 default:
6113 break;
Greg Claytonef37d68a2011-07-09 17:12:27 +00006114 }
Greg Clayton73b472d2010-10-27 03:32:59 +00006115 }
6116 return 0;
6117}
Greg Clayton737b9322010-09-13 03:32:57 +00006118
Sean Callanan0caa21c2012-01-19 23:54:24 +00006119clang_type_t
6120ClangASTContext::GetAsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006121{
6122 if (!clang_type)
Sean Callanan0caa21c2012-01-19 23:54:24 +00006123 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006124
6125 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6126
Greg Clayton737b9322010-09-13 03:32:57 +00006127 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6128 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006129 {
Sean Callananfb0b7582011-03-15 00:17:19 +00006130 default:
6131 break;
Greg Claytonef37d68a2011-07-09 17:12:27 +00006132
Greg Claytone1a916a2010-07-21 22:12:05 +00006133 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006134 if (member_type)
6135 *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6136 if (size)
Greg Claytonac4827f2011-04-01 18:14:08 +00006137 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
Sean Callanan0caa21c2012-01-19 23:54:24 +00006138 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00006139
Greg Claytone1a916a2010-07-21 22:12:05 +00006140 case clang::Type::IncompleteArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006141 if (member_type)
6142 *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6143 if (size)
6144 *size = 0;
Sean Callanan0caa21c2012-01-19 23:54:24 +00006145 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00006146
Greg Claytone1a916a2010-07-21 22:12:05 +00006147 case clang::Type::VariableArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006148 if (member_type)
6149 *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6150 if (size)
6151 *size = 0;
Sean Callanan0caa21c2012-01-19 23:54:24 +00006152 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00006153
Greg Claytone1a916a2010-07-21 22:12:05 +00006154 case clang::Type::DependentSizedArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006155 if (member_type)
6156 *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
6157 if (size)
6158 *size = 0;
Sean Callanan0caa21c2012-01-19 23:54:24 +00006159 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00006160
6161 case clang::Type::Typedef:
Sean Callanan0caa21c2012-01-19 23:54:24 +00006162 return ClangASTContext::GetAsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
6163 member_type,
6164 size);
Sean Callanan912855f2011-08-11 23:56:13 +00006165
6166 case clang::Type::Elaborated:
Sean Callanan0caa21c2012-01-19 23:54:24 +00006167 return ClangASTContext::GetAsArrayType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
6168 member_type,
6169 size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006170 }
Sean Callanan0caa21c2012-01-19 23:54:24 +00006171 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006172}
6173
6174
6175#pragma mark Typedefs
6176
Greg Clayton1be10fc2010-09-29 01:12:09 +00006177clang_type_t
6178ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006179{
6180 if (clang_type)
6181 {
6182 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00006183 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006184 IdentifierTable *identifier_table = getIdentifierTable();
Greg Clayton6beaaa62011-01-17 03:46:26 +00006185 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006186 assert (identifier_table != NULL);
6187 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00006188 decl_ctx = ast->getTranslationUnitDecl();
6189 TypedefDecl *decl = TypedefDecl::Create (*ast,
6190 decl_ctx,
6191 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00006192 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00006193 name ? &identifier_table->get(name) : NULL, // Identifier
6194 ast->CreateTypeSourceInfo(qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00006195
Greg Clayton147e1fa2011-10-14 22:47:18 +00006196 //decl_ctx->addDecl (decl);
6197
Sean Callanan2652ad22011-01-18 01:03:44 +00006198 decl->setAccess(AS_public); // TODO respect proper access specifier
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006199
6200 // Get a uniqued QualType for the typedef decl type
Greg Clayton6beaaa62011-01-17 03:46:26 +00006201 return ast->getTypedefType (decl).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006202 }
6203 return NULL;
6204}
6205
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006206// Disable this for now since I can't seem to get a nicely formatted float
6207// out of the APFloat class without just getting the float, double or quad
6208// and then using a formatted print on it which defeats the purpose. We ideally
6209// would like to get perfect string values for any kind of float semantics
6210// so we can support remote targets. The code below also requires a patch to
6211// llvm::APInt.
6212//bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00006213//ClangASTContext::ConvertFloatValueToString (ASTContext *ast, clang_type_t clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006214//{
6215// uint32_t count = 0;
6216// bool is_complex = false;
6217// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
6218// {
6219// unsigned num_bytes_per_float = byte_size / count;
6220// unsigned num_bits_per_float = num_bytes_per_float * 8;
6221//
6222// float_str.clear();
6223// uint32_t i;
6224// for (i=0; i<count; i++)
6225// {
6226// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
6227// bool is_ieee = false;
6228// APFloat ap_float(ap_int, is_ieee);
6229// char s[1024];
6230// unsigned int hex_digits = 0;
6231// bool upper_case = false;
6232//
6233// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
6234// {
6235// if (i > 0)
6236// float_str.append(", ");
6237// float_str.append(s);
6238// if (i == 1 && is_complex)
6239// float_str.append(1, 'i');
6240// }
6241// }
6242// return !float_str.empty();
6243// }
6244// return false;
6245//}
6246
6247size_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00006248ClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006249{
6250 if (clang_type)
6251 {
6252 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6253 uint32_t count = 0;
6254 bool is_complex = false;
6255 if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
6256 {
6257 // TODO: handle complex and vector types
6258 if (count != 1)
6259 return false;
6260
6261 StringRef s_sref(s);
Greg Clayton6beaaa62011-01-17 03:46:26 +00006262 APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006263
Greg Clayton6beaaa62011-01-17 03:46:26 +00006264 const uint64_t bit_size = ast->getTypeSize (qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006265 const uint64_t byte_size = bit_size / 8;
6266 if (dst_size >= byte_size)
6267 {
6268 if (bit_size == sizeof(float)*8)
6269 {
6270 float float32 = ap_float.convertToFloat();
6271 ::memcpy (dst, &float32, byte_size);
6272 return byte_size;
6273 }
6274 else if (bit_size >= 64)
6275 {
6276 llvm::APInt ap_int(ap_float.bitcastToAPInt());
6277 ::memcpy (dst, ap_int.getRawData(), byte_size);
6278 return byte_size;
6279 }
6280 }
6281 }
6282 }
6283 return 0;
6284}
Sean Callanan6fe64b52010-09-17 02:24:29 +00006285
6286unsigned
Greg Clayton1be10fc2010-09-29 01:12:09 +00006287ClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
Sean Callanan6fe64b52010-09-17 02:24:29 +00006288{
6289 assert (clang_type);
6290
6291 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
6292
6293 return qual_type.getQualifiers().getCVRQualifiers();
6294}
Greg Clayton6beaaa62011-01-17 03:46:26 +00006295
Sean Callanan3b107b12011-12-03 03:15:28 +00006296uint64_t
6297GetTypeFlags(clang::ASTContext *ast, lldb::clang_type_t clang_type)
6298{
6299 assert (clang_type);
6300
6301 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
6302
6303 if (!external_ast_source)
6304 return 0;
6305
6306 ClangExternalASTSourceCommon *common_ast_source = static_cast<ClangExternalASTSourceCommon*>(external_ast_source);
6307
6308 return common_ast_source->GetMetadata((uintptr_t)clang_type);
6309}
6310
6311void
6312SetTypeFlags(clang::ASTContext *ast, lldb::clang_type_t clang_type, uint64_t flags)
6313{
6314 assert (clang_type);
6315
6316 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
6317
6318 if (!external_ast_source)
6319 return;
6320
6321 ClangExternalASTSourceCommon *common_ast_source = static_cast<ClangExternalASTSourceCommon*>(external_ast_source);
6322
6323 return common_ast_source->SetMetadata((uintptr_t)clang_type, flags);
6324}
6325
Greg Clayton6beaaa62011-01-17 03:46:26 +00006326bool
6327ClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
6328{
6329 if (clang_type == NULL)
6330 return false;
6331
Greg Claytonc432c192011-01-20 04:18:48 +00006332 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00006333}
6334
6335
6336bool
6337ClangASTContext::GetCompleteType (clang_type_t clang_type)
6338{
6339 return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
6340}
6341
Greg Claytona2721472011-06-25 00:44:06 +00006342bool
6343ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
6344 clang::Decl *decl)
6345{
6346 if (!decl)
6347 return false;
6348
6349 ExternalASTSource *ast_source = ast->getExternalSource();
6350
6351 if (!ast_source)
6352 return false;
6353
6354 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
6355 {
6356 if (tag_decl->getDefinition())
6357 return true;
6358
6359 if (!tag_decl->hasExternalLexicalStorage())
6360 return false;
6361
6362 ast_source->CompleteType(tag_decl);
6363
6364 return !tag_decl->getTypeForDecl()->isIncompleteType();
6365 }
6366 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
6367 {
Sean Callanan5b26f272012-02-04 08:49:35 +00006368 if (objc_interface_decl->getDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00006369 return true;
6370
6371 if (!objc_interface_decl->hasExternalLexicalStorage())
6372 return false;
6373
6374 ast_source->CompleteType(objc_interface_decl);
6375
Sean Callanan5b26f272012-02-04 08:49:35 +00006376 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytona2721472011-06-25 00:44:06 +00006377 }
6378 else
6379 {
6380 return false;
6381 }
6382}
6383
Greg Clayton2c5f0e92011-08-04 21:02:57 +00006384clang::DeclContext *
6385ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
6386{
Sean Callanana87bee82011-08-19 06:19:25 +00006387 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00006388}
6389
6390clang::DeclContext *
6391ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
6392{
Sean Callanana87bee82011-08-19 06:19:25 +00006393 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00006394}
6395