blob: d07df717992c619827b7c6421292d17ed3816f9b [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- ClangASTContext.cpp -------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Eli Friedman932197d2010-06-13 19:06:42 +000010#include "lldb/Symbol/ClangASTContext.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000011
12// C Includes
13// C++ Includes
14#include <string>
15
16// Other libraries and framework includes
Greg Clayton6beaaa62011-01-17 03:46:26 +000017
18// Clang headers like to use NDEBUG inside of them to enable/disable debug
19// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
20// or another. This is bad because it means that if clang was built in release
21// mode, it assumes that you are building in release mode which is not always
22// the case. You can end up with functions that are defined as empty in header
23// files when NDEBUG is not defined, and this can cause link errors with the
24// clang .a files that you have since you might be missing functions in the .a
25// file. So we have to define NDEBUG when including clang headers to avoid any
26// mismatches. This is covered by rdar://problem/8691220
27
Sean Callanan3b1d4f62011-10-26 17:46:51 +000028#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
Greg Clayton6beaaa62011-01-17 03:46:26 +000029#define LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000030#define NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000031// Need to include assert.h so it is as clang would expect it to be (disabled)
32#include <assert.h>
33#endif
34
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035#include "clang/AST/ASTContext.h"
36#include "clang/AST/ASTImporter.h"
37#include "clang/AST/CXXInheritance.h"
Greg Clayton8cf05932010-07-22 18:30:50 +000038#include "clang/AST/DeclObjC.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000039#include "clang/AST/DeclTemplate.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000040#include "clang/AST/RecordLayout.h"
41#include "clang/AST/Type.h"
42#include "clang/Basic/Builtins.h"
43#include "clang/Basic/FileManager.h"
Sean Callanan79439e82010-11-18 02:56:27 +000044#include "clang/Basic/FileSystemOptions.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045#include "clang/Basic/SourceManager.h"
46#include "clang/Basic/TargetInfo.h"
47#include "clang/Basic/TargetOptions.h"
48#include "clang/Frontend/FrontendOptions.h"
49#include "clang/Frontend/LangStandard.h"
Greg Clayton6beaaa62011-01-17 03:46:26 +000050
51#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000052#undef NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000053#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
54// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
55#include <assert.h>
56#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057
Greg Clayton514487e2011-02-15 21:59:32 +000058#include "lldb/Core/ArchSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059#include "lldb/Core/dwarf.h"
Greg Clayton73b472d2010-10-27 03:32:59 +000060#include "lldb/Core/Flags.h"
Sean Callananfb8b7092010-10-28 18:19:36 +000061#include "lldb/Core/Log.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000062#include "lldb/Core/RegularExpression.h"
63#include "lldb/Expression/ASTDumper.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000064#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Sean Callanan5e9e1992011-10-26 01:06:27 +000065#include "lldb/Symbol/VerifyDecl.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000066#include "lldb/Target/ExecutionContext.h"
67#include "lldb/Target/Process.h"
68#include "lldb/Target/ObjCLanguageRuntime.h"
69
Chris Lattner30fdc8d2010-06-08 16:52:24 +000070
Eli Friedman932197d2010-06-13 19:06:42 +000071#include <stdio.h>
72
Greg Claytonc86103d2010-08-05 01:57:25 +000073using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000074using namespace lldb_private;
75using namespace llvm;
76using namespace clang;
77
Greg Clayton6beaaa62011-01-17 03:46:26 +000078
79static bool
80GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type)
81{
82 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
83 switch (type_class)
84 {
85 case clang::Type::Record:
86 case clang::Type::Enum:
87 {
Sean Callanan78e37602011-01-27 04:42:51 +000088 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +000089 if (tag_type)
90 {
91 clang::TagDecl *tag_decl = tag_type->getDecl();
92 if (tag_decl)
93 {
94 if (tag_decl->getDefinition())
95 return true;
96
97 if (tag_decl->hasExternalLexicalStorage())
98 {
Greg Clayton007d5be2011-05-30 00:49:24 +000099 if (ast)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000100 {
Greg Clayton007d5be2011-05-30 00:49:24 +0000101 ExternalASTSource *external_ast_source = ast->getExternalSource();
102 if (external_ast_source)
103 {
104 external_ast_source->CompleteType(tag_decl);
105 return !tag_type->isIncompleteType();
106 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000107 }
108 }
109 return false;
110 }
111 }
112
113 }
114 break;
115
116 case clang::Type::ObjCObject:
117 case clang::Type::ObjCInterface:
118 {
Sean Callanan78e37602011-01-27 04:42:51 +0000119 const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000120 if (objc_class_type)
121 {
122 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
123 // We currently can't complete objective C types through the newly added ASTContext
124 // because it only supports TagDecl objects right now...
Enrico Granata9dd75c82011-07-15 23:30:15 +0000125 if (class_interface_decl)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000126 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000127 bool is_forward_decl = class_interface_decl->isForwardDecl();
128 if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage())
Greg Clayton6beaaa62011-01-17 03:46:26 +0000129 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000130 if (ast)
Greg Clayton007d5be2011-05-30 00:49:24 +0000131 {
Enrico Granata0a3958e2011-07-02 00:25:22 +0000132 ExternalASTSource *external_ast_source = ast->getExternalSource();
133 if (external_ast_source)
134 {
135 external_ast_source->CompleteType (class_interface_decl);
136 is_forward_decl = class_interface_decl->isForwardDecl();
137 }
Greg Clayton007d5be2011-05-30 00:49:24 +0000138 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000139 return is_forward_decl == false;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000140 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000141 return true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000142 }
Enrico Granata0a3958e2011-07-02 00:25:22 +0000143 else
144 return false;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000145 }
146 }
147 break;
148
149 case clang::Type::Typedef:
150 return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Sean Callanan912855f2011-08-11 23:56:13 +0000151
152 case clang::Type::Elaborated:
153 return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType());
Greg Clayton6beaaa62011-01-17 03:46:26 +0000154
155 default:
156 break;
157 }
158
159 return true;
160}
161
162
Greg Clayton8cf05932010-07-22 18:30:50 +0000163static AccessSpecifier
Greg Claytonc86103d2010-08-05 01:57:25 +0000164ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000165{
166 switch (access)
167 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000168 default: break;
169 case eAccessNone: return AS_none;
170 case eAccessPublic: return AS_public;
171 case eAccessPrivate: return AS_private;
172 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000173 }
174 return AS_none;
175}
176
177static ObjCIvarDecl::AccessControl
Greg Claytonc86103d2010-08-05 01:57:25 +0000178ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000179{
180 switch (access)
181 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000182 default: break;
183 case eAccessNone: return ObjCIvarDecl::None;
184 case eAccessPublic: return ObjCIvarDecl::Public;
185 case eAccessPrivate: return ObjCIvarDecl::Private;
186 case eAccessProtected: return ObjCIvarDecl::Protected;
187 case eAccessPackage: return ObjCIvarDecl::Package;
Greg Clayton8cf05932010-07-22 18:30:50 +0000188 }
189 return ObjCIvarDecl::None;
190}
191
192
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000193static void
194ParseLangArgs
195(
196 LangOptions &Opts,
Greg Clayton94e5d782010-06-13 17:34:29 +0000197 InputKind IK
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000198)
199{
200 // FIXME: Cleanup per-file based stuff.
201
202 // Set some properties which depend soley on the input kind; it would be nice
203 // to move these to the language standard, and have the driver resolve the
204 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000205 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000206 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000207 } else if (IK == IK_ObjC ||
208 IK == IK_ObjCXX ||
209 IK == IK_PreprocessedObjC ||
210 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000211 Opts.ObjC1 = Opts.ObjC2 = 1;
212 }
213
214 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
215
216 if (LangStd == LangStandard::lang_unspecified) {
217 // Based on the base language, pick one.
218 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000219 case IK_None:
220 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000221 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000222 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000223 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000224 LangStd = LangStandard::lang_opencl;
225 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000226 case IK_CUDA:
227 LangStd = LangStandard::lang_cuda;
228 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000229 case IK_Asm:
230 case IK_C:
231 case IK_PreprocessedC:
232 case IK_ObjC:
233 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000234 LangStd = LangStandard::lang_gnu99;
235 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000236 case IK_CXX:
237 case IK_PreprocessedCXX:
238 case IK_ObjCXX:
239 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000240 LangStd = LangStandard::lang_gnucxx98;
241 break;
242 }
243 }
244
245 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
246 Opts.BCPLComment = Std.hasBCPLComments();
247 Opts.C99 = Std.isC99();
248 Opts.CPlusPlus = Std.isCPlusPlus();
249 Opts.CPlusPlus0x = Std.isCPlusPlus0x();
250 Opts.Digraphs = Std.hasDigraphs();
251 Opts.GNUMode = Std.isGNUMode();
252 Opts.GNUInline = !Std.isC99();
253 Opts.HexFloats = Std.hasHexFloats();
254 Opts.ImplicitInt = Std.hasImplicitInt();
255
256 // OpenCL has some additional defaults.
257 if (LangStd == LangStandard::lang_opencl) {
258 Opts.OpenCL = 1;
259 Opts.AltiVec = 1;
260 Opts.CXXOperatorNames = 1;
261 Opts.LaxVectorConversions = 1;
262 }
263
264 // OpenCL and C++ both have bool, true, false keywords.
265 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
266
267// if (Opts.CPlusPlus)
268// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
269//
270// if (Args.hasArg(OPT_fobjc_gc_only))
271// Opts.setGCMode(LangOptions::GCOnly);
272// else if (Args.hasArg(OPT_fobjc_gc))
273// Opts.setGCMode(LangOptions::HybridGC);
274//
275// if (Args.hasArg(OPT_print_ivar_layout))
276// Opts.ObjCGCBitmapPrint = 1;
277//
278// if (Args.hasArg(OPT_faltivec))
279// Opts.AltiVec = 1;
280//
281// if (Args.hasArg(OPT_pthread))
282// Opts.POSIXThreads = 1;
283//
284// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
285// "default");
286// if (Vis == "default")
Sean Callanan31e851c2010-10-29 18:38:40 +0000287 Opts.setVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000288// else if (Vis == "hidden")
289// Opts.setVisibilityMode(LangOptions::Hidden);
290// else if (Vis == "protected")
291// Opts.setVisibilityMode(LangOptions::Protected);
292// else
293// Diags.Report(diag::err_drv_invalid_value)
294// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
295
296// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
297
298 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
299 // is specified, or -std is set to a conforming mode.
300 Opts.Trigraphs = !Opts.GNUMode;
301// if (Args.hasArg(OPT_trigraphs))
302// Opts.Trigraphs = 1;
303//
304// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
305// OPT_fno_dollars_in_identifiers,
306// !Opts.AsmPreprocessor);
307// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
308// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
309// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
310// if (Args.hasArg(OPT_fno_lax_vector_conversions))
311// Opts.LaxVectorConversions = 0;
312// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
313// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
314// Opts.Blocks = Args.hasArg(OPT_fblocks);
315// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
316// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
317// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
318// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
319// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
320// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
321// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
322// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
323// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
324// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
325// Diags);
326// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
327// Opts.ObjCConstantStringClass = getLastArgValue(Args,
328// OPT_fconstant_string_class);
329// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
330// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
331// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
332// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
333// Opts.Static = Args.hasArg(OPT_static_define);
334 Opts.OptimizeSize = 0;
335
336 // FIXME: Eliminate this dependency.
337// unsigned Opt =
338// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
339// Opts.Optimize = Opt != 0;
340 unsigned Opt = 0;
341
342 // This is the __NO_INLINE__ define, which just depends on things like the
343 // optimization level and -fno-inline, not actually whether the backend has
344 // inlining enabled.
345 //
346 // FIXME: This is affected by other options (-fno-inline).
347 Opts.NoInline = !Opt;
348
349// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
350// switch (SSP) {
351// default:
352// Diags.Report(diag::err_drv_invalid_value)
353// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
354// break;
355// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
356// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
357// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
358// }
359}
360
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000361
Greg Clayton6beaaa62011-01-17 03:46:26 +0000362ClangASTContext::ClangASTContext (const char *target_triple) :
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000363 m_target_triple(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000364 m_ast_ap(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000365 m_language_options_ap(),
366 m_source_manager_ap(),
Sean Callanan880e6802011-10-07 23:18:13 +0000367 m_diagnostics_engine_ap(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000368 m_target_options_ap(),
369 m_target_info_ap(),
370 m_identifier_table_ap(),
371 m_selector_table_ap(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000372 m_builtins_ap(),
373 m_callback_tag_decl (NULL),
374 m_callback_objc_decl (NULL),
375 m_callback_baton (NULL)
376
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377{
378 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000379 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000380}
381
382//----------------------------------------------------------------------
383// Destructor
384//----------------------------------------------------------------------
385ClangASTContext::~ClangASTContext()
386{
387 m_builtins_ap.reset();
388 m_selector_table_ap.reset();
389 m_identifier_table_ap.reset();
390 m_target_info_ap.reset();
391 m_target_options_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000392 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000393 m_source_manager_ap.reset();
394 m_language_options_ap.reset();
Greg Clayton6beaaa62011-01-17 03:46:26 +0000395 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000396}
397
398
399void
400ClangASTContext::Clear()
401{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000402 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000403 m_language_options_ap.reset();
404 m_source_manager_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000405 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000406 m_target_options_ap.reset();
407 m_target_info_ap.reset();
408 m_identifier_table_ap.reset();
409 m_selector_table_ap.reset();
410 m_builtins_ap.reset();
411}
412
413const char *
414ClangASTContext::GetTargetTriple ()
415{
416 return m_target_triple.c_str();
417}
418
419void
420ClangASTContext::SetTargetTriple (const char *target_triple)
421{
422 Clear();
423 m_target_triple.assign(target_triple);
424}
425
Greg Clayton514487e2011-02-15 21:59:32 +0000426void
427ClangASTContext::SetArchitecture (const ArchSpec &arch)
428{
Greg Clayton880cbb02011-07-30 01:26:02 +0000429 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000430}
431
Greg Clayton6beaaa62011-01-17 03:46:26 +0000432bool
433ClangASTContext::HasExternalSource ()
434{
435 ASTContext *ast = getASTContext();
436 if (ast)
437 return ast->getExternalSource () != NULL;
438 return false;
439}
440
441void
442ClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
443{
444 ASTContext *ast = getASTContext();
445 if (ast)
446 {
447 ast->setExternalSource (ast_source_ap);
448 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
449 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
450 }
451}
452
453void
454ClangASTContext::RemoveExternalSource ()
455{
456 ASTContext *ast = getASTContext();
457
458 if (ast)
459 {
460 llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
461 ast->setExternalSource (empty_ast_source_ap);
462 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
463 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
464 }
465}
466
467
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000468
469ASTContext *
470ClangASTContext::getASTContext()
471{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000472 if (m_ast_ap.get() == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000473 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000474 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
475 *getSourceManager(),
Sean Callanan880e6802011-10-07 23:18:13 +0000476 getTargetInfo(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000477 *getIdentifierTable(),
478 *getSelectorTable(),
479 *getBuiltinContext(),
480 0));
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000481
Greg Clayton6beaaa62011-01-17 03:46:26 +0000482 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
483 {
484 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
485 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
486 }
487
Sean Callanan880e6802011-10-07 23:18:13 +0000488 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000489 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000490 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000491}
492
493Builtin::Context *
494ClangASTContext::getBuiltinContext()
495{
496 if (m_builtins_ap.get() == NULL)
Sean Callanan880e6802011-10-07 23:18:13 +0000497 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000498 return m_builtins_ap.get();
499}
500
501IdentifierTable *
502ClangASTContext::getIdentifierTable()
503{
504 if (m_identifier_table_ap.get() == NULL)
505 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
506 return m_identifier_table_ap.get();
507}
508
509LangOptions *
510ClangASTContext::getLanguageOptions()
511{
512 if (m_language_options_ap.get() == NULL)
513 {
514 m_language_options_ap.reset(new LangOptions());
Greg Clayton94e5d782010-06-13 17:34:29 +0000515 ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
516// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000517 }
518 return m_language_options_ap.get();
519}
520
521SelectorTable *
522ClangASTContext::getSelectorTable()
523{
524 if (m_selector_table_ap.get() == NULL)
525 m_selector_table_ap.reset (new SelectorTable());
526 return m_selector_table_ap.get();
527}
528
Sean Callanan79439e82010-11-18 02:56:27 +0000529clang::FileManager *
530ClangASTContext::getFileManager()
531{
532 if (m_file_manager_ap.get() == NULL)
Greg Clayton38a61402010-12-02 23:20:03 +0000533 {
534 clang::FileSystemOptions file_system_options;
535 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
536 }
Sean Callanan79439e82010-11-18 02:56:27 +0000537 return m_file_manager_ap.get();
538}
539
Greg Claytone1a916a2010-07-21 22:12:05 +0000540clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000541ClangASTContext::getSourceManager()
542{
543 if (m_source_manager_ap.get() == NULL)
Sean Callanan880e6802011-10-07 23:18:13 +0000544 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000545 return m_source_manager_ap.get();
546}
547
Sean Callanan880e6802011-10-07 23:18:13 +0000548clang::DiagnosticsEngine *
549ClangASTContext::getDiagnosticsEngine()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000550{
Sean Callanan880e6802011-10-07 23:18:13 +0000551 if (m_diagnostics_engine_ap.get() == NULL)
Greg Claytona651b532010-11-19 21:46:54 +0000552 {
553 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callanan880e6802011-10-07 23:18:13 +0000554 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp));
Greg Claytona651b532010-11-19 21:46:54 +0000555 }
Sean Callanan880e6802011-10-07 23:18:13 +0000556 return m_diagnostics_engine_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000557}
558
Sean Callanan880e6802011-10-07 23:18:13 +0000559class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000560{
561public:
Sean Callanan880e6802011-10-07 23:18:13 +0000562 NullDiagnosticConsumer ()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000563 {
564 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
565 }
566
Sean Callanan880e6802011-10-07 23:18:13 +0000567 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000568 {
569 if (m_log)
570 {
571 llvm::SmallVectorImpl<char> diag_str(10);
572 info.FormatDiagnostic(diag_str);
573 diag_str.push_back('\0');
574 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
575 }
576 }
Sean Callanan880e6802011-10-07 23:18:13 +0000577
578 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
579 {
580 return new NullDiagnosticConsumer ();
581 }
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000582private:
583 LogSP m_log;
584};
585
Sean Callanan880e6802011-10-07 23:18:13 +0000586DiagnosticConsumer *
587ClangASTContext::getDiagnosticConsumer()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000588{
Sean Callanan880e6802011-10-07 23:18:13 +0000589 if (m_diagnostic_consumer_ap.get() == NULL)
590 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000591
Sean Callanan880e6802011-10-07 23:18:13 +0000592 return m_diagnostic_consumer_ap.get();
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000593}
594
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000595TargetOptions *
596ClangASTContext::getTargetOptions()
597{
598 if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
599 {
600 m_target_options_ap.reset (new TargetOptions());
601 if (m_target_options_ap.get())
602 m_target_options_ap->Triple = m_target_triple;
603 }
604 return m_target_options_ap.get();
605}
606
607
608TargetInfo *
609ClangASTContext::getTargetInfo()
610{
611 // target_triple should be something like "x86_64-apple-darwin10"
612 if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
Sean Callanan880e6802011-10-07 23:18:13 +0000613 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), *getTargetOptions()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000614 return m_target_info_ap.get();
615}
616
617#pragma mark Basic Types
618
619static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000620QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000621{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000622 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000623 if (qual_type_bit_size == bit_size)
624 return true;
625 return false;
626}
627
Greg Clayton1be10fc2010-09-29 01:12:09 +0000628clang_type_t
Greg Claytonc86103d2010-08-05 01:57:25 +0000629ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000630{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000631 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000632
Greg Clayton6beaaa62011-01-17 03:46:26 +0000633 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000634
Greg Clayton6beaaa62011-01-17 03:46:26 +0000635 return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000636}
637
Greg Clayton1be10fc2010-09-29 01:12:09 +0000638clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000639ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000640{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000641 if (!ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000642 return NULL;
643
644 switch (encoding)
645 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000646 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000647 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
648 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000649 break;
650
Greg Claytonc86103d2010-08-05 01:57:25 +0000651 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000652 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
653 return ast->UnsignedCharTy.getAsOpaquePtr();
654 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
655 return ast->UnsignedShortTy.getAsOpaquePtr();
656 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
657 return ast->UnsignedIntTy.getAsOpaquePtr();
658 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
659 return ast->UnsignedLongTy.getAsOpaquePtr();
660 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
661 return ast->UnsignedLongLongTy.getAsOpaquePtr();
662 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
663 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000664 break;
665
Greg Claytonc86103d2010-08-05 01:57:25 +0000666 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000667 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
668 return ast->CharTy.getAsOpaquePtr();
669 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
670 return ast->ShortTy.getAsOpaquePtr();
671 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
672 return ast->IntTy.getAsOpaquePtr();
673 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
674 return ast->LongTy.getAsOpaquePtr();
675 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
676 return ast->LongLongTy.getAsOpaquePtr();
677 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
678 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000679 break;
680
Greg Claytonc86103d2010-08-05 01:57:25 +0000681 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000682 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
683 return ast->FloatTy.getAsOpaquePtr();
684 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
685 return ast->DoubleTy.getAsOpaquePtr();
686 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
687 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000688 break;
689
Greg Claytonc86103d2010-08-05 01:57:25 +0000690 case eEncodingVector:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000691 default:
692 break;
693 }
694
695 return NULL;
696}
697
Greg Clayton1be10fc2010-09-29 01:12:09 +0000698clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000699ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
700{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000701 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000702
703 #define streq(a,b) strcmp(a,b) == 0
Greg Clayton6beaaa62011-01-17 03:46:26 +0000704 assert (ast != NULL);
705 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000706 {
707 switch (dw_ate)
708 {
709 default:
710 break;
711
712 case DW_ATE_address:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000713 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
714 return ast->VoidPtrTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000715 break;
716
717 case DW_ATE_boolean:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000718 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
719 return ast->BoolTy.getAsOpaquePtr();
720 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
721 return ast->UnsignedCharTy.getAsOpaquePtr();
722 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
723 return ast->UnsignedShortTy.getAsOpaquePtr();
724 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
725 return ast->UnsignedIntTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000726 break;
727
Greg Clayton49462ea2011-01-15 02:52:14 +0000728 case DW_ATE_lo_user:
729 // This has been seen to mean DW_AT_complex_integer
Greg Clayton605684e2011-10-28 23:06:08 +0000730 if (type_name)
Greg Clayton49462ea2011-01-15 02:52:14 +0000731 {
Greg Clayton605684e2011-10-28 23:06:08 +0000732 if (::strstr(type_name, "complex"))
733 {
734 clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
735 return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
736 }
Greg Clayton49462ea2011-01-15 02:52:14 +0000737 }
738 break;
739
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000740 case DW_ATE_complex_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000741 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
742 return ast->FloatComplexTy.getAsOpaquePtr();
743 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
744 return ast->DoubleComplexTy.getAsOpaquePtr();
745 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
746 return ast->LongDoubleComplexTy.getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000747 else
748 {
749 clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000750 return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
Greg Clayton49462ea2011-01-15 02:52:14 +0000751 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000752 break;
753
754 case DW_ATE_float:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000755 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
756 return ast->FloatTy.getAsOpaquePtr();
757 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
758 return ast->DoubleTy.getAsOpaquePtr();
759 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
760 return ast->LongDoubleTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000761 break;
762
763 case DW_ATE_signed:
764 if (type_name)
765 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000766 if (strstr(type_name, "long long"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000767 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000768 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
769 return ast->LongLongTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000770 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000771 else if (strstr(type_name, "long"))
772 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000773 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
774 return ast->LongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000775 }
776 else if (strstr(type_name, "short"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000777 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000778 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
779 return ast->ShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000780 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000781 else if (strstr(type_name, "char"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000782 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000783 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
784 return ast->CharTy.getAsOpaquePtr();
785 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
786 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000787 }
Greg Clayton19de37f2010-11-02 03:48:39 +0000788 else if (strstr(type_name, "int"))
789 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000790 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
791 return ast->IntTy.getAsOpaquePtr();
792 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
793 return ast->Int128Ty.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000794 }
795 else if (streq(type_name, "wchar_t"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000796 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000797 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
798 return ast->WCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000799 }
Greg Clayton7bd65b92011-02-09 23:39:34 +0000800 else if (streq(type_name, "void"))
801 {
802 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
803 return ast->VoidTy.getAsOpaquePtr();
804 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000805 }
806 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000807 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
808 return ast->CharTy.getAsOpaquePtr();
809 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
810 return ast->ShortTy.getAsOpaquePtr();
811 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
812 return ast->IntTy.getAsOpaquePtr();
813 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
814 return ast->LongTy.getAsOpaquePtr();
815 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
816 return ast->LongLongTy.getAsOpaquePtr();
817 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
818 return ast->Int128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000819 break;
820
821 case DW_ATE_signed_char:
822 if (type_name)
823 {
824 if (streq(type_name, "signed char"))
825 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000826 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
827 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000828 }
829 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000830 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
831 return ast->CharTy.getAsOpaquePtr();
832 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
833 return ast->SignedCharTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000834 break;
835
836 case DW_ATE_unsigned:
837 if (type_name)
838 {
Greg Clayton19de37f2010-11-02 03:48:39 +0000839 if (strstr(type_name, "long long"))
840 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000841 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
842 return ast->UnsignedLongLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000843 }
844 else if (strstr(type_name, "long"))
845 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000846 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
847 return ast->UnsignedLongTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000848 }
849 else if (strstr(type_name, "short"))
850 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000851 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
852 return ast->UnsignedShortTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000853 }
854 else if (strstr(type_name, "char"))
855 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000856 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
857 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton19de37f2010-11-02 03:48:39 +0000858 }
859 else if (strstr(type_name, "int"))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000860 {
Greg Clayton6beaaa62011-01-17 03:46:26 +0000861 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
862 return ast->UnsignedIntTy.getAsOpaquePtr();
863 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
864 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000865 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000866 }
867 // We weren't able to match up a type name, just search by size
Greg Clayton6beaaa62011-01-17 03:46:26 +0000868 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
869 return ast->UnsignedCharTy.getAsOpaquePtr();
870 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
871 return ast->UnsignedShortTy.getAsOpaquePtr();
872 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
873 return ast->UnsignedIntTy.getAsOpaquePtr();
874 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
875 return ast->UnsignedLongTy.getAsOpaquePtr();
876 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
877 return ast->UnsignedLongLongTy.getAsOpaquePtr();
878 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
879 return ast->UnsignedInt128Ty.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000880 break;
881
882 case DW_ATE_unsigned_char:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000883 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
884 return ast->UnsignedCharTy.getAsOpaquePtr();
Greg Clayton7bd65b92011-02-09 23:39:34 +0000885 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
886 return ast->UnsignedShortTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000887 break;
888
889 case DW_ATE_imaginary_float:
890 break;
Greg Clayton605684e2011-10-28 23:06:08 +0000891
892 case DW_ATE_UTF:
893 if (type_name)
894 {
895 if (streq(type_name, "char16_t"))
896 {
897 return ast->Char16Ty.getAsOpaquePtr();
898 }
899 else if (streq(type_name, "char32_t"))
900 {
901 return ast->Char32Ty.getAsOpaquePtr();
902 }
903 }
904 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000905 }
906 }
907 // This assert should fire for anything that we don't catch above so we know
908 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +0000909 if (type_name)
910 {
Greg Claytone38a5ed2012-01-05 03:57:59 +0000911 Host::SystemLog (Host::eSystemLogError, "error: need to add support for DW_TAG_base_type '%s' encoded with DW_ATE = 0x%x, bit_size = %u\n", type_name, dw_ate, bit_size);
Greg Claytondc968d12011-05-17 18:15:05 +0000912 }
913 else
914 {
Greg Claytone38a5ed2012-01-05 03:57:59 +0000915 Host::SystemLog (Host::eSystemLogError, "error: need to add support for DW_TAG_base_type encoded with DW_ATE = 0x%x, bit_size = %u\n", dw_ate, bit_size);
Greg Claytondc968d12011-05-17 18:15:05 +0000916 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000917 return NULL;
918}
919
Greg Clayton1be10fc2010-09-29 01:12:09 +0000920clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000921ClangASTContext::GetBuiltInType_void(ASTContext *ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000922{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000923 return ast->VoidTy.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000924}
925
Greg Clayton1be10fc2010-09-29 01:12:09 +0000926clang_type_t
Sean Callananf7c3e272010-11-19 02:52:21 +0000927ClangASTContext::GetBuiltInType_bool()
928{
929 return getASTContext()->BoolTy.getAsOpaquePtr();
930}
931
932clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000933ClangASTContext::GetBuiltInType_objc_id()
934{
Sean Callanand5c17ed2011-11-15 02:11:17 +0000935 return getASTContext()->getObjCIdType().getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000936}
937
Greg Clayton1be10fc2010-09-29 01:12:09 +0000938clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000939ClangASTContext::GetBuiltInType_objc_Class()
940{
Sean Callanand5c17ed2011-11-15 02:11:17 +0000941 return getASTContext()->getObjCClassType().getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000942}
943
Greg Clayton1be10fc2010-09-29 01:12:09 +0000944clang_type_t
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000945ClangASTContext::GetBuiltInType_objc_selector()
946{
Sean Callanand5c17ed2011-11-15 02:11:17 +0000947 return getASTContext()->getObjCSelType().getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +0000948}
949
Greg Clayton1be10fc2010-09-29 01:12:09 +0000950clang_type_t
Sean Callanan77502262011-05-12 23:54:16 +0000951ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
952{
953 return ast->UnknownAnyTy.getAsOpaquePtr();
954}
955
956clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000957ClangASTContext::GetCStringType (bool is_const)
958{
959 QualType char_type(getASTContext()->CharTy);
960
961 if (is_const)
962 char_type.addConst();
963
964 return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
965}
966
Greg Clayton1be10fc2010-09-29 01:12:09 +0000967clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000968ClangASTContext::GetVoidPtrType (bool is_const)
969{
970 return GetVoidPtrType(getASTContext(), is_const);
971}
972
Greg Clayton1be10fc2010-09-29 01:12:09 +0000973clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +0000974ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000975{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000976 QualType void_ptr_type(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000977
978 if (is_const)
979 void_ptr_type.addConst();
980
981 return void_ptr_type.getAsOpaquePtr();
982}
983
Sean Callanan09ab4b72011-11-30 22:11:59 +0000984clang::DeclContext *
985ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
986{
987 return ast->getTranslationUnitDecl();
988}
989
Greg Clayton1be10fc2010-09-29 01:12:09 +0000990clang_type_t
Greg Clayton38a61402010-12-02 23:20:03 +0000991ClangASTContext::CopyType (ASTContext *dst_ast,
992 ASTContext *src_ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +0000993 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000994{
Sean Callanan79439e82010-11-18 02:56:27 +0000995 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +0000996 FileManager file_manager (file_system_options);
997 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +0000998 *src_ast, file_manager,
999 false);
Sean Callanan0617fcb2010-11-09 22:37:10 +00001000
Greg Clayton38a61402010-12-02 23:20:03 +00001001 QualType src (QualType::getFromOpaquePtr(clang_type));
1002 QualType dst (importer.Import(src));
Sean Callanan0617fcb2010-11-09 22:37:10 +00001003
1004 return dst.getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001005}
1006
Greg Clayton526e5af2010-11-13 03:52:47 +00001007
1008clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001009ClangASTContext::CopyDecl (ASTContext *dst_ast,
1010 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001011 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001012{
Sean Callanan79439e82010-11-18 02:56:27 +00001013 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001014 FileManager file_manager (file_system_options);
1015 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001016 *src_ast, file_manager,
1017 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001018
1019 return importer.Import(source_decl);
1020}
1021
Sean Callanan23a30272010-07-16 00:00:27 +00001022bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00001023ClangASTContext::AreTypesSame(ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001024 clang_type_t type1,
1025 clang_type_t type2)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001026{
Greg Claytonf4ecaa52011-02-16 23:00:21 +00001027 return ast->hasSameType (QualType::getFromOpaquePtr(type1),
1028 QualType::getFromOpaquePtr(type2));
Sean Callanan4dcca2622010-07-15 22:30:52 +00001029}
1030
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001031#pragma mark CVR modifiers
1032
Greg Clayton1be10fc2010-09-29 01:12:09 +00001033clang_type_t
1034ClangASTContext::AddConstModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001035{
1036 if (clang_type)
1037 {
1038 QualType result(QualType::getFromOpaquePtr(clang_type));
1039 result.addConst();
1040 return result.getAsOpaquePtr();
1041 }
1042 return NULL;
1043}
1044
Greg Clayton1be10fc2010-09-29 01:12:09 +00001045clang_type_t
1046ClangASTContext::AddRestrictModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001047{
1048 if (clang_type)
1049 {
1050 QualType result(QualType::getFromOpaquePtr(clang_type));
1051 result.getQualifiers().setRestrict (true);
1052 return result.getAsOpaquePtr();
1053 }
1054 return NULL;
1055}
1056
Greg Clayton1be10fc2010-09-29 01:12:09 +00001057clang_type_t
1058ClangASTContext::AddVolatileModifier (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001059{
1060 if (clang_type)
1061 {
1062 QualType result(QualType::getFromOpaquePtr(clang_type));
1063 result.getQualifiers().setVolatile (true);
1064 return result.getAsOpaquePtr();
1065 }
1066 return NULL;
1067}
1068
Greg Clayton6beaaa62011-01-17 03:46:26 +00001069
1070clang_type_t
1071ClangASTContext::GetTypeForDecl (TagDecl *decl)
1072{
1073 // No need to call the getASTContext() accessor (which can create the AST
1074 // if it isn't created yet, because we can't have created a decl in this
1075 // AST if our AST didn't already exist...
1076 if (m_ast_ap.get())
1077 return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1078 return NULL;
1079}
1080
1081clang_type_t
1082ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1083{
1084 // No need to call the getASTContext() accessor (which can create the AST
1085 // if it isn't created yet, because we can't have created a decl in this
1086 // AST if our AST didn't already exist...
1087 if (m_ast_ap.get())
1088 return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1089 return NULL;
1090}
1091
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001092#pragma mark Structure, Unions, Classes
1093
Greg Clayton1be10fc2010-09-29 01:12:09 +00001094clang_type_t
Greg Clayton55561e92011-10-26 03:31:36 +00001095ClangASTContext::CreateRecordType (DeclContext *decl_ctx, AccessType access_type, const char *name, int kind, LanguageType language)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001096{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001097 ASTContext *ast = getASTContext();
1098 assert (ast != NULL);
Sean Callanana2424172010-10-25 00:29:48 +00001099
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001100 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001101 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001102
Greg Clayton9e409562010-07-28 02:04:09 +00001103
Greg Claytone1be9962011-08-24 23:50:00 +00001104 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001105 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001106 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001107 bool isInternal = false;
1108 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
1109 }
1110
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001111 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1112 // we will need to update this code. I was told to currently always use
1113 // the CXXRecordDecl class since we often don't know from debug information
1114 // if something is struct or a class, so we default to always use the more
1115 // complete definition just in case.
Greg Claytonf0705c82011-10-22 03:33:13 +00001116 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1117 (TagDecl::TagKind)kind,
1118 decl_ctx,
1119 SourceLocation(),
1120 SourceLocation(),
1121 name && name[0] ? &ast->Idents.get(name) : NULL);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001122
1123 if (!name)
1124 decl->setAnonymousStructOrUnion(true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001125
Greg Clayton55561e92011-10-26 03:31:36 +00001126 if (decl_ctx)
1127 {
1128 if (access_type != eAccessNone)
1129 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
1130 decl_ctx->addDecl (decl);
1131 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001132 return ast->getTagDeclType(decl).getAsOpaquePtr();
1133}
1134
Greg Claytonf0705c82011-10-22 03:33:13 +00001135ClassTemplateDecl *
1136ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001137 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001138 const char *class_name,
1139 int kind,
1140 const TemplateParameterInfos &template_param_infos)
1141{
1142 ASTContext *ast = getASTContext();
1143
1144 ClassTemplateDecl *class_template_decl = NULL;
1145 if (decl_ctx == NULL)
1146 decl_ctx = ast->getTranslationUnitDecl();
1147
1148 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1149 DeclarationName decl_name (&identifier_info);
1150
1151 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
1152 for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos)
1153 {
1154 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(*pos);
1155 if (class_template_decl)
1156 return class_template_decl;
1157 }
1158
1159 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1160 const bool parameter_pack = false;
1161 const bool is_typename = false;
1162 const unsigned depth = 0;
1163 const size_t num_template_params = template_param_infos.GetSize();
1164 for (size_t i=0; i<num_template_params; ++i)
1165 {
1166 const char *name = template_param_infos.names[i];
1167 if (template_param_infos.args[i].getAsIntegral())
1168 {
1169 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1170 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1171 SourceLocation(),
1172 SourceLocation(),
1173 depth,
1174 i,
1175 &ast->Idents.get(name),
Greg Claytone04741d2011-12-02 02:09:28 +00001176 template_param_infos.args[i].getIntegralType(),
Greg Claytonf0705c82011-10-22 03:33:13 +00001177 parameter_pack,
1178 NULL));
1179
1180 }
1181 else
1182 {
1183 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1184 ast->getTranslationUnitDecl(), // Is this the right decl context?
1185 SourceLocation(),
1186 SourceLocation(),
1187 depth,
1188 i,
1189 &ast->Idents.get(name),
1190 is_typename,
1191 parameter_pack));
1192 }
1193 }
1194
1195 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1196 SourceLocation(),
1197 SourceLocation(),
1198 &template_param_decls.front(),
1199 template_param_decls.size(),
1200 SourceLocation());
1201
1202
1203 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1204 (TagDecl::TagKind)kind,
1205 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1206 SourceLocation(),
1207 SourceLocation(),
1208 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001209
1210 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1211 i < template_param_decl_count;
1212 ++i)
1213 {
1214 template_param_decls[i]->setDeclContext (template_cxx_decl);
1215 }
1216
Sean Callananb5c79622011-11-19 01:35:08 +00001217 // With templated classes, we say that a class is templated with
1218 // specializations, but that the bare class has no functions.
1219 template_cxx_decl->startDefinition();
1220 template_cxx_decl->completeDefinition();
1221
Greg Claytonf0705c82011-10-22 03:33:13 +00001222 class_template_decl = ClassTemplateDecl::Create (*ast,
1223 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1224 SourceLocation(),
1225 decl_name,
1226 template_param_list,
1227 template_cxx_decl,
1228 NULL);
1229
1230 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001231 {
Greg Clayton55561e92011-10-26 03:31:36 +00001232 if (access_type != eAccessNone)
1233 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Claytonf0705c82011-10-22 03:33:13 +00001234 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001235
1236#ifdef LLDB_CONFIGURATION_DEBUG
1237 VerifyDecl(class_template_decl);
1238#endif
1239 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001240
1241 return class_template_decl;
1242}
1243
1244
1245ClassTemplateSpecializationDecl *
1246ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1247 ClassTemplateDecl *class_template_decl,
1248 int kind,
1249 const TemplateParameterInfos &template_param_infos)
1250{
1251 ASTContext *ast = getASTContext();
1252 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1253 (TagDecl::TagKind)kind,
1254 decl_ctx,
1255 SourceLocation(),
1256 SourceLocation(),
1257 class_template_decl,
1258 &template_param_infos.args.front(),
1259 template_param_infos.args.size(),
1260 NULL);
1261
1262 return class_template_specialization_decl;
1263}
1264
1265lldb::clang_type_t
1266ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1267{
1268 if (class_template_specialization_decl)
1269 {
1270 ASTContext *ast = getASTContext();
1271 if (ast)
1272 return ast->getTagDeclType(class_template_specialization_decl).getAsOpaquePtr();
1273 }
1274 return NULL;
1275}
1276
Greg Clayton6beaaa62011-01-17 03:46:26 +00001277bool
1278ClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1279{
1280 if (clang_type == NULL)
1281 return false;
1282
1283 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1284
1285 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1286 switch (type_class)
1287 {
1288 case clang::Type::Record:
1289 {
1290 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1291 if (cxx_record_decl)
1292 {
1293 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001294 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001295 return true;
1296 }
1297 }
1298 break;
1299
1300 case clang::Type::Enum:
1301 {
1302 EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1303 if (enum_decl)
1304 {
1305 enum_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001306 enum_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001307 return true;
1308 }
1309 }
1310 break;
1311
1312 case clang::Type::ObjCObject:
1313 case clang::Type::ObjCInterface:
1314 {
Sean Callanan78e37602011-01-27 04:42:51 +00001315 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00001316 assert (objc_class_type);
1317 if (objc_class_type)
1318 {
1319 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1320
1321 if (class_interface_decl)
1322 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001323 class_interface_decl->setHasExternalLexicalStorage (has_extern);
Greg Claytonc432c192011-01-20 04:18:48 +00001324 class_interface_decl->setHasExternalVisibleStorage (has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001325 return true;
1326 }
1327 }
1328 }
1329 break;
1330
1331 case clang::Type::Typedef:
1332 return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Sean Callanan912855f2011-08-11 23:56:13 +00001333
1334 case clang::Type::Elaborated:
1335 return ClangASTContext::SetHasExternalStorage (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001336
1337 default:
1338 break;
1339 }
1340 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001341}
1342
Greg Claytona3c444a2010-10-01 23:13:49 +00001343static bool
1344IsOperator (const char *name, OverloadedOperatorKind &op_kind)
1345{
1346 if (name == NULL || name[0] == '\0')
1347 return false;
1348
Sean Callanana43f20d2010-12-10 19:51:54 +00001349#define OPERATOR_PREFIX "operator"
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001350#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
Sean Callananbfeff8c2010-12-10 02:15:55 +00001351
1352 const char *post_op_name = NULL;
1353
Sean Callanana43f20d2010-12-10 19:51:54 +00001354 bool no_space = true;
Sean Callananbfeff8c2010-12-10 02:15:55 +00001355
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001356 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
Greg Claytona3c444a2010-10-01 23:13:49 +00001357 return false;
1358
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001359 post_op_name = name + OPERATOR_PREFIX_LENGTH;
1360
Sean Callanana43f20d2010-12-10 19:51:54 +00001361 if (post_op_name[0] == ' ')
1362 {
1363 post_op_name++;
1364 no_space = false;
1365 }
1366
1367#undef OPERATOR_PREFIX
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001368#undef OPERATOR_PREFIX_LENGTH
Sean Callanana43f20d2010-12-10 19:51:54 +00001369
Greg Claytona3c444a2010-10-01 23:13:49 +00001370 // This is an operator, set the overloaded operator kind to invalid
1371 // in case this is a conversion operator...
1372 op_kind = NUM_OVERLOADED_OPERATORS;
1373
1374 switch (post_op_name[0])
1375 {
Sean Callananbfeff8c2010-12-10 02:15:55 +00001376 default:
1377 if (no_space)
1378 return false;
1379 break;
Greg Claytona3c444a2010-10-01 23:13:49 +00001380 case 'n':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001381 if (no_space)
1382 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001383 if (strcmp (post_op_name, "new") == 0)
1384 op_kind = OO_New;
1385 else if (strcmp (post_op_name, "new[]") == 0)
1386 op_kind = OO_Array_New;
1387 break;
1388
1389 case 'd':
Sean Callananbfeff8c2010-12-10 02:15:55 +00001390 if (no_space)
1391 return false;
Greg Claytona3c444a2010-10-01 23:13:49 +00001392 if (strcmp (post_op_name, "delete") == 0)
1393 op_kind = OO_Delete;
1394 else if (strcmp (post_op_name, "delete[]") == 0)
1395 op_kind = OO_Array_Delete;
1396 break;
1397
1398 case '+':
1399 if (post_op_name[1] == '\0')
1400 op_kind = OO_Plus;
1401 else if (post_op_name[2] == '\0')
1402 {
1403 if (post_op_name[1] == '=')
1404 op_kind = OO_PlusEqual;
1405 else if (post_op_name[1] == '+')
1406 op_kind = OO_PlusPlus;
1407 }
1408 break;
1409
1410 case '-':
1411 if (post_op_name[1] == '\0')
1412 op_kind = OO_Minus;
1413 else if (post_op_name[2] == '\0')
1414 {
1415 switch (post_op_name[1])
1416 {
1417 case '=': op_kind = OO_MinusEqual; break;
1418 case '-': op_kind = OO_MinusMinus; break;
1419 case '>': op_kind = OO_Arrow; break;
1420 }
1421 }
1422 else if (post_op_name[3] == '\0')
1423 {
1424 if (post_op_name[2] == '*')
1425 op_kind = OO_ArrowStar; break;
1426 }
1427 break;
1428
1429 case '*':
1430 if (post_op_name[1] == '\0')
1431 op_kind = OO_Star;
1432 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1433 op_kind = OO_StarEqual;
1434 break;
1435
1436 case '/':
1437 if (post_op_name[1] == '\0')
1438 op_kind = OO_Slash;
1439 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1440 op_kind = OO_SlashEqual;
1441 break;
1442
1443 case '%':
1444 if (post_op_name[1] == '\0')
1445 op_kind = OO_Percent;
1446 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1447 op_kind = OO_PercentEqual;
1448 break;
1449
1450
1451 case '^':
1452 if (post_op_name[1] == '\0')
1453 op_kind = OO_Caret;
1454 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1455 op_kind = OO_CaretEqual;
1456 break;
1457
1458 case '&':
1459 if (post_op_name[1] == '\0')
1460 op_kind = OO_Amp;
1461 else if (post_op_name[2] == '\0')
1462 {
1463 switch (post_op_name[1])
1464 {
1465 case '=': op_kind = OO_AmpEqual; break;
1466 case '&': op_kind = OO_AmpAmp; break;
1467 }
1468 }
1469 break;
1470
1471 case '|':
1472 if (post_op_name[1] == '\0')
1473 op_kind = OO_Pipe;
1474 else if (post_op_name[2] == '\0')
1475 {
1476 switch (post_op_name[1])
1477 {
1478 case '=': op_kind = OO_PipeEqual; break;
1479 case '|': op_kind = OO_PipePipe; break;
1480 }
1481 }
1482 break;
1483
1484 case '~':
1485 if (post_op_name[1] == '\0')
1486 op_kind = OO_Tilde;
1487 break;
1488
1489 case '!':
1490 if (post_op_name[1] == '\0')
1491 op_kind = OO_Exclaim;
1492 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1493 op_kind = OO_ExclaimEqual;
1494 break;
1495
1496 case '=':
1497 if (post_op_name[1] == '\0')
1498 op_kind = OO_Equal;
1499 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1500 op_kind = OO_EqualEqual;
1501 break;
1502
1503 case '<':
1504 if (post_op_name[1] == '\0')
1505 op_kind = OO_Less;
1506 else if (post_op_name[2] == '\0')
1507 {
1508 switch (post_op_name[1])
1509 {
1510 case '<': op_kind = OO_LessLess; break;
1511 case '=': op_kind = OO_LessEqual; break;
1512 }
1513 }
1514 else if (post_op_name[3] == '\0')
1515 {
1516 if (post_op_name[2] == '=')
1517 op_kind = OO_LessLessEqual;
1518 }
1519 break;
1520
1521 case '>':
1522 if (post_op_name[1] == '\0')
1523 op_kind = OO_Greater;
1524 else if (post_op_name[2] == '\0')
1525 {
1526 switch (post_op_name[1])
1527 {
1528 case '>': op_kind = OO_GreaterGreater; break;
1529 case '=': op_kind = OO_GreaterEqual; break;
1530 }
1531 }
1532 else if (post_op_name[1] == '>' &&
1533 post_op_name[2] == '=' &&
1534 post_op_name[3] == '\0')
1535 {
1536 op_kind = OO_GreaterGreaterEqual;
1537 }
1538 break;
1539
1540 case ',':
1541 if (post_op_name[1] == '\0')
1542 op_kind = OO_Comma;
1543 break;
1544
1545 case '(':
1546 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1547 op_kind = OO_Call;
1548 break;
1549
1550 case '[':
1551 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1552 op_kind = OO_Subscript;
1553 break;
1554 }
1555
1556 return true;
1557}
Greg Clayton6beaaa62011-01-17 03:46:26 +00001558
Greg Clayton090d0982011-06-19 03:43:27 +00001559static inline bool
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001560check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001561{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001562 // Special-case call since it can take any number of operands
1563 if(op_kind == OO_Call)
1564 return true;
1565
Greg Clayton090d0982011-06-19 03:43:27 +00001566 // The parameter count doens't include "this"
1567 if (num_params == 0)
1568 return unary;
1569 if (num_params == 1)
1570 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001571 else
Greg Clayton090d0982011-06-19 03:43:27 +00001572 return false;
1573}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001574
Greg Clayton090d0982011-06-19 03:43:27 +00001575bool
1576ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1577{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001578#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (op_kind, Unary, Binary, num_params);
Greg Clayton090d0982011-06-19 03:43:27 +00001579 switch (op_kind)
1580 {
1581#include "clang/Basic/OperatorKinds.def"
1582 default: break;
1583 }
1584 return false;
1585}
1586
Greg Claytona51ed9b2010-09-23 01:09:21 +00001587CXXMethodDecl *
Sean Callanan61da09b2010-09-17 02:58:26 +00001588ClangASTContext::AddMethodToCXXRecordType
1589(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001590 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001591 clang_type_t record_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001592 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001593 clang_type_t method_opaque_type,
Greg Claytona51ed9b2010-09-23 01:09:21 +00001594 lldb::AccessType access,
Greg Clayton0fffff52010-09-24 05:15:53 +00001595 bool is_virtual,
1596 bool is_static,
Greg Claytonf51de672010-10-01 02:31:07 +00001597 bool is_inline,
Sean Callananc1b732d2011-11-01 18:07:13 +00001598 bool is_explicit,
Sean Callanandbb58392011-11-02 01:38:59 +00001599 bool is_attr_used,
1600 bool is_artificial
Greg Claytona51ed9b2010-09-23 01:09:21 +00001601)
Sean Callanan61da09b2010-09-17 02:58:26 +00001602{
Sean Callananfc55f5d2010-09-21 00:44:12 +00001603 if (!record_opaque_type || !method_opaque_type || !name)
Johnny Chend440bcc2010-09-28 16:10:54 +00001604 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001605
Greg Clayton6beaaa62011-01-17 03:46:26 +00001606 assert(ast);
Sean Callanan61da09b2010-09-17 02:58:26 +00001607
Greg Clayton6beaaa62011-01-17 03:46:26 +00001608 IdentifierTable *identifier_table = &ast->Idents;
Sean Callanan61da09b2010-09-17 02:58:26 +00001609
1610 assert(identifier_table);
1611
Sean Callananfc55f5d2010-09-21 00:44:12 +00001612 QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00001613
Greg Clayton6beaaa62011-01-17 03:46:26 +00001614 CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
Sean Callanan61da09b2010-09-17 02:58:26 +00001615
Greg Clayton0fffff52010-09-24 05:15:53 +00001616 if (cxx_record_decl == NULL)
Greg Claytona51ed9b2010-09-23 01:09:21 +00001617 return NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001618
Greg Clayton0fffff52010-09-24 05:15:53 +00001619 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001620
Greg Claytonf51de672010-10-01 02:31:07 +00001621 CXXMethodDecl *cxx_method_decl = NULL;
Sean Callanan61da09b2010-09-17 02:58:26 +00001622
Greg Claytonf51de672010-10-01 02:31:07 +00001623 DeclarationName decl_name (&identifier_table->get(name));
Greg Clayton878eaf12010-10-01 03:45:20 +00001624
Sean Callanan78e37602011-01-27 04:42:51 +00001625 const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
Greg Clayton878eaf12010-10-01 03:45:20 +00001626
Greg Clayton90a2acd2010-10-02 01:40:05 +00001627 if (function_Type == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001628 return NULL;
1629
Sean Callanan78e37602011-01-27 04:42:51 +00001630 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
Greg Clayton878eaf12010-10-01 03:45:20 +00001631
1632 if (!method_function_prototype)
1633 return NULL;
1634
1635 unsigned int num_params = method_function_prototype->getNumArgs();
1636
Sean Callanandbb58392011-11-02 01:38:59 +00001637 CXXDestructorDecl *cxx_dtor_decl(NULL);
1638 CXXConstructorDecl *cxx_ctor_decl(NULL);
1639
Greg Clayton878eaf12010-10-01 03:45:20 +00001640 if (name[0] == '~')
Greg Claytonf51de672010-10-01 02:31:07 +00001641 {
Sean Callanandbb58392011-11-02 01:38:59 +00001642 cxx_dtor_decl = CXXDestructorDecl::Create (*ast,
1643 cxx_record_decl,
1644 SourceLocation(),
1645 DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1646 method_qual_type,
1647 NULL,
1648 is_inline,
1649 is_artificial);
1650 cxx_method_decl = cxx_dtor_decl;
Greg Clayton878eaf12010-10-01 03:45:20 +00001651 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00001652 else if (decl_name == cxx_record_decl->getDeclName())
Greg Clayton878eaf12010-10-01 03:45:20 +00001653 {
Sean Callanandbb58392011-11-02 01:38:59 +00001654 cxx_ctor_decl = CXXConstructorDecl::Create (*ast,
1655 cxx_record_decl,
1656 SourceLocation(),
1657 DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
1658 method_qual_type,
1659 NULL, // TypeSourceInfo *
1660 is_explicit,
1661 is_inline,
1662 is_artificial,
1663 false /*is_constexpr*/);
1664 cxx_method_decl = cxx_ctor_decl;
Greg Claytonf51de672010-10-01 02:31:07 +00001665 }
1666 else
Greg Clayton878eaf12010-10-01 03:45:20 +00001667 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001668
1669 OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1670 if (IsOperator (name, op_kind))
Greg Clayton878eaf12010-10-01 03:45:20 +00001671 {
Greg Claytona3c444a2010-10-01 23:13:49 +00001672 if (op_kind != NUM_OVERLOADED_OPERATORS)
1673 {
Greg Clayton090d0982011-06-19 03:43:27 +00001674 // Check the number of operator parameters. Sometimes we have
1675 // seen bad DWARF that doesn't correctly describe operators and
1676 // if we try to create a methed and add it to the class, clang
1677 // will assert and crash, so we need to make sure things are
1678 // acceptable.
1679 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
1680 return NULL;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001681 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001682 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001683 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001684 DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001685 method_qual_type,
1686 NULL, // TypeSourceInfo *
Greg Claytona3c444a2010-10-01 23:13:49 +00001687 is_static,
1688 SC_None,
Sean Callananfb0b7582011-03-15 00:17:19 +00001689 is_inline,
Sean Callanan880e6802011-10-07 23:18:13 +00001690 false /*is_constexpr*/,
Sean Callananfb0b7582011-03-15 00:17:19 +00001691 SourceLocation());
Greg Claytona3c444a2010-10-01 23:13:49 +00001692 }
1693 else if (num_params == 0)
1694 {
1695 // Conversion operators don't take params...
Greg Clayton6beaaa62011-01-17 03:46:26 +00001696 cxx_method_decl = CXXConversionDecl::Create (*ast,
Greg Claytona3c444a2010-10-01 23:13:49 +00001697 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001698 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001699 DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
Greg Claytona3c444a2010-10-01 23:13:49 +00001700 method_qual_type,
1701 NULL, // TypeSourceInfo *
1702 is_inline,
Sean Callananfb0b7582011-03-15 00:17:19 +00001703 is_explicit,
Sean Callanan880e6802011-10-07 23:18:13 +00001704 false /*is_constexpr*/,
Sean Callananfb0b7582011-03-15 00:17:19 +00001705 SourceLocation());
Greg Claytona3c444a2010-10-01 23:13:49 +00001706 }
Greg Clayton878eaf12010-10-01 03:45:20 +00001707 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001708
1709 if (cxx_method_decl == NULL)
Greg Clayton878eaf12010-10-01 03:45:20 +00001710 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001711 cxx_method_decl = CXXMethodDecl::Create (*ast,
Greg Clayton878eaf12010-10-01 03:45:20 +00001712 cxx_record_decl,
Sean Callananfb0b7582011-03-15 00:17:19 +00001713 SourceLocation(),
Greg Claytona3c444a2010-10-01 23:13:49 +00001714 DeclarationNameInfo (decl_name, SourceLocation()),
Greg Clayton878eaf12010-10-01 03:45:20 +00001715 method_qual_type,
1716 NULL, // TypeSourceInfo *
1717 is_static,
1718 SC_None,
Sean Callananfb0b7582011-03-15 00:17:19 +00001719 is_inline,
Sean Callanan880e6802011-10-07 23:18:13 +00001720 false /*is_constexpr*/,
Sean Callananfb0b7582011-03-15 00:17:19 +00001721 SourceLocation());
Greg Clayton878eaf12010-10-01 03:45:20 +00001722 }
Greg Claytonf51de672010-10-01 02:31:07 +00001723 }
Greg Claytona3c444a2010-10-01 23:13:49 +00001724
Greg Clayton1be10fc2010-09-29 01:12:09 +00001725 AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
Greg Clayton0fffff52010-09-24 05:15:53 +00001726
1727 cxx_method_decl->setAccess (access_specifier);
1728 cxx_method_decl->setVirtualAsWritten (is_virtual);
Sean Callanane2ef6e32010-09-23 03:01:22 +00001729
Sean Callananc1b732d2011-11-01 18:07:13 +00001730 if (is_attr_used)
1731 cxx_method_decl->addAttr(::new (*ast) UsedAttr(SourceRange(), *ast));
1732
Sean Callananfc55f5d2010-09-21 00:44:12 +00001733 // Populate the method decl with parameter decls
Sean Callananfc55f5d2010-09-21 00:44:12 +00001734
Charles Davis8c444c42011-05-19 23:33:46 +00001735 llvm::SmallVector<ParmVarDecl *, 12> params;
Sean Callananfc55f5d2010-09-21 00:44:12 +00001736
1737 for (int param_index = 0;
1738 param_index < num_params;
1739 ++param_index)
1740 {
Charles Davis8c444c42011-05-19 23:33:46 +00001741 params.push_back (ParmVarDecl::Create (*ast,
1742 cxx_method_decl,
1743 SourceLocation(),
1744 SourceLocation(),
1745 NULL, // anonymous
1746 method_function_prototype->getArgType(param_index),
1747 NULL,
1748 SC_None,
1749 SC_None,
1750 NULL));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001751 }
1752
Sean Callanan880e6802011-10-07 23:18:13 +00001753 cxx_method_decl->setParams (ArrayRef<ParmVarDecl*>(params));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001754
Greg Clayton0fffff52010-09-24 05:15:53 +00001755 cxx_record_decl->addDecl (cxx_method_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001756
Greg Clayton8b867b42011-11-02 02:06:20 +00001757 // Sometimes the debug info will mention a constructor (default/copy/move),
1758 // destructor, or assignment operator (copy/move) but there won't be any
1759 // version of this in the code. So we check if the function was artificially
1760 // generated and if it is trivial and this lets the compiler/backend know
1761 // that it can inline the IR for these when it needs to and we can avoid a
1762 // "missing function" error when running expressions.
1763
Sean Callanandbb58392011-11-02 01:38:59 +00001764 if (is_artificial)
1765 {
Greg Clayton8b867b42011-11-02 02:06:20 +00001766 if (cxx_ctor_decl &&
1767 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
1768 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
1769 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
Sean Callanandbb58392011-11-02 01:38:59 +00001770 {
1771 cxx_ctor_decl->setDefaulted();
1772 cxx_ctor_decl->setTrivial(true);
1773 }
Greg Clayton8b867b42011-11-02 02:06:20 +00001774 else if (cxx_dtor_decl)
Sean Callanandbb58392011-11-02 01:38:59 +00001775 {
Greg Clayton8b867b42011-11-02 02:06:20 +00001776 if (cxx_record_decl->hasTrivialDestructor())
1777 {
1778 cxx_dtor_decl->setDefaulted();
1779 cxx_dtor_decl->setTrivial(true);
1780 }
1781 }
1782 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
1783 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
1784 {
1785 cxx_method_decl->setDefaulted();
1786 cxx_method_decl->setTrivial(true);
Sean Callanandbb58392011-11-02 01:38:59 +00001787 }
1788 }
1789
Sean Callanan5e9e1992011-10-26 01:06:27 +00001790#ifdef LLDB_CONFIGURATION_DEBUG
1791 VerifyDecl(cxx_method_decl);
1792#endif
Greg Claytonc432c192011-01-20 04:18:48 +00001793
1794// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
1795// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
1796// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
1797// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
1798// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
1799// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
1800// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
1801// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
1802// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
Greg Claytona51ed9b2010-09-23 01:09:21 +00001803 return cxx_method_decl;
Sean Callanan61da09b2010-09-17 02:58:26 +00001804}
1805
Jim Inghame3ae82a2011-11-12 01:36:43 +00001806clang::FieldDecl *
Greg Clayton8cf05932010-07-22 18:30:50 +00001807ClangASTContext::AddFieldToRecordType
1808(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001809 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001810 clang_type_t record_clang_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001811 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00001812 clang_type_t field_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00001813 AccessType access,
1814 uint32_t bitfield_bit_size
1815)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001816{
1817 if (record_clang_type == NULL || field_type == NULL)
Jim Inghame3ae82a2011-11-12 01:36:43 +00001818 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001819
Jim Inghame3ae82a2011-11-12 01:36:43 +00001820 FieldDecl *field = NULL;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001821 IdentifierTable *identifier_table = &ast->Idents;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001822
Greg Clayton6beaaa62011-01-17 03:46:26 +00001823 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001824 assert (identifier_table != NULL);
1825
1826 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
1827
Sean Callanan78e37602011-01-27 04:42:51 +00001828 const clang::Type *clang_type = record_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001829 if (clang_type)
1830 {
1831 const RecordType *record_type = dyn_cast<RecordType>(clang_type);
1832
1833 if (record_type)
1834 {
1835 RecordDecl *record_decl = record_type->getDecl();
1836
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001837 clang::Expr *bit_width = NULL;
1838 if (bitfield_bit_size != 0)
1839 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001840 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1841 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001842 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00001843 field = FieldDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001844 record_decl,
1845 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00001846 SourceLocation(),
Greg Clayton8cf05932010-07-22 18:30:50 +00001847 name ? &identifier_table->get(name) : NULL, // Identifier
1848 QualType::getFromOpaquePtr(field_type), // Field type
Sean Callanancc427fa2011-07-30 02:42:06 +00001849 NULL, // TInfo *
Greg Clayton8cf05932010-07-22 18:30:50 +00001850 bit_width, // BitWidth
Sean Callanancc427fa2011-07-30 02:42:06 +00001851 false, // Mutable
1852 false); // HasInit
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001853
Greg Clayton8cf05932010-07-22 18:30:50 +00001854 field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001855
1856 if (field)
1857 {
1858 record_decl->addDecl(field);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001859
1860#ifdef LLDB_CONFIGURATION_DEBUG
1861 VerifyDecl(field);
1862#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001863 }
1864 }
Greg Clayton9e409562010-07-28 02:04:09 +00001865 else
1866 {
Sean Callanan78e37602011-01-27 04:42:51 +00001867 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
Greg Clayton9e409562010-07-28 02:04:09 +00001868 if (objc_class_type)
1869 {
Greg Clayton0fffff52010-09-24 05:15:53 +00001870 bool is_synthesized = false;
Jim Inghame3ae82a2011-11-12 01:36:43 +00001871 field = ClangASTContext::AddObjCClassIVar (ast,
Sean Callanan6e6a7c72010-09-16 20:01:08 +00001872 record_clang_type,
Greg Clayton9e409562010-07-28 02:04:09 +00001873 name,
1874 field_type,
1875 access,
1876 bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00001877 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00001878 }
1879 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001880 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00001881 return field;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001882}
1883
1884bool
1885ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1886{
1887 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1888}
1889
1890bool
1891ClangASTContext::FieldIsBitfield
1892(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001893 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001894 FieldDecl* field,
1895 uint32_t& bitfield_bit_size
1896)
1897{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001898 if (ast == NULL || field == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001899 return false;
1900
1901 if (field->isBitField())
1902 {
1903 Expr* bit_width_expr = field->getBitWidth();
1904 if (bit_width_expr)
1905 {
1906 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001907 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001908 {
1909 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1910 return true;
1911 }
1912 }
1913 }
1914 return false;
1915}
1916
1917bool
1918ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1919{
1920 if (record_decl == NULL)
1921 return false;
1922
1923 if (!record_decl->field_empty())
1924 return true;
1925
1926 // No fields, lets check this is a CXX record and check the base classes
1927 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1928 if (cxx_record_decl)
1929 {
1930 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1931 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1932 base_class != base_class_end;
1933 ++base_class)
1934 {
1935 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1936 if (RecordHasFields(base_class_decl))
1937 return true;
1938 }
1939 }
1940 return false;
1941}
1942
1943void
Greg Clayton6beaaa62011-01-17 03:46:26 +00001944ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001945{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001946 if (clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001947 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001948 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1949
Sean Callanan78e37602011-01-27 04:42:51 +00001950 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
Greg Clayton6beaaa62011-01-17 03:46:26 +00001951 if (record_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001952 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001953 RecordDecl *record_decl = record_type->getDecl();
1954 if (record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001955 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001956 uint32_t field_idx;
1957 RecordDecl::field_iterator field, field_end;
1958 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
1959 field != field_end;
1960 ++field, ++field_idx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001961 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001962 // If no accessibility was assigned, assign the correct one
1963 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
1964 field->setAccess ((AccessSpecifier)default_accessibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001965 }
1966 }
1967 }
1968 }
1969}
1970
1971#pragma mark C++ Base Classes
1972
1973CXXBaseSpecifier *
Greg Clayton1be10fc2010-09-29 01:12:09 +00001974ClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001975{
1976 if (base_class_type)
Greg Claytone6371122010-07-30 20:30:44 +00001977 return new CXXBaseSpecifier (SourceRange(),
1978 is_virtual,
1979 base_of_class,
1980 ConvertAccessTypeToAccessSpecifier (access),
Sean Callanan2c777c42011-01-18 23:32:05 +00001981 getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
1982 SourceLocation());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001983 return NULL;
1984}
1985
Greg Clayton0b42ac32010-07-02 01:29:13 +00001986void
1987ClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1988{
1989 for (unsigned i=0; i<num_base_classes; ++i)
1990 {
1991 delete base_classes[i];
1992 base_classes[i] = NULL;
1993 }
1994}
1995
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001996bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00001997ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001998{
1999 if (class_clang_type)
2000 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002001 CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
2002 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002003 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002004 cxx_record_decl->setBases(base_classes, num_base_classes);
2005 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002006 }
2007 }
2008 return false;
2009}
Greg Clayton8cf05932010-07-22 18:30:50 +00002010#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002011
Greg Clayton1be10fc2010-09-29 01:12:09 +00002012clang_type_t
Greg Clayton8cf05932010-07-22 18:30:50 +00002013ClangASTContext::CreateObjCClass
2014(
2015 const char *name,
2016 DeclContext *decl_ctx,
2017 bool isForwardDecl,
2018 bool isInternal
2019)
2020{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002021 ASTContext *ast = getASTContext();
2022 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00002023 assert (name && name[0]);
2024 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00002025 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00002026
2027 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
2028 // we will need to update this code. I was told to currently always use
2029 // the CXXRecordDecl class since we often don't know from debug information
2030 // if something is struct or a class, so we default to always use the more
2031 // complete definition just in case.
Greg Clayton6beaaa62011-01-17 03:46:26 +00002032 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00002033 decl_ctx,
2034 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00002035 &ast->Idents.get(name),
Greg Clayton8cf05932010-07-22 18:30:50 +00002036 SourceLocation(),
2037 isForwardDecl,
2038 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00002039
Greg Clayton6beaaa62011-01-17 03:46:26 +00002040 return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00002041}
2042
2043bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002044ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
Greg Clayton8cf05932010-07-22 18:30:50 +00002045{
2046 if (class_opaque_type && super_opaque_type)
2047 {
2048 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2049 QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
Sean Callanan78e37602011-01-27 04:42:51 +00002050 const clang::Type *class_type = class_qual_type.getTypePtr();
2051 const clang::Type *super_type = super_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00002052 if (class_type && super_type)
2053 {
Sean Callanan78e37602011-01-27 04:42:51 +00002054 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2055 const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00002056 if (objc_class_type && objc_super_type)
2057 {
2058 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2059 ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
2060 if (class_interface_decl && super_interface_decl)
2061 {
2062 class_interface_decl->setSuperClass(super_interface_decl);
2063 return true;
2064 }
2065 }
2066 }
2067 }
2068 return false;
2069}
2070
2071
Jim Inghame3ae82a2011-11-12 01:36:43 +00002072FieldDecl *
Greg Clayton8cf05932010-07-22 18:30:50 +00002073ClangASTContext::AddObjCClassIVar
2074(
Greg Clayton6beaaa62011-01-17 03:46:26 +00002075 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002076 clang_type_t class_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00002077 const char *name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002078 clang_type_t ivar_opaque_type,
Greg Clayton8cf05932010-07-22 18:30:50 +00002079 AccessType access,
2080 uint32_t bitfield_bit_size,
Greg Clayton0fffff52010-09-24 05:15:53 +00002081 bool is_synthesized
Greg Clayton8cf05932010-07-22 18:30:50 +00002082)
2083{
2084 if (class_opaque_type == NULL || ivar_opaque_type == NULL)
Jim Inghame3ae82a2011-11-12 01:36:43 +00002085 return NULL;
Greg Clayton8cf05932010-07-22 18:30:50 +00002086
Jim Inghame3ae82a2011-11-12 01:36:43 +00002087 ObjCIvarDecl *field = NULL;
2088
Greg Clayton6beaaa62011-01-17 03:46:26 +00002089 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton8cf05932010-07-22 18:30:50 +00002090
Greg Clayton6beaaa62011-01-17 03:46:26 +00002091 assert (ast != NULL);
Greg Clayton8cf05932010-07-22 18:30:50 +00002092 assert (identifier_table != NULL);
2093
2094 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2095
Sean Callanan78e37602011-01-27 04:42:51 +00002096 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton8cf05932010-07-22 18:30:50 +00002097 if (class_type)
2098 {
Sean Callanan78e37602011-01-27 04:42:51 +00002099 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton8cf05932010-07-22 18:30:50 +00002100
2101 if (objc_class_type)
2102 {
2103 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2104
2105 if (class_interface_decl)
2106 {
2107 clang::Expr *bit_width = NULL;
2108 if (bitfield_bit_size != 0)
2109 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002110 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
2111 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
Greg Clayton8cf05932010-07-22 18:30:50 +00002112 }
2113
Jim Inghame3ae82a2011-11-12 01:36:43 +00002114 field = ObjCIvarDecl::Create (*ast,
2115 class_interface_decl,
2116 SourceLocation(),
2117 SourceLocation(),
2118 &identifier_table->get(name), // Identifier
2119 QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
2120 NULL, // TypeSourceInfo *
2121 ConvertAccessTypeToObjCIvarAccessControl (access),
2122 bit_width,
2123 is_synthesized);
Greg Clayton9e409562010-07-28 02:04:09 +00002124
2125 if (field)
2126 {
2127 class_interface_decl->addDecl(field);
Sean Callanan5e9e1992011-10-26 01:06:27 +00002128
2129#ifdef LLDB_CONFIGURATION_DEBUG
2130 VerifyDecl(field);
2131#endif
2132
Jim Inghame3ae82a2011-11-12 01:36:43 +00002133 return field;
Greg Clayton9e409562010-07-28 02:04:09 +00002134 }
Greg Clayton8cf05932010-07-22 18:30:50 +00002135 }
2136 }
2137 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002138 return NULL;
2139}
2140
2141bool
2142ClangASTContext::AddObjCClassProperty
2143(
2144 ASTContext *ast,
2145 clang_type_t class_opaque_type,
2146 const char *property_name,
2147 clang_type_t property_opaque_type,
2148 ObjCIvarDecl *ivar_decl,
2149 const char *property_setter_name,
2150 const char *property_getter_name,
2151 uint32_t property_attributes
2152)
2153{
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002154 if (class_opaque_type == NULL || property_name == NULL || property_name[0] == '\0')
Jim Inghame3ae82a2011-11-12 01:36:43 +00002155 return false;
2156
2157 IdentifierTable *identifier_table = &ast->Idents;
2158
2159 assert (ast != NULL);
2160 assert (identifier_table != NULL);
2161
2162 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2163 const clang::Type *class_type = class_qual_type.getTypePtr();
2164 if (class_type)
2165 {
2166 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
2167
2168 if (objc_class_type)
2169 {
2170 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2171
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002172 clang_type_t property_opaque_type_to_access;
2173
2174 if (property_opaque_type)
2175 property_opaque_type_to_access = property_opaque_type;
2176 else if (ivar_decl)
2177 property_opaque_type_to_access = ivar_decl->getType().getAsOpaquePtr();
2178
Jim Inghame3ae82a2011-11-12 01:36:43 +00002179 // FIXME: For now, we don't know how to add properties if we don't have their associated ivar.
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002180 if (class_interface_decl && property_opaque_type_to_access)
Jim Inghame3ae82a2011-11-12 01:36:43 +00002181 {
2182 clang::TypeSourceInfo *prop_type_source;
2183 if (ivar_decl)
2184 prop_type_source = ast->CreateTypeSourceInfo (ivar_decl->getType());
2185 else
2186 prop_type_source = ast->CreateTypeSourceInfo (QualType::getFromOpaquePtr(property_opaque_type));
2187
2188 ObjCPropertyDecl *property_decl = ObjCPropertyDecl::Create(*ast,
2189 class_interface_decl,
2190 SourceLocation(), // Source Location
2191 &identifier_table->get(property_name),
2192 SourceLocation(), //Source Location for AT
2193 prop_type_source
2194 );
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002195 if (property_decl)
2196 {
Jim Inghame3ae82a2011-11-12 01:36:43 +00002197 class_interface_decl->addDecl (property_decl);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002198
2199 Selector setter_sel, getter_sel;
2200
Jim Inghame3ae82a2011-11-12 01:36:43 +00002201 if (property_setter_name != NULL)
2202 {
2203 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
2204 clang::IdentifierInfo *setter_ident = &identifier_table->get(property_setter_no_colon.c_str());
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002205 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
Jim Inghame3ae82a2011-11-12 01:36:43 +00002206 property_decl->setSetterName(setter_sel);
2207 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
2208 }
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002209 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
2210 {
2211 std::string setter_sel_string("set");
2212 setter_sel_string.push_back(::toupper(property_name[0]));
2213 setter_sel_string.append(&property_name[1]);
2214 clang::IdentifierInfo *setter_ident = &identifier_table->get(setter_sel_string.c_str());
2215 setter_sel = ast->Selectors.getSelector(1, &setter_ident);
2216 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002217
2218 if (property_getter_name != NULL)
2219 {
2220 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_getter_name);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002221 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Jim Inghame3ae82a2011-11-12 01:36:43 +00002222 property_decl->setGetterName(getter_sel);
2223 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002224 }
2225 else
2226 {
2227 clang::IdentifierInfo *getter_ident = &identifier_table->get(property_name);
2228 getter_sel = ast->Selectors.getSelector(0, &getter_ident);
Jim Inghame3ae82a2011-11-12 01:36:43 +00002229 }
2230
2231 if (ivar_decl)
2232 property_decl->setPropertyIvarDecl (ivar_decl);
2233
2234 if (property_attributes & DW_APPLE_PROPERTY_readonly)
2235 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
2236 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
2237 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
2238 if (property_attributes & DW_APPLE_PROPERTY_assign)
2239 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
2240 if (property_attributes & DW_APPLE_PROPERTY_retain)
2241 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
2242 if (property_attributes & DW_APPLE_PROPERTY_copy)
2243 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
2244 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
2245 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002246
2247 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
2248 {
2249 QualType result_type = QualType::getFromOpaquePtr(property_opaque_type_to_access);
2250
2251 const bool isInstance = true;
2252 const bool isVariadic = false;
2253 const bool isSynthesized = false;
2254 const bool isImplicitlyDeclared = true;
2255 const bool isDefined = false;
2256 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2257 const bool HasRelatedResultType = false;
2258
2259 ObjCMethodDecl *getter = ObjCMethodDecl::Create(*ast,
2260 SourceLocation(),
2261 SourceLocation(),
2262 getter_sel,
2263 result_type,
2264 NULL,
2265 class_interface_decl,
2266 isInstance,
2267 isVariadic,
2268 isSynthesized,
2269 isImplicitlyDeclared,
2270 isDefined,
2271 impControl,
2272 HasRelatedResultType);
2273
2274 getter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(), ArrayRef<SourceLocation>());
2275
2276 class_interface_decl->addDecl(getter);
2277 }
2278
2279 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
2280 {
2281 QualType result_type = ast->VoidTy;
2282
2283 const bool isInstance = true;
2284 const bool isVariadic = false;
2285 const bool isSynthesized = false;
2286 const bool isImplicitlyDeclared = true;
2287 const bool isDefined = false;
2288 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
2289 const bool HasRelatedResultType = false;
2290
2291 ObjCMethodDecl *setter = ObjCMethodDecl::Create(*ast,
2292 SourceLocation(),
2293 SourceLocation(),
2294 setter_sel,
2295 result_type,
2296 NULL,
2297 class_interface_decl,
2298 isInstance,
2299 isVariadic,
2300 isSynthesized,
2301 isImplicitlyDeclared,
2302 isDefined,
2303 impControl,
2304 HasRelatedResultType);
2305
2306 llvm::SmallVector<ParmVarDecl *, 1> params;
2307
2308 params.push_back (ParmVarDecl::Create (*ast,
2309 setter,
2310 SourceLocation(),
2311 SourceLocation(),
2312 NULL, // anonymous
2313 QualType::getFromOpaquePtr(property_opaque_type_to_access),
2314 NULL,
2315 SC_Auto,
2316 SC_Auto,
2317 NULL));
2318
2319 setter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
2320
2321 class_interface_decl->addDecl(setter);
2322 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002323
2324 return true;
Sean Callanan8a6a6ac2011-12-09 23:24:26 +00002325 }
Jim Inghame3ae82a2011-11-12 01:36:43 +00002326 }
2327 }
2328 }
Greg Clayton8cf05932010-07-22 18:30:50 +00002329 return false;
2330}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002331
Greg Clayton9e409562010-07-28 02:04:09 +00002332bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002333ClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
Greg Clayton9e409562010-07-28 02:04:09 +00002334{
2335 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2336
Sean Callanan78e37602011-01-27 04:42:51 +00002337 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton9e409562010-07-28 02:04:09 +00002338 if (class_type)
2339 {
Sean Callanan78e37602011-01-27 04:42:51 +00002340 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton9e409562010-07-28 02:04:09 +00002341
2342 if (objc_class_type)
2343 return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
2344 }
2345 return false;
2346}
2347
2348bool
2349ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
2350{
2351 while (class_interface_decl)
2352 {
2353 if (class_interface_decl->ivar_size() > 0)
2354 return true;
2355
2356 if (check_superclass)
2357 class_interface_decl = class_interface_decl->getSuperClass();
2358 else
2359 break;
2360 }
2361 return false;
2362}
Greg Clayton0fffff52010-09-24 05:15:53 +00002363
Greg Clayton1be10fc2010-09-29 01:12:09 +00002364ObjCMethodDecl *
Greg Clayton0fffff52010-09-24 05:15:53 +00002365ClangASTContext::AddMethodToObjCObjectType
2366(
Greg Clayton6beaaa62011-01-17 03:46:26 +00002367 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00002368 clang_type_t class_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00002369 const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
Greg Clayton1be10fc2010-09-29 01:12:09 +00002370 clang_type_t method_opaque_type,
Greg Clayton0fffff52010-09-24 05:15:53 +00002371 lldb::AccessType access
2372)
2373{
2374 if (class_opaque_type == NULL || method_opaque_type == NULL)
2375 return NULL;
2376
Greg Clayton6beaaa62011-01-17 03:46:26 +00002377 IdentifierTable *identifier_table = &ast->Idents;
Greg Clayton0fffff52010-09-24 05:15:53 +00002378
Greg Clayton6beaaa62011-01-17 03:46:26 +00002379 assert (ast != NULL);
Greg Clayton0fffff52010-09-24 05:15:53 +00002380 assert (identifier_table != NULL);
2381
2382 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
2383
Sean Callanan78e37602011-01-27 04:42:51 +00002384 const clang::Type *class_type = class_qual_type.getTypePtr();
Greg Clayton0fffff52010-09-24 05:15:53 +00002385 if (class_type == NULL)
2386 return NULL;
2387
Sean Callanan78e37602011-01-27 04:42:51 +00002388 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
Greg Clayton0fffff52010-09-24 05:15:53 +00002389
2390 if (objc_class_type == NULL)
2391 return NULL;
2392
2393 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2394
2395 if (class_interface_decl == NULL)
2396 return NULL;
Greg Clayton9e409562010-07-28 02:04:09 +00002397
Greg Clayton0fffff52010-09-24 05:15:53 +00002398 const char *selector_start = ::strchr (name, ' ');
2399 if (selector_start == NULL)
2400 return NULL;
2401
2402 selector_start++;
2403 if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
2404 return NULL;
2405 llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
2406
Greg Clayton450e3f32010-10-12 02:24:53 +00002407 size_t len = 0;
Greg Clayton0fffff52010-09-24 05:15:53 +00002408 const char *start;
Greg Clayton450e3f32010-10-12 02:24:53 +00002409 //printf ("name = '%s'\n", name);
2410
2411 unsigned num_selectors_with_args = 0;
2412 for (start = selector_start;
Greg Clayton0fffff52010-09-24 05:15:53 +00002413 start && *start != '\0' && *start != ']';
Greg Clayton450e3f32010-10-12 02:24:53 +00002414 start += len)
Greg Clayton0fffff52010-09-24 05:15:53 +00002415 {
Greg Clayton450e3f32010-10-12 02:24:53 +00002416 len = ::strcspn(start, ":]");
Greg Clayton90f90cd2010-10-27 04:01:14 +00002417 bool has_arg = (start[len] == ':');
2418 if (has_arg)
Greg Clayton450e3f32010-10-12 02:24:53 +00002419 ++num_selectors_with_args;
Greg Clayton0fffff52010-09-24 05:15:53 +00002420 selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
Greg Clayton90f90cd2010-10-27 04:01:14 +00002421 if (has_arg)
2422 len += 1;
Greg Clayton0fffff52010-09-24 05:15:53 +00002423 }
2424
2425
2426 if (selector_idents.size() == 0)
2427 return 0;
2428
Greg Clayton6beaaa62011-01-17 03:46:26 +00002429 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
Greg Clayton0fffff52010-09-24 05:15:53 +00002430 selector_idents.data());
2431
2432 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
2433
2434 // Populate the method decl with parameter decls
Sean Callanan78e37602011-01-27 04:42:51 +00002435 const clang::Type *method_type(method_qual_type.getTypePtr());
Greg Clayton0fffff52010-09-24 05:15:53 +00002436
2437 if (method_type == NULL)
2438 return NULL;
2439
Sean Callanan78e37602011-01-27 04:42:51 +00002440 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
Greg Clayton0fffff52010-09-24 05:15:53 +00002441
2442 if (!method_function_prototype)
2443 return NULL;
2444
2445
2446 bool is_variadic = false;
2447 bool is_synthesized = false;
2448 bool is_defined = false;
2449 ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
2450
2451 const unsigned num_args = method_function_prototype->getNumArgs();
2452
Greg Clayton6beaaa62011-01-17 03:46:26 +00002453 ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00002454 SourceLocation(), // beginLoc,
2455 SourceLocation(), // endLoc,
2456 method_selector,
2457 method_function_prototype->getResultType(),
2458 NULL, // TypeSourceInfo *ResultTInfo,
2459 GetDeclContextForType (class_opaque_type),
2460 name[0] == '-',
2461 is_variadic,
2462 is_synthesized,
Sean Callanan880e6802011-10-07 23:18:13 +00002463 true, // is_implicitly_declared
Greg Clayton0fffff52010-09-24 05:15:53 +00002464 is_defined,
2465 imp_control,
Sean Callanan880e6802011-10-07 23:18:13 +00002466 false /*has_related_result_type*/);
Greg Clayton0fffff52010-09-24 05:15:53 +00002467
2468
2469 if (objc_method_decl == NULL)
2470 return NULL;
2471
2472 if (num_args > 0)
2473 {
2474 llvm::SmallVector<ParmVarDecl *, 12> params;
2475
2476 for (int param_index = 0; param_index < num_args; ++param_index)
2477 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002478 params.push_back (ParmVarDecl::Create (*ast,
Greg Clayton0fffff52010-09-24 05:15:53 +00002479 objc_method_decl,
2480 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00002481 SourceLocation(),
Greg Clayton0fffff52010-09-24 05:15:53 +00002482 NULL, // anonymous
2483 method_function_prototype->getArgType(param_index),
2484 NULL,
2485 SC_Auto,
2486 SC_Auto,
2487 NULL));
2488 }
2489
Sean Callanan880e6802011-10-07 23:18:13 +00002490 objc_method_decl->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
Greg Clayton0fffff52010-09-24 05:15:53 +00002491 }
2492
2493 class_interface_decl->addDecl (objc_method_decl);
2494
Sean Callanan5e9e1992011-10-26 01:06:27 +00002495#ifdef LLDB_CONFIGURATION_DEBUG
2496 VerifyDecl(objc_method_decl);
2497#endif
Greg Clayton0fffff52010-09-24 05:15:53 +00002498
2499 return objc_method_decl;
2500}
2501
2502
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002503uint32_t
Greg Clayton73b472d2010-10-27 03:32:59 +00002504ClangASTContext::GetTypeInfo
2505(
2506 clang_type_t clang_type,
Greg Clayton6beaaa62011-01-17 03:46:26 +00002507 clang::ASTContext *ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002508 clang_type_t *pointee_or_element_clang_type
2509)
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002510{
2511 if (clang_type == NULL)
Greg Clayton73b472d2010-10-27 03:32:59 +00002512 return 0;
2513
2514 if (pointee_or_element_clang_type)
2515 *pointee_or_element_clang_type = NULL;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002516
2517 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2518
2519 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2520 switch (type_class)
2521 {
Sean Callanana2424172010-10-25 00:29:48 +00002522 case clang::Type::Builtin:
2523 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2524 {
Sean Callanana2424172010-10-25 00:29:48 +00002525 case clang::BuiltinType::ObjCId:
2526 case clang::BuiltinType::ObjCClass:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002527 if (ast && pointee_or_element_clang_type)
2528 *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Sean Callanana2424172010-10-25 00:29:48 +00002529 return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
Enrico Granataf9fa6ee2011-07-12 00:18:11 +00002530 break;
2531 case clang::BuiltinType::Bool:
2532 case clang::BuiltinType::Char_U:
2533 case clang::BuiltinType::UChar:
2534 case clang::BuiltinType::WChar_U:
2535 case clang::BuiltinType::Char16:
2536 case clang::BuiltinType::Char32:
2537 case clang::BuiltinType::UShort:
2538 case clang::BuiltinType::UInt:
2539 case clang::BuiltinType::ULong:
2540 case clang::BuiltinType::ULongLong:
2541 case clang::BuiltinType::UInt128:
2542 case clang::BuiltinType::Char_S:
2543 case clang::BuiltinType::SChar:
2544 case clang::BuiltinType::WChar_S:
2545 case clang::BuiltinType::Short:
2546 case clang::BuiltinType::Int:
2547 case clang::BuiltinType::Long:
2548 case clang::BuiltinType::LongLong:
2549 case clang::BuiltinType::Int128:
2550 case clang::BuiltinType::Float:
2551 case clang::BuiltinType::Double:
2552 case clang::BuiltinType::LongDouble:
2553 return eTypeIsBuiltIn | eTypeHasValue | eTypeIsScalar;
Greg Clayton73b472d2010-10-27 03:32:59 +00002554 default:
2555 break;
Sean Callanana2424172010-10-25 00:29:48 +00002556 }
2557 return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002558
2559 case clang::Type::BlockPointer:
2560 if (pointee_or_element_clang_type)
2561 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2562 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2563
Greg Clayton49462ea2011-01-15 02:52:14 +00002564 case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002565
2566 case clang::Type::ConstantArray:
2567 case clang::Type::DependentSizedArray:
2568 case clang::Type::IncompleteArray:
2569 case clang::Type::VariableArray:
2570 if (pointee_or_element_clang_type)
2571 *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2572 return eTypeHasChildren | eTypeIsArray;
2573
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002574 case clang::Type::DependentName: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002575 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
2576 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
2577 case clang::Type::Decltype: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002578
2579 case clang::Type::Enum:
2580 if (pointee_or_element_clang_type)
2581 *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2582 return eTypeIsEnumeration | eTypeHasValue;
2583
Sean Callanan912855f2011-08-11 23:56:13 +00002584 case clang::Type::Elaborated:
2585 return ClangASTContext::GetTypeInfo (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2586 ast,
2587 pointee_or_element_clang_type);
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002588 case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector;
2589 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
2590 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002591 case clang::Type::InjectedClassName: return 0;
Greg Clayton73b472d2010-10-27 03:32:59 +00002592
2593 case clang::Type::LValueReference:
2594 case clang::Type::RValueReference:
2595 if (pointee_or_element_clang_type)
2596 *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2597 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2598
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002599 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
Greg Clayton73b472d2010-10-27 03:32:59 +00002600
2601 case clang::Type::ObjCObjectPointer:
2602 if (pointee_or_element_clang_type)
2603 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2604 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2605
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002606 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2607 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
Greg Clayton73b472d2010-10-27 03:32:59 +00002608
2609 case clang::Type::Pointer:
2610 if (pointee_or_element_clang_type)
2611 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2612 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2613
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002614 case clang::Type::Record:
2615 if (qual_type->getAsCXXRecordDecl())
2616 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2617 else
2618 return eTypeHasChildren | eTypeIsStructUnion;
2619 break;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002620 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
2621 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
2622 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
Greg Clayton73b472d2010-10-27 03:32:59 +00002623
2624 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002625 return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00002626 ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00002627 pointee_or_element_clang_type);
2628
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002629 case clang::Type::TypeOfExpr: return 0;
2630 case clang::Type::TypeOf: return 0;
2631 case clang::Type::UnresolvedUsing: return 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00002632 case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector;
2633 default: return 0;
2634 }
2635 return 0;
2636}
2637
Greg Clayton9e409562010-07-28 02:04:09 +00002638
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002639#pragma mark Aggregate Types
2640
2641bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00002642ClangASTContext::IsAggregateType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002643{
2644 if (clang_type == NULL)
2645 return false;
2646
2647 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2648
Greg Clayton737b9322010-09-13 03:32:57 +00002649 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2650 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002651 {
Greg Claytone1a916a2010-07-21 22:12:05 +00002652 case clang::Type::IncompleteArray:
2653 case clang::Type::VariableArray:
2654 case clang::Type::ConstantArray:
2655 case clang::Type::ExtVector:
2656 case clang::Type::Vector:
2657 case clang::Type::Record:
Greg Clayton9e409562010-07-28 02:04:09 +00002658 case clang::Type::ObjCObject:
2659 case clang::Type::ObjCInterface:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002660 return true;
Sean Callanan912855f2011-08-11 23:56:13 +00002661 case clang::Type::Elaborated:
2662 return ClangASTContext::IsAggregateType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Claytone1a916a2010-07-21 22:12:05 +00002663 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00002664 return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002665
2666 default:
2667 break;
2668 }
2669 // The clang type does have a value
2670 return false;
2671}
2672
2673uint32_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00002674ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002675{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002676 if (clang_type == NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002677 return 0;
2678
2679 uint32_t num_children = 0;
Greg Clayton6beaaa62011-01-17 03:46:26 +00002680 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00002681 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2682 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002683 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002684 case clang::Type::Builtin:
2685 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2686 {
Greg Clayton73b472d2010-10-27 03:32:59 +00002687 case clang::BuiltinType::ObjCId: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002688 case clang::BuiltinType::ObjCClass: // child is Class
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002689 num_children = 1;
Greg Clayton73b472d2010-10-27 03:32:59 +00002690 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002691
2692 default:
2693 break;
2694 }
2695 break;
Greg Clayton54979cd2010-12-15 05:08:08 +00002696
Greg Clayton49462ea2011-01-15 02:52:14 +00002697 case clang::Type::Complex: return 0;
Greg Clayton54979cd2010-12-15 05:08:08 +00002698
Greg Claytone1a916a2010-07-21 22:12:05 +00002699 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00002700 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002701 {
2702 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
2703 const RecordDecl *record_decl = record_type->getDecl();
2704 assert(record_decl);
2705 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2706 if (cxx_record_decl)
2707 {
2708 if (omit_empty_base_classes)
2709 {
2710 // Check each base classes to see if it or any of its
2711 // base classes contain any fields. This can help
2712 // limit the noise in variable views by not having to
2713 // show base classes that contain no members.
2714 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2715 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2716 base_class != base_class_end;
2717 ++base_class)
2718 {
2719 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2720
2721 // Skip empty base classes
2722 if (RecordHasFields(base_class_decl) == false)
2723 continue;
2724
2725 num_children++;
2726 }
2727 }
2728 else
2729 {
2730 // Include all base classes
2731 num_children += cxx_record_decl->getNumBases();
2732 }
2733
2734 }
2735 RecordDecl::field_iterator field, field_end;
2736 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
2737 ++num_children;
2738 }
2739 break;
2740
Greg Clayton9e409562010-07-28 02:04:09 +00002741 case clang::Type::ObjCObject:
2742 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00002743 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00002744 {
Sean Callanan78e37602011-01-27 04:42:51 +00002745 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00002746 assert (objc_class_type);
2747 if (objc_class_type)
2748 {
2749 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2750
2751 if (class_interface_decl)
2752 {
2753
2754 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
2755 if (superclass_interface_decl)
2756 {
2757 if (omit_empty_base_classes)
2758 {
2759 if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
2760 ++num_children;
2761 }
2762 else
2763 ++num_children;
2764 }
2765
2766 num_children += class_interface_decl->ivar_size();
2767 }
2768 }
2769 }
2770 break;
2771
2772 case clang::Type::ObjCObjectPointer:
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002773 {
Sean Callanan78e37602011-01-27 04:42:51 +00002774 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002775 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00002776 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2777 pointee_type.getAsOpaquePtr(),
Greg Claytonb0b9fe62010-08-03 00:35:52 +00002778 omit_empty_base_classes);
2779 // If this type points to a simple type, then it has 1 child
2780 if (num_pointee_children == 0)
2781 num_children = 1;
2782 else
2783 num_children = num_pointee_children;
2784 }
2785 break;
Greg Clayton9e409562010-07-28 02:04:09 +00002786
Greg Claytone1a916a2010-07-21 22:12:05 +00002787 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002788 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
2789 break;
2790
Greg Claytone1a916a2010-07-21 22:12:05 +00002791 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002792 {
Sean Callanan78e37602011-01-27 04:42:51 +00002793 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Greg Clayton54979cd2010-12-15 05:08:08 +00002794 QualType pointee_type (pointer_type->getPointeeType());
Greg Clayton6beaaa62011-01-17 03:46:26 +00002795 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2796 pointee_type.getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00002797 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002798 if (num_pointee_children == 0)
Greg Clayton54979cd2010-12-15 05:08:08 +00002799 {
2800 // We have a pointer to a pointee type that claims it has no children.
2801 // We will want to look at
2802 num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
2803 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002804 else
2805 num_children = num_pointee_children;
2806 }
2807 break;
2808
Greg Clayton73b472d2010-10-27 03:32:59 +00002809 case clang::Type::LValueReference:
2810 case clang::Type::RValueReference:
2811 {
Sean Callanan78e37602011-01-27 04:42:51 +00002812 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00002813 QualType pointee_type = reference_type->getPointeeType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00002814 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2815 pointee_type.getAsOpaquePtr(),
Greg Clayton73b472d2010-10-27 03:32:59 +00002816 omit_empty_base_classes);
2817 // If this type points to a simple type, then it has 1 child
2818 if (num_pointee_children == 0)
2819 num_children = 1;
2820 else
2821 num_children = num_pointee_children;
2822 }
2823 break;
2824
2825
Greg Claytone1a916a2010-07-21 22:12:05 +00002826 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00002827 num_children = ClangASTContext::GetNumChildren (ast,
2828 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2829 omit_empty_base_classes);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002830 break;
Sean Callanan912855f2011-08-11 23:56:13 +00002831
2832 case clang::Type::Elaborated:
2833 num_children = ClangASTContext::GetNumChildren (ast,
2834 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2835 omit_empty_base_classes);
2836 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002837
2838 default:
2839 break;
2840 }
2841 return num_children;
2842}
2843
Greg Claytonbf2331c2011-09-09 23:04:00 +00002844uint32_t
2845ClangASTContext::GetNumDirectBaseClasses (clang::ASTContext *ast, clang_type_t clang_type)
2846{
2847 if (clang_type == NULL)
2848 return 0;
2849
2850 uint32_t count = 0;
2851 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2852 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2853 switch (type_class)
2854 {
2855 case clang::Type::Record:
2856 if (GetCompleteQualType (ast, qual_type))
2857 {
2858 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2859 if (cxx_record_decl)
2860 count = cxx_record_decl->getNumBases();
2861 }
2862 break;
2863
2864 case clang::Type::ObjCObject:
2865 case clang::Type::ObjCInterface:
2866 if (GetCompleteQualType (ast, qual_type))
2867 {
2868 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
2869 if (objc_class_type)
2870 {
2871 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2872
2873 if (class_interface_decl && class_interface_decl->getSuperClass())
2874 count = 1;
2875 }
2876 }
2877 break;
2878
2879
2880 case clang::Type::Typedef:
2881 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2882 break;
2883
2884 case clang::Type::Elaborated:
2885 count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2886 break;
2887
2888 default:
2889 break;
2890 }
2891 return count;
2892}
2893
2894uint32_t
2895ClangASTContext::GetNumVirtualBaseClasses (clang::ASTContext *ast,
2896 clang_type_t clang_type)
2897{
2898 if (clang_type == NULL)
2899 return 0;
2900
2901 uint32_t count = 0;
2902 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2903 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2904 switch (type_class)
2905 {
2906 case clang::Type::Record:
2907 if (GetCompleteQualType (ast, qual_type))
2908 {
2909 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2910 if (cxx_record_decl)
2911 count = cxx_record_decl->getNumVBases();
2912 }
2913 break;
2914
2915 case clang::Type::Typedef:
2916 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2917 break;
2918
2919 case clang::Type::Elaborated:
2920 count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2921 break;
2922
2923 default:
2924 break;
2925 }
2926 return count;
2927}
2928
2929uint32_t
2930ClangASTContext::GetNumFields (clang::ASTContext *ast, clang_type_t clang_type)
2931{
2932 if (clang_type == NULL)
2933 return 0;
2934
2935 uint32_t count = 0;
2936 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2937 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2938 switch (type_class)
2939 {
2940 case clang::Type::Record:
2941 if (GetCompleteQualType (ast, qual_type))
2942 {
2943 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
2944 if (record_type)
2945 {
2946 RecordDecl *record_decl = record_type->getDecl();
2947 if (record_decl)
2948 {
2949 uint32_t field_idx = 0;
2950 RecordDecl::field_iterator field, field_end;
2951 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
2952 ++field_idx;
2953 count = field_idx;
2954 }
2955 }
2956 }
2957 break;
2958
2959 case clang::Type::Typedef:
2960 count = ClangASTContext::GetNumFields (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2961 break;
2962
2963 case clang::Type::Elaborated:
2964 count = ClangASTContext::GetNumFields (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2965 break;
2966
Greg Claytonda7bc7d2011-11-13 06:57:31 +00002967 case clang::Type::ObjCObject:
2968 case clang::Type::ObjCInterface:
2969 if (GetCompleteQualType (ast, qual_type))
2970 {
2971 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
2972 if (objc_class_type)
2973 {
2974 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2975
2976 if (class_interface_decl)
2977 count = class_interface_decl->ivar_size();
2978 }
2979 }
2980 break;
2981
Greg Claytonbf2331c2011-09-09 23:04:00 +00002982 default:
2983 break;
2984 }
2985 return count;
2986}
2987
2988clang_type_t
2989ClangASTContext::GetDirectBaseClassAtIndex (clang::ASTContext *ast,
2990 clang_type_t clang_type,
2991 uint32_t idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00002992 uint32_t *bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00002993{
2994 if (clang_type == NULL)
2995 return 0;
2996
2997 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2998 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2999 switch (type_class)
3000 {
3001 case clang::Type::Record:
3002 if (GetCompleteQualType (ast, qual_type))
3003 {
3004 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3005 if (cxx_record_decl)
3006 {
3007 uint32_t curr_idx = 0;
3008 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3009 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3010 base_class != base_class_end;
3011 ++base_class, ++curr_idx)
3012 {
3013 if (curr_idx == idx)
3014 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003015 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003016 {
3017 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3018 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3019// if (base_class->isVirtual())
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003020// *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003021// else
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003022 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003023 }
3024 return base_class->getType().getAsOpaquePtr();
3025 }
3026 }
3027 }
3028 }
3029 break;
3030
3031 case clang::Type::ObjCObject:
3032 case clang::Type::ObjCInterface:
3033 if (idx == 0 && GetCompleteQualType (ast, qual_type))
3034 {
3035 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
3036 if (objc_class_type)
3037 {
3038 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3039
3040 if (class_interface_decl)
3041 {
3042 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3043 if (superclass_interface_decl)
3044 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003045 if (bit_offset_ptr)
3046 *bit_offset_ptr = 0;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003047 return ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr();
3048 }
3049 }
3050 }
3051 }
3052 break;
3053
3054
3055 case clang::Type::Typedef:
3056 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3057 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3058 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003059 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003060
3061 case clang::Type::Elaborated:
3062 return ClangASTContext::GetDirectBaseClassAtIndex (ast,
3063 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3064 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003065 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003066
3067 default:
3068 break;
3069 }
3070 return NULL;
3071}
3072
3073clang_type_t
3074ClangASTContext::GetVirtualBaseClassAtIndex (clang::ASTContext *ast,
3075 clang_type_t clang_type,
3076 uint32_t idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003077 uint32_t *bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003078{
3079 if (clang_type == NULL)
3080 return 0;
3081
3082 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3083 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3084 switch (type_class)
3085 {
3086 case clang::Type::Record:
3087 if (GetCompleteQualType (ast, qual_type))
3088 {
3089 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3090 if (cxx_record_decl)
3091 {
3092 uint32_t curr_idx = 0;
3093 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3094 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
3095 base_class != base_class_end;
3096 ++base_class, ++curr_idx)
3097 {
3098 if (curr_idx == idx)
3099 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003100 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003101 {
3102 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
3103 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003104 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Greg Claytonbf2331c2011-09-09 23:04:00 +00003105
3106 }
3107 return base_class->getType().getAsOpaquePtr();
3108 }
3109 }
3110 }
3111 }
3112 break;
3113
3114 case clang::Type::Typedef:
3115 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3116 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3117 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003118 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003119
3120 case clang::Type::Elaborated:
3121 return ClangASTContext::GetVirtualBaseClassAtIndex (ast,
3122 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3123 idx,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003124 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003125
3126 default:
3127 break;
3128 }
3129 return NULL;
3130}
3131
3132clang_type_t
3133ClangASTContext::GetFieldAtIndex (clang::ASTContext *ast,
3134 clang_type_t clang_type,
3135 uint32_t idx,
3136 std::string& name,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003137 uint32_t *bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003138{
3139 if (clang_type == NULL)
3140 return 0;
3141
3142 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3143 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3144 switch (type_class)
3145 {
3146 case clang::Type::Record:
3147 if (GetCompleteQualType (ast, qual_type))
3148 {
3149 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3150 const RecordDecl *record_decl = record_type->getDecl();
3151 uint32_t field_idx = 0;
3152 RecordDecl::field_iterator field, field_end;
3153 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
3154 {
3155 if (idx == field_idx)
3156 {
3157 // Print the member type if requested
3158 // Print the member name and equal sign
3159 name.assign(field->getNameAsString());
3160
3161 // Figure out the type byte size (field_type_info.first) and
3162 // alignment (field_type_info.second) from the AST context.
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003163 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003164 {
3165 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003166 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003167 }
3168
3169 return field->getType().getAsOpaquePtr();
3170 }
3171 }
3172 }
3173 break;
3174
3175 case clang::Type::ObjCObject:
3176 case clang::Type::ObjCInterface:
3177 if (GetCompleteQualType (ast, qual_type))
3178 {
3179 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3180 assert (objc_class_type);
3181 if (objc_class_type)
3182 {
3183 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3184
3185 if (class_interface_decl)
3186 {
3187 if (idx < (class_interface_decl->ivar_size()))
3188 {
3189 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3190 uint32_t ivar_idx = 0;
3191
3192 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
3193 {
3194 if (ivar_idx == idx)
3195 {
3196 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3197
3198 QualType ivar_qual_type(ivar_decl->getType());
3199
3200 name.assign(ivar_decl->getNameAsString());
3201
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003202 if (bit_offset_ptr)
Greg Claytonbf2331c2011-09-09 23:04:00 +00003203 {
3204 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003205 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003206 }
3207
3208 return ivar_qual_type.getAsOpaquePtr();
3209 }
3210 }
3211 }
3212 }
3213 }
3214 }
3215 break;
3216
3217
3218 case clang::Type::Typedef:
3219 return ClangASTContext::GetFieldAtIndex (ast,
3220 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3221 idx,
3222 name,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003223 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003224
3225 case clang::Type::Elaborated:
3226 return ClangASTContext::GetFieldAtIndex (ast,
3227 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3228 idx,
3229 name,
Greg Claytonda7bc7d2011-11-13 06:57:31 +00003230 bit_offset_ptr);
Greg Claytonbf2331c2011-09-09 23:04:00 +00003231
3232 default:
3233 break;
3234 }
3235 return NULL;
3236}
3237
3238
Greg Clayton54979cd2010-12-15 05:08:08 +00003239// If a pointer to a pointee type (the clang_type arg) says that it has no
3240// children, then we either need to trust it, or override it and return a
3241// different result. For example, an "int *" has one child that is an integer,
3242// but a function pointer doesn't have any children. Likewise if a Record type
3243// claims it has no children, then there really is nothing to show.
3244uint32_t
3245ClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
3246{
3247 if (clang_type == NULL)
3248 return 0;
3249
3250 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
3251 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3252 switch (type_class)
3253 {
Greg Clayton97a43712011-01-08 22:26:47 +00003254 case clang::Type::Builtin:
3255 switch (cast<clang::BuiltinType>(qual_type)->getKind())
3256 {
Greg Clayton7260f622011-04-18 08:33:37 +00003257 case clang::BuiltinType::UnknownAny:
Greg Clayton97a43712011-01-08 22:26:47 +00003258 case clang::BuiltinType::Void:
3259 case clang::BuiltinType::NullPtr:
3260 return 0;
3261 case clang::BuiltinType::Bool:
3262 case clang::BuiltinType::Char_U:
3263 case clang::BuiltinType::UChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00003264 case clang::BuiltinType::WChar_U:
Greg Clayton97a43712011-01-08 22:26:47 +00003265 case clang::BuiltinType::Char16:
3266 case clang::BuiltinType::Char32:
3267 case clang::BuiltinType::UShort:
3268 case clang::BuiltinType::UInt:
3269 case clang::BuiltinType::ULong:
3270 case clang::BuiltinType::ULongLong:
3271 case clang::BuiltinType::UInt128:
3272 case clang::BuiltinType::Char_S:
3273 case clang::BuiltinType::SChar:
Sean Callanan2c777c42011-01-18 23:32:05 +00003274 case clang::BuiltinType::WChar_S:
Greg Clayton97a43712011-01-08 22:26:47 +00003275 case clang::BuiltinType::Short:
3276 case clang::BuiltinType::Int:
3277 case clang::BuiltinType::Long:
3278 case clang::BuiltinType::LongLong:
3279 case clang::BuiltinType::Int128:
3280 case clang::BuiltinType::Float:
3281 case clang::BuiltinType::Double:
3282 case clang::BuiltinType::LongDouble:
3283 case clang::BuiltinType::Dependent:
3284 case clang::BuiltinType::Overload:
Greg Clayton97a43712011-01-08 22:26:47 +00003285 case clang::BuiltinType::ObjCId:
3286 case clang::BuiltinType::ObjCClass:
3287 case clang::BuiltinType::ObjCSel:
Sean Callanand12cf8bb2011-05-15 22:34:38 +00003288 case clang::BuiltinType::BoundMember:
Greg Claytonf0705c82011-10-22 03:33:13 +00003289 case clang::BuiltinType::Half:
3290 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytoned3ae702011-11-09 19:04:58 +00003291 case clang::BuiltinType::PseudoObject:
Greg Clayton97a43712011-01-08 22:26:47 +00003292 return 1;
3293 }
3294 break;
3295
Greg Clayton49462ea2011-01-15 02:52:14 +00003296 case clang::Type::Complex: return 1;
Greg Clayton54979cd2010-12-15 05:08:08 +00003297 case clang::Type::Pointer: return 1;
3298 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
3299 case clang::Type::LValueReference: return 1;
3300 case clang::Type::RValueReference: return 1;
3301 case clang::Type::MemberPointer: return 0;
3302 case clang::Type::ConstantArray: return 0;
3303 case clang::Type::IncompleteArray: return 0;
3304 case clang::Type::VariableArray: return 0;
3305 case clang::Type::DependentSizedArray: return 0;
3306 case clang::Type::DependentSizedExtVector: return 0;
3307 case clang::Type::Vector: return 0;
3308 case clang::Type::ExtVector: return 0;
3309 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
3310 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
3311 case clang::Type::UnresolvedUsing: return 0;
3312 case clang::Type::Paren: return 0;
3313 case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00003314 case clang::Type::Elaborated: return ClangASTContext::GetNumPointeeChildren (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton54979cd2010-12-15 05:08:08 +00003315 case clang::Type::TypeOfExpr: return 0;
3316 case clang::Type::TypeOf: return 0;
3317 case clang::Type::Decltype: return 0;
3318 case clang::Type::Record: return 0;
3319 case clang::Type::Enum: return 1;
Greg Clayton54979cd2010-12-15 05:08:08 +00003320 case clang::Type::TemplateTypeParm: return 1;
3321 case clang::Type::SubstTemplateTypeParm: return 1;
3322 case clang::Type::TemplateSpecialization: return 1;
3323 case clang::Type::InjectedClassName: return 0;
3324 case clang::Type::DependentName: return 1;
3325 case clang::Type::DependentTemplateSpecialization: return 1;
3326 case clang::Type::ObjCObject: return 0;
3327 case clang::Type::ObjCInterface: return 0;
3328 case clang::Type::ObjCObjectPointer: return 1;
3329 default:
3330 break;
3331 }
3332 return 0;
3333}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003334
Greg Clayton1be10fc2010-09-29 01:12:09 +00003335clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003336ClangASTContext::GetChildClangTypeAtIndex
3337(
Jim Inghamd555bac2011-06-24 22:03:24 +00003338 ExecutionContext *exe_ctx,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003339 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003340 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003341 uint32_t idx,
3342 bool transparent_pointers,
3343 bool omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003344 bool ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003345 std::string& child_name,
3346 uint32_t &child_byte_size,
3347 int32_t &child_byte_offset,
3348 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003349 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003350 bool &child_is_base_class,
3351 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003352)
3353{
3354 if (parent_clang_type)
3355
Jim Inghamd555bac2011-06-24 22:03:24 +00003356 return GetChildClangTypeAtIndex (exe_ctx,
3357 getASTContext(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003358 parent_name,
3359 parent_clang_type,
3360 idx,
3361 transparent_pointers,
3362 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003363 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003364 child_name,
3365 child_byte_size,
3366 child_byte_offset,
3367 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003368 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003369 child_is_base_class,
3370 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003371 return NULL;
3372}
3373
Greg Clayton1be10fc2010-09-29 01:12:09 +00003374clang_type_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003375ClangASTContext::GetChildClangTypeAtIndex
3376(
Jim Inghamd555bac2011-06-24 22:03:24 +00003377 ExecutionContext *exe_ctx,
Greg Clayton6beaaa62011-01-17 03:46:26 +00003378 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003379 const char *parent_name,
Greg Clayton1be10fc2010-09-29 01:12:09 +00003380 clang_type_t parent_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003381 uint32_t idx,
3382 bool transparent_pointers,
3383 bool omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003384 bool ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003385 std::string& child_name,
3386 uint32_t &child_byte_size,
3387 int32_t &child_byte_offset,
3388 uint32_t &child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003389 uint32_t &child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003390 bool &child_is_base_class,
3391 bool &child_is_deref_of_parent
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003392)
3393{
3394 if (parent_clang_type == NULL)
3395 return NULL;
3396
Greg Clayton6beaaa62011-01-17 03:46:26 +00003397 if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003398 {
3399 uint32_t bit_offset;
3400 child_bitfield_bit_size = 0;
3401 child_bitfield_bit_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003402 child_is_base_class = false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003403 QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00003404 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
3405 switch (parent_type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003406 {
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003407 case clang::Type::Builtin:
3408 switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
3409 {
3410 case clang::BuiltinType::ObjCId:
3411 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00003412 child_name = "isa";
Greg Clayton6beaaa62011-01-17 03:46:26 +00003413 child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
3414 return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003415
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003416 default:
3417 break;
3418 }
3419 break;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003420
Greg Claytone1a916a2010-07-21 22:12:05 +00003421 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00003422 if (GetCompleteQualType (ast, parent_qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003423 {
3424 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
3425 const RecordDecl *record_decl = record_type->getDecl();
3426 assert(record_decl);
Greg Clayton6beaaa62011-01-17 03:46:26 +00003427 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003428 uint32_t child_idx = 0;
3429
3430 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3431 if (cxx_record_decl)
3432 {
3433 // We might have base classes to print out first
3434 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3435 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3436 base_class != base_class_end;
3437 ++base_class)
3438 {
3439 const CXXRecordDecl *base_class_decl = NULL;
3440
3441 // Skip empty base classes
3442 if (omit_empty_base_classes)
3443 {
3444 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3445 if (RecordHasFields(base_class_decl) == false)
3446 continue;
3447 }
3448
3449 if (idx == child_idx)
3450 {
3451 if (base_class_decl == NULL)
3452 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3453
3454
3455 if (base_class->isVirtual())
Greg Clayton6ed95942011-01-22 07:12:45 +00003456 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003457 else
Greg Clayton6ed95942011-01-22 07:12:45 +00003458 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003459
3460 // Base classes should be a multiple of 8 bits in size
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003461 child_byte_offset = bit_offset/8;
Greg Claytone3055942011-06-30 02:28:26 +00003462
3463 child_name = ClangASTType::GetTypeNameForQualType(base_class->getType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003464
Greg Clayton6beaaa62011-01-17 03:46:26 +00003465 uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003466
Jim Inghamf46b3382011-04-15 23:42:06 +00003467 // Base classes bit sizes should be a multiple of 8 bits in size
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003468 assert (clang_type_info_bit_size % 8 == 0);
3469 child_byte_size = clang_type_info_bit_size / 8;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003470 child_is_base_class = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003471 return base_class->getType().getAsOpaquePtr();
3472 }
3473 // We don't increment the child index in the for loop since we might
3474 // be skipping empty base classes
3475 ++child_idx;
3476 }
3477 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003478 // Make sure index is in range...
3479 uint32_t field_idx = 0;
3480 RecordDecl::field_iterator field, field_end;
3481 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
3482 {
3483 if (idx == child_idx)
3484 {
3485 // Print the member type if requested
3486 // Print the member name and equal sign
3487 child_name.assign(field->getNameAsString().c_str());
3488
3489 // Figure out the type byte size (field_type_info.first) and
3490 // alignment (field_type_info.second) from the AST context.
Greg Clayton6beaaa62011-01-17 03:46:26 +00003491 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
Greg Claytonc982c762010-07-09 20:39:50 +00003492 assert(field_idx < record_layout.getFieldCount());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003493
3494 child_byte_size = field_type_info.first / 8;
3495
3496 // Figure out the field offset within the current struct/union/class type
3497 bit_offset = record_layout.getFieldOffset (field_idx);
3498 child_byte_offset = bit_offset / 8;
Greg Clayton6beaaa62011-01-17 03:46:26 +00003499 if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003500 child_bitfield_bit_offset = bit_offset % 8;
3501
3502 return field->getType().getAsOpaquePtr();
3503 }
3504 }
3505 }
3506 break;
3507
Greg Clayton9e409562010-07-28 02:04:09 +00003508 case clang::Type::ObjCObject:
3509 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00003510 if (GetCompleteQualType (ast, parent_qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00003511 {
Sean Callanan78e37602011-01-27 04:42:51 +00003512 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003513 assert (objc_class_type);
3514 if (objc_class_type)
3515 {
3516 uint32_t child_idx = 0;
3517 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3518
3519 if (class_interface_decl)
3520 {
3521
Greg Clayton6beaaa62011-01-17 03:46:26 +00003522 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
Greg Clayton9e409562010-07-28 02:04:09 +00003523 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3524 if (superclass_interface_decl)
3525 {
3526 if (omit_empty_base_classes)
3527 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003528 if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
Greg Clayton9e409562010-07-28 02:04:09 +00003529 {
3530 if (idx == 0)
3531 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003532 QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
Greg Clayton9e409562010-07-28 02:04:09 +00003533
3534
3535 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
3536
Greg Clayton6beaaa62011-01-17 03:46:26 +00003537 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003538
3539 child_byte_size = ivar_type_info.first / 8;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003540 child_byte_offset = 0;
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003541 child_is_base_class = true;
Greg Clayton9e409562010-07-28 02:04:09 +00003542
3543 return ivar_qual_type.getAsOpaquePtr();
3544 }
3545
3546 ++child_idx;
3547 }
3548 }
3549 else
3550 ++child_idx;
3551 }
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003552
3553 const uint32_t superclass_idx = child_idx;
Greg Clayton9e409562010-07-28 02:04:09 +00003554
3555 if (idx < (child_idx + class_interface_decl->ivar_size()))
3556 {
3557 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3558
3559 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
3560 {
3561 if (child_idx == idx)
3562 {
Jim Inghamf80bc3f2011-12-08 02:53:10 +00003563 ObjCIvarDecl* ivar_decl = *ivar_pos;
Greg Clayton9e409562010-07-28 02:04:09 +00003564
3565 QualType ivar_qual_type(ivar_decl->getType());
3566
3567 child_name.assign(ivar_decl->getNameAsString().c_str());
3568
Greg Clayton6beaaa62011-01-17 03:46:26 +00003569 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00003570
3571 child_byte_size = ivar_type_info.first / 8;
3572
3573 // Figure out the field offset within the current struct/union/class type
Jim Inghamd555bac2011-06-24 22:03:24 +00003574 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
3575 // that doesn't account for the space taken up by unbacked properties, or from
3576 // the changing size of base classes that are newer than this class.
3577 // So if we have a process around that we can ask about this object, do so.
3578 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
Greg Claytonc14ee322011-09-22 04:58:26 +00003579 Process *process = NULL;
3580 if (exe_ctx)
3581 process = exe_ctx->GetProcessPtr();
3582 if (process)
Jim Inghamd555bac2011-06-24 22:03:24 +00003583 {
Greg Claytonc14ee322011-09-22 04:58:26 +00003584 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
Jim Inghamd555bac2011-06-24 22:03:24 +00003585 if (objc_runtime != NULL)
3586 {
Enrico Granata6f3533f2011-07-29 19:53:35 +00003587 ClangASTType parent_ast_type (ast, parent_qual_type.getAsOpaquePtr());
Jim Inghamd555bac2011-06-24 22:03:24 +00003588 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
3589 }
3590 }
3591
Jim Inghamf80bc3f2011-12-08 02:53:10 +00003592 // Setting this to UINT32_MAX to make sure we don't compute it twice...
3593 bit_offset = UINT32_MAX;
3594
Jim Inghamd555bac2011-06-24 22:03:24 +00003595 if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
3596 {
3597 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
3598 child_byte_offset = bit_offset / 8;
3599 }
Jim Inghamf80bc3f2011-12-08 02:53:10 +00003600
3601 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
3602 // of a bitfield within its containing object. So regardless of where we get the byte
3603 // offset from, we still need to get the bit offset for bitfields from the layout.
3604
3605 if (ClangASTContext::FieldIsBitfield (ast, ivar_decl, child_bitfield_bit_size))
3606 {
3607 if (bit_offset == UINT32_MAX)
3608 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
3609
3610 child_bitfield_bit_offset = bit_offset % 8;
3611 }
Greg Clayton9e409562010-07-28 02:04:09 +00003612 return ivar_qual_type.getAsOpaquePtr();
3613 }
3614 ++child_idx;
3615 }
3616 }
3617 }
3618 }
3619 }
3620 break;
3621
3622 case clang::Type::ObjCObjectPointer:
3623 {
Sean Callanan78e37602011-01-27 04:42:51 +00003624 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003625 QualType pointee_type = pointer_type->getPointeeType();
3626
3627 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3628 {
Greg Claytone221f822011-01-21 01:59:00 +00003629 child_is_deref_of_parent = false;
3630 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00003631 return GetChildClangTypeAtIndex (exe_ctx,
3632 ast,
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003633 parent_name,
3634 pointer_type->getPointeeType().getAsOpaquePtr(),
3635 idx,
3636 transparent_pointers,
3637 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003638 ignore_array_bounds,
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003639 child_name,
3640 child_byte_size,
3641 child_byte_offset,
3642 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003643 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003644 child_is_base_class,
3645 tmp_child_is_deref_of_parent);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003646 }
3647 else
3648 {
Greg Claytone221f822011-01-21 01:59:00 +00003649 child_is_deref_of_parent = true;
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003650 if (parent_name)
3651 {
3652 child_name.assign(1, '*');
3653 child_name += parent_name;
3654 }
3655
3656 // We have a pointer to an simple type
3657 if (idx == 0)
3658 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003659 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Claytonb0b9fe62010-08-03 00:35:52 +00003660 assert(clang_type_info.first % 8 == 0);
3661 child_byte_size = clang_type_info.first / 8;
3662 child_byte_offset = 0;
3663 return pointee_type.getAsOpaquePtr();
3664 }
3665 }
Greg Clayton9e409562010-07-28 02:04:09 +00003666 }
3667 break;
3668
Greg Claytone1a916a2010-07-21 22:12:05 +00003669 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003670 {
3671 const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
3672 const uint64_t element_count = array->getSize().getLimitedValue();
3673
Greg Claytondaf515f2011-07-09 20:12:33 +00003674 if (ignore_array_bounds || idx < element_count)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003675 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003676 if (GetCompleteQualType (ast, array->getElementType()))
3677 {
3678 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003679
Greg Clayton6beaaa62011-01-17 03:46:26 +00003680 char element_name[64];
3681 ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003682
Greg Clayton6beaaa62011-01-17 03:46:26 +00003683 child_name.assign(element_name);
3684 assert(field_type_info.first % 8 == 0);
3685 child_byte_size = field_type_info.first / 8;
Greg Claytondaf515f2011-07-09 20:12:33 +00003686 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
Greg Clayton6beaaa62011-01-17 03:46:26 +00003687 return array->getElementType().getAsOpaquePtr();
3688 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003689 }
3690 }
3691 break;
3692
Greg Claytone1a916a2010-07-21 22:12:05 +00003693 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003694 {
Sean Callanan78e37602011-01-27 04:42:51 +00003695 const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003696 QualType pointee_type = pointer_type->getPointeeType();
Greg Clayton97a43712011-01-08 22:26:47 +00003697
3698 // Don't dereference "void *" pointers
3699 if (pointee_type->isVoidType())
3700 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003701
3702 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3703 {
Greg Claytone221f822011-01-21 01:59:00 +00003704 child_is_deref_of_parent = false;
3705 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00003706 return GetChildClangTypeAtIndex (exe_ctx,
3707 ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003708 parent_name,
3709 pointer_type->getPointeeType().getAsOpaquePtr(),
3710 idx,
3711 transparent_pointers,
3712 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003713 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003714 child_name,
3715 child_byte_size,
3716 child_byte_offset,
3717 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003718 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003719 child_is_base_class,
3720 tmp_child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003721 }
3722 else
3723 {
Greg Claytone221f822011-01-21 01:59:00 +00003724 child_is_deref_of_parent = true;
3725
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003726 if (parent_name)
3727 {
3728 child_name.assign(1, '*');
3729 child_name += parent_name;
3730 }
3731
3732 // We have a pointer to an simple type
3733 if (idx == 0)
3734 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003735 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003736 assert(clang_type_info.first % 8 == 0);
3737 child_byte_size = clang_type_info.first / 8;
3738 child_byte_offset = 0;
3739 return pointee_type.getAsOpaquePtr();
3740 }
3741 }
3742 }
3743 break;
3744
Greg Clayton73b472d2010-10-27 03:32:59 +00003745 case clang::Type::LValueReference:
3746 case clang::Type::RValueReference:
3747 {
Sean Callanan78e37602011-01-27 04:42:51 +00003748 const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
Greg Clayton73b472d2010-10-27 03:32:59 +00003749 QualType pointee_type(reference_type->getPointeeType());
3750 clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
3751 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
3752 {
Greg Claytone221f822011-01-21 01:59:00 +00003753 child_is_deref_of_parent = false;
3754 bool tmp_child_is_deref_of_parent = false;
Jim Inghamd555bac2011-06-24 22:03:24 +00003755 return GetChildClangTypeAtIndex (exe_ctx,
3756 ast,
Greg Clayton73b472d2010-10-27 03:32:59 +00003757 parent_name,
3758 pointee_clang_type,
3759 idx,
3760 transparent_pointers,
3761 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003762 ignore_array_bounds,
Greg Clayton73b472d2010-10-27 03:32:59 +00003763 child_name,
3764 child_byte_size,
3765 child_byte_offset,
3766 child_bitfield_bit_size,
3767 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003768 child_is_base_class,
3769 tmp_child_is_deref_of_parent);
Greg Clayton73b472d2010-10-27 03:32:59 +00003770 }
3771 else
3772 {
3773 if (parent_name)
3774 {
3775 child_name.assign(1, '&');
3776 child_name += parent_name;
3777 }
3778
3779 // We have a pointer to an simple type
3780 if (idx == 0)
3781 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003782 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Greg Clayton73b472d2010-10-27 03:32:59 +00003783 assert(clang_type_info.first % 8 == 0);
3784 child_byte_size = clang_type_info.first / 8;
3785 child_byte_offset = 0;
3786 return pointee_type.getAsOpaquePtr();
3787 }
3788 }
3789 }
3790 break;
3791
Greg Claytone1a916a2010-07-21 22:12:05 +00003792 case clang::Type::Typedef:
Jim Inghamd555bac2011-06-24 22:03:24 +00003793 return GetChildClangTypeAtIndex (exe_ctx,
3794 ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003795 parent_name,
Sean Callanan48114472010-12-13 01:26:27 +00003796 cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003797 idx,
3798 transparent_pointers,
3799 omit_empty_base_classes,
Greg Claytondaf515f2011-07-09 20:12:33 +00003800 ignore_array_bounds,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003801 child_name,
3802 child_byte_size,
3803 child_byte_offset,
3804 child_bitfield_bit_size,
Greg Clayton8f92f0a2010-10-14 22:52:14 +00003805 child_bitfield_bit_offset,
Greg Claytone221f822011-01-21 01:59:00 +00003806 child_is_base_class,
3807 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003808 break;
Sean Callanan912855f2011-08-11 23:56:13 +00003809
3810 case clang::Type::Elaborated:
3811 return GetChildClangTypeAtIndex (exe_ctx,
3812 ast,
3813 parent_name,
3814 cast<ElaboratedType>(parent_qual_type)->getNamedType().getAsOpaquePtr(),
3815 idx,
3816 transparent_pointers,
3817 omit_empty_base_classes,
3818 ignore_array_bounds,
3819 child_name,
3820 child_byte_size,
3821 child_byte_offset,
3822 child_bitfield_bit_size,
3823 child_bitfield_bit_offset,
3824 child_is_base_class,
3825 child_is_deref_of_parent);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003826
3827 default:
3828 break;
3829 }
3830 }
Greg Clayton19503a22010-07-23 15:37:46 +00003831 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003832}
3833
3834static inline bool
3835BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
3836{
Greg Clayton6beaaa62011-01-17 03:46:26 +00003837 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003838}
3839
3840static uint32_t
3841GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
3842{
3843 uint32_t num_bases = 0;
3844 if (cxx_record_decl)
3845 {
3846 if (omit_empty_base_classes)
3847 {
3848 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3849 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3850 base_class != base_class_end;
3851 ++base_class)
3852 {
3853 // Skip empty base classes
3854 if (omit_empty_base_classes)
3855 {
3856 if (BaseSpecifierIsEmpty (base_class))
3857 continue;
3858 }
3859 ++num_bases;
3860 }
3861 }
3862 else
3863 num_bases = cxx_record_decl->getNumBases();
3864 }
3865 return num_bases;
3866}
3867
3868
3869static uint32_t
3870GetIndexForRecordBase
3871(
3872 const RecordDecl *record_decl,
3873 const CXXBaseSpecifier *base_spec,
3874 bool omit_empty_base_classes
3875)
3876{
3877 uint32_t child_idx = 0;
3878
3879 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3880
3881// const char *super_name = record_decl->getNameAsCString();
3882// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
3883// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
3884//
3885 if (cxx_record_decl)
3886 {
3887 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3888 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3889 base_class != base_class_end;
3890 ++base_class)
3891 {
3892 if (omit_empty_base_classes)
3893 {
3894 if (BaseSpecifierIsEmpty (base_class))
3895 continue;
3896 }
3897
3898// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
3899// child_idx,
3900// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
3901//
3902//
3903 if (base_class == base_spec)
3904 return child_idx;
3905 ++child_idx;
3906 }
3907 }
3908
3909 return UINT32_MAX;
3910}
3911
3912
3913static uint32_t
3914GetIndexForRecordChild
3915(
3916 const RecordDecl *record_decl,
3917 NamedDecl *canonical_decl,
3918 bool omit_empty_base_classes
3919)
3920{
3921 uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
3922
3923// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3924//
3925//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
3926// if (cxx_record_decl)
3927// {
3928// CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3929// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3930// base_class != base_class_end;
3931// ++base_class)
3932// {
3933// if (omit_empty_base_classes)
3934// {
3935// if (BaseSpecifierIsEmpty (base_class))
3936// continue;
3937// }
3938//
3939//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
3940//// record_decl->getNameAsCString(),
3941//// canonical_decl->getNameAsCString(),
3942//// child_idx,
3943//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
3944//
3945//
3946// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3947// if (curr_base_class_decl == canonical_decl)
3948// {
3949// return child_idx;
3950// }
3951// ++child_idx;
3952// }
3953// }
3954//
3955// const uint32_t num_bases = child_idx;
3956 RecordDecl::field_iterator field, field_end;
3957 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
3958 field != field_end;
3959 ++field, ++child_idx)
3960 {
3961// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
3962// record_decl->getNameAsCString(),
3963// canonical_decl->getNameAsCString(),
3964// child_idx - num_bases,
3965// field->getNameAsCString());
3966
3967 if (field->getCanonicalDecl() == canonical_decl)
3968 return child_idx;
3969 }
3970
3971 return UINT32_MAX;
3972}
3973
3974// Look for a child member (doesn't include base classes, but it does include
3975// their members) in the type hierarchy. Returns an index path into "clang_type"
3976// on how to reach the appropriate member.
3977//
3978// class A
3979// {
3980// public:
3981// int m_a;
3982// int m_b;
3983// };
3984//
3985// class B
3986// {
3987// };
3988//
3989// class C :
3990// public B,
3991// public A
3992// {
3993// };
3994//
3995// If we have a clang type that describes "class C", and we wanted to looked
3996// "m_b" in it:
3997//
3998// With omit_empty_base_classes == false we would get an integer array back with:
3999// { 1, 1 }
4000// The first index 1 is the child index for "class A" within class C
4001// The second index 1 is the child index for "m_b" within class A
4002//
4003// With omit_empty_base_classes == true we would get an integer array back with:
4004// { 0, 1 }
4005// 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)
4006// The second index 1 is the child index for "m_b" within class A
4007
4008size_t
4009ClangASTContext::GetIndexOfChildMemberWithName
4010(
Greg Clayton6beaaa62011-01-17 03:46:26 +00004011 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00004012 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004013 const char *name,
4014 bool omit_empty_base_classes,
4015 std::vector<uint32_t>& child_indexes
4016)
4017{
4018 if (clang_type && name && name[0])
4019 {
4020 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00004021 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4022 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004023 {
Greg Claytone1a916a2010-07-21 22:12:05 +00004024 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00004025 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004026 {
4027 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4028 const RecordDecl *record_decl = record_type->getDecl();
4029
4030 assert(record_decl);
4031 uint32_t child_idx = 0;
4032
4033 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4034
4035 // Try and find a field that matches NAME
4036 RecordDecl::field_iterator field, field_end;
4037 StringRef name_sref(name);
4038 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4039 field != field_end;
4040 ++field, ++child_idx)
4041 {
4042 if (field->getName().equals (name_sref))
4043 {
4044 // We have to add on the number of base classes to this index!
4045 child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
4046 return child_indexes.size();
4047 }
4048 }
4049
4050 if (cxx_record_decl)
4051 {
4052 const RecordDecl *parent_record_decl = cxx_record_decl;
4053
4054 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
4055
4056 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
4057 // Didn't find things easily, lets let clang do its thang...
Sean Callanancc427fa2011-07-30 02:42:06 +00004058 IdentifierInfo & ident_ref = ast->Idents.get(name_sref);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004059 DeclarationName decl_name(&ident_ref);
4060
4061 CXXBasePaths paths;
4062 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
4063 decl_name.getAsOpaquePtr(),
4064 paths))
4065 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004066 CXXBasePaths::const_paths_iterator path, path_end = paths.end();
4067 for (path = paths.begin(); path != path_end; ++path)
4068 {
4069 const size_t num_path_elements = path->size();
4070 for (size_t e=0; e<num_path_elements; ++e)
4071 {
4072 CXXBasePathElement elem = (*path)[e];
4073
4074 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
4075 if (child_idx == UINT32_MAX)
4076 {
4077 child_indexes.clear();
4078 return 0;
4079 }
4080 else
4081 {
4082 child_indexes.push_back (child_idx);
4083 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
4084 }
4085 }
4086 DeclContext::lookup_iterator named_decl_pos;
4087 for (named_decl_pos = path->Decls.first;
4088 named_decl_pos != path->Decls.second && parent_record_decl;
4089 ++named_decl_pos)
4090 {
4091 //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
4092
4093 child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
4094 if (child_idx == UINT32_MAX)
4095 {
4096 child_indexes.clear();
4097 return 0;
4098 }
4099 else
4100 {
4101 child_indexes.push_back (child_idx);
4102 }
4103 }
4104 }
4105 return child_indexes.size();
4106 }
4107 }
4108
4109 }
4110 break;
4111
Greg Clayton9e409562010-07-28 02:04:09 +00004112 case clang::Type::ObjCObject:
4113 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00004114 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00004115 {
4116 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00004117 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00004118 assert (objc_class_type);
4119 if (objc_class_type)
4120 {
4121 uint32_t child_idx = 0;
4122 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4123
4124 if (class_interface_decl)
4125 {
4126 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4127 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4128
Greg Clayton6ba78152010-09-18 02:11:07 +00004129 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
Greg Clayton9e409562010-07-28 02:04:09 +00004130 {
4131 const ObjCIvarDecl* ivar_decl = *ivar_pos;
4132
4133 if (ivar_decl->getName().equals (name_sref))
4134 {
4135 if ((!omit_empty_base_classes && superclass_interface_decl) ||
4136 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
4137 ++child_idx;
4138
4139 child_indexes.push_back (child_idx);
4140 return child_indexes.size();
4141 }
4142 }
4143
4144 if (superclass_interface_decl)
4145 {
4146 // The super class index is always zero for ObjC classes,
4147 // so we push it onto the child indexes in case we find
4148 // an ivar in our superclass...
4149 child_indexes.push_back (0);
4150
Greg Clayton6beaaa62011-01-17 03:46:26 +00004151 if (GetIndexOfChildMemberWithName (ast,
4152 ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
Greg Clayton9e409562010-07-28 02:04:09 +00004153 name,
4154 omit_empty_base_classes,
4155 child_indexes))
4156 {
4157 // We did find an ivar in a superclass so just
4158 // return the results!
4159 return child_indexes.size();
4160 }
4161
4162 // We didn't find an ivar matching "name" in our
4163 // superclass, pop the superclass zero index that
4164 // we pushed on above.
4165 child_indexes.pop_back();
4166 }
4167 }
4168 }
4169 }
4170 break;
4171
4172 case clang::Type::ObjCObjectPointer:
4173 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004174 return GetIndexOfChildMemberWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00004175 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
4176 name,
4177 omit_empty_base_classes,
4178 child_indexes);
4179 }
4180 break;
4181
4182
Greg Claytone1a916a2010-07-21 22:12:05 +00004183 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004184 {
4185// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4186// const uint64_t element_count = array->getSize().getLimitedValue();
4187//
4188// if (idx < element_count)
4189// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004190// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004191//
4192// char element_name[32];
4193// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
4194//
4195// child_name.assign(element_name);
4196// assert(field_type_info.first % 8 == 0);
4197// child_byte_size = field_type_info.first / 8;
4198// child_byte_offset = idx * child_byte_size;
4199// return array->getElementType().getAsOpaquePtr();
4200// }
4201 }
4202 break;
4203
Greg Claytone1a916a2010-07-21 22:12:05 +00004204// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004205// {
4206// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
4207// QualType pointee_type = mem_ptr_type->getPointeeType();
4208//
4209// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4210// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004211// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004212// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
4213// name);
4214// }
4215// }
4216// break;
4217//
Greg Claytone1a916a2010-07-21 22:12:05 +00004218 case clang::Type::LValueReference:
4219 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004220 {
Sean Callanan78e37602011-01-27 04:42:51 +00004221 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004222 QualType pointee_type = reference_type->getPointeeType();
4223
4224 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4225 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004226 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004227 reference_type->getPointeeType().getAsOpaquePtr(),
4228 name,
4229 omit_empty_base_classes,
4230 child_indexes);
4231 }
4232 }
4233 break;
4234
Greg Claytone1a916a2010-07-21 22:12:05 +00004235 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004236 {
Sean Callanan78e37602011-01-27 04:42:51 +00004237 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004238 QualType pointee_type = pointer_type->getPointeeType();
4239
4240 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4241 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004242 return GetIndexOfChildMemberWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004243 pointer_type->getPointeeType().getAsOpaquePtr(),
4244 name,
4245 omit_empty_base_classes,
4246 child_indexes);
4247 }
4248 else
4249 {
4250// if (parent_name)
4251// {
4252// child_name.assign(1, '*');
4253// child_name += parent_name;
4254// }
4255//
4256// // We have a pointer to an simple type
4257// if (idx == 0)
4258// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004259// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004260// assert(clang_type_info.first % 8 == 0);
4261// child_byte_size = clang_type_info.first / 8;
4262// child_byte_offset = 0;
4263// return pointee_type.getAsOpaquePtr();
4264// }
4265 }
4266 }
4267 break;
4268
Greg Claytone1a916a2010-07-21 22:12:05 +00004269 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00004270 return GetIndexOfChildMemberWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00004271 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004272 name,
4273 omit_empty_base_classes,
4274 child_indexes);
4275
4276 default:
4277 break;
4278 }
4279 }
4280 return 0;
4281}
4282
4283
4284// Get the index of the child of "clang_type" whose name matches. This function
4285// doesn't descend into the children, but only looks one level deep and name
4286// matches can include base class names.
4287
4288uint32_t
4289ClangASTContext::GetIndexOfChildWithName
4290(
Greg Clayton6beaaa62011-01-17 03:46:26 +00004291 ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00004292 clang_type_t clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004293 const char *name,
4294 bool omit_empty_base_classes
4295)
4296{
4297 if (clang_type && name && name[0])
4298 {
4299 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton9e409562010-07-28 02:04:09 +00004300
Greg Clayton737b9322010-09-13 03:32:57 +00004301 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
Greg Clayton9e409562010-07-28 02:04:09 +00004302
Greg Clayton737b9322010-09-13 03:32:57 +00004303 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004304 {
Greg Claytone1a916a2010-07-21 22:12:05 +00004305 case clang::Type::Record:
Greg Claytonc432c192011-01-20 04:18:48 +00004306 if (GetCompleteQualType (ast, qual_type))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004307 {
4308 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
4309 const RecordDecl *record_decl = record_type->getDecl();
4310
4311 assert(record_decl);
4312 uint32_t child_idx = 0;
4313
4314 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
4315
4316 if (cxx_record_decl)
4317 {
4318 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4319 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4320 base_class != base_class_end;
4321 ++base_class)
4322 {
4323 // Skip empty base classes
4324 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
4325 if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
4326 continue;
4327
Greg Claytone3055942011-06-30 02:28:26 +00004328 std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType()));
4329 if (base_class_type_name.compare (name) == 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004330 return child_idx;
4331 ++child_idx;
4332 }
4333 }
4334
4335 // Try and find a field that matches NAME
4336 RecordDecl::field_iterator field, field_end;
4337 StringRef name_sref(name);
4338 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
4339 field != field_end;
4340 ++field, ++child_idx)
4341 {
4342 if (field->getName().equals (name_sref))
4343 return child_idx;
4344 }
4345
4346 }
4347 break;
4348
Greg Clayton9e409562010-07-28 02:04:09 +00004349 case clang::Type::ObjCObject:
4350 case clang::Type::ObjCInterface:
Greg Claytonc432c192011-01-20 04:18:48 +00004351 if (GetCompleteQualType (ast, qual_type))
Greg Clayton9e409562010-07-28 02:04:09 +00004352 {
4353 StringRef name_sref(name);
Sean Callanan78e37602011-01-27 04:42:51 +00004354 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00004355 assert (objc_class_type);
4356 if (objc_class_type)
4357 {
4358 uint32_t child_idx = 0;
4359 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4360
4361 if (class_interface_decl)
4362 {
4363 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4364 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4365
4366 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
4367 {
4368 const ObjCIvarDecl* ivar_decl = *ivar_pos;
4369
4370 if (ivar_decl->getName().equals (name_sref))
4371 {
4372 if ((!omit_empty_base_classes && superclass_interface_decl) ||
4373 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
4374 ++child_idx;
4375
4376 return child_idx;
4377 }
4378 }
4379
4380 if (superclass_interface_decl)
4381 {
4382 if (superclass_interface_decl->getName().equals (name_sref))
4383 return 0;
4384 }
4385 }
4386 }
4387 }
4388 break;
4389
4390 case clang::Type::ObjCObjectPointer:
4391 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004392 return GetIndexOfChildWithName (ast,
Greg Clayton9e409562010-07-28 02:04:09 +00004393 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
4394 name,
4395 omit_empty_base_classes);
4396 }
4397 break;
4398
Greg Claytone1a916a2010-07-21 22:12:05 +00004399 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004400 {
4401// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
4402// const uint64_t element_count = array->getSize().getLimitedValue();
4403//
4404// if (idx < element_count)
4405// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004406// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004407//
4408// char element_name[32];
4409// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
4410//
4411// child_name.assign(element_name);
4412// assert(field_type_info.first % 8 == 0);
4413// child_byte_size = field_type_info.first / 8;
4414// child_byte_offset = idx * child_byte_size;
4415// return array->getElementType().getAsOpaquePtr();
4416// }
4417 }
4418 break;
4419
Greg Claytone1a916a2010-07-21 22:12:05 +00004420// case clang::Type::MemberPointerType:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004421// {
4422// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
4423// QualType pointee_type = mem_ptr_type->getPointeeType();
4424//
4425// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4426// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004427// return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004428// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
4429// name);
4430// }
4431// }
4432// break;
4433//
Greg Claytone1a916a2010-07-21 22:12:05 +00004434 case clang::Type::LValueReference:
4435 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004436 {
Sean Callanan78e37602011-01-27 04:42:51 +00004437 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004438 QualType pointee_type = reference_type->getPointeeType();
4439
4440 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4441 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004442 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004443 reference_type->getPointeeType().getAsOpaquePtr(),
4444 name,
4445 omit_empty_base_classes);
4446 }
4447 }
4448 break;
4449
Greg Claytone1a916a2010-07-21 22:12:05 +00004450 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004451 {
Sean Callanan78e37602011-01-27 04:42:51 +00004452 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004453 QualType pointee_type = pointer_type->getPointeeType();
4454
4455 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
4456 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004457 return GetIndexOfChildWithName (ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004458 pointer_type->getPointeeType().getAsOpaquePtr(),
4459 name,
4460 omit_empty_base_classes);
4461 }
4462 else
4463 {
4464// if (parent_name)
4465// {
4466// child_name.assign(1, '*');
4467// child_name += parent_name;
4468// }
4469//
4470// // We have a pointer to an simple type
4471// if (idx == 0)
4472// {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004473// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004474// assert(clang_type_info.first % 8 == 0);
4475// child_byte_size = clang_type_info.first / 8;
4476// child_byte_offset = 0;
4477// return pointee_type.getAsOpaquePtr();
4478// }
4479 }
4480 }
4481 break;
4482
Greg Claytone1a916a2010-07-21 22:12:05 +00004483 case clang::Type::Typedef:
Greg Clayton6beaaa62011-01-17 03:46:26 +00004484 return GetIndexOfChildWithName (ast,
Sean Callanan48114472010-12-13 01:26:27 +00004485 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004486 name,
4487 omit_empty_base_classes);
4488
4489 default:
4490 break;
4491 }
4492 }
4493 return UINT32_MAX;
4494}
4495
4496#pragma mark TagType
4497
4498bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004499ClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004500{
4501 if (tag_clang_type)
4502 {
4503 QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00004504 const clang::Type *clang_type = tag_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004505 if (clang_type)
4506 {
Sean Callanan78e37602011-01-27 04:42:51 +00004507 const TagType *tag_type = dyn_cast<TagType>(clang_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004508 if (tag_type)
4509 {
4510 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
4511 if (tag_decl)
4512 {
4513 tag_decl->setTagKind ((TagDecl::TagKind)kind);
4514 return true;
4515 }
4516 }
4517 }
4518 }
4519 return false;
4520}
4521
4522
4523#pragma mark DeclContext Functions
4524
4525DeclContext *
Greg Clayton1be10fc2010-09-29 01:12:09 +00004526ClangASTContext::GetDeclContextForType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004527{
4528 if (clang_type == NULL)
4529 return NULL;
4530
4531 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00004532 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4533 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004534 {
Sean Callanancc427fa2011-07-30 02:42:06 +00004535 case clang::Type::UnaryTransform: break;
Greg Clayton9e409562010-07-28 02:04:09 +00004536 case clang::Type::FunctionNoProto: break;
4537 case clang::Type::FunctionProto: break;
4538 case clang::Type::IncompleteArray: break;
4539 case clang::Type::VariableArray: break;
4540 case clang::Type::ConstantArray: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004541 case clang::Type::DependentSizedArray: break;
Greg Clayton9e409562010-07-28 02:04:09 +00004542 case clang::Type::ExtVector: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004543 case clang::Type::DependentSizedExtVector: break;
Greg Clayton9e409562010-07-28 02:04:09 +00004544 case clang::Type::Vector: break;
4545 case clang::Type::Builtin: break;
4546 case clang::Type::BlockPointer: break;
4547 case clang::Type::Pointer: break;
4548 case clang::Type::LValueReference: break;
4549 case clang::Type::RValueReference: break;
4550 case clang::Type::MemberPointer: break;
4551 case clang::Type::Complex: break;
4552 case clang::Type::ObjCObject: break;
4553 case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
4554 case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
4555 case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl();
4556 case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl();
Sean Callanan48114472010-12-13 01:26:27 +00004557 case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00004558 case clang::Type::Elaborated: return ClangASTContext::GetDeclContextForType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton9e409562010-07-28 02:04:09 +00004559 case clang::Type::TypeOfExpr: break;
4560 case clang::Type::TypeOf: break;
4561 case clang::Type::Decltype: break;
4562 //case clang::Type::QualifiedName: break;
4563 case clang::Type::TemplateSpecialization: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004564 case clang::Type::DependentTemplateSpecialization: break;
4565 case clang::Type::TemplateTypeParm: break;
4566 case clang::Type::SubstTemplateTypeParm: break;
4567 case clang::Type::SubstTemplateTypeParmPack:break;
4568 case clang::Type::PackExpansion: break;
4569 case clang::Type::UnresolvedUsing: break;
4570 case clang::Type::Paren: break;
Sean Callananfb0b7582011-03-15 00:17:19 +00004571 case clang::Type::Attributed: break;
4572 case clang::Type::Auto: break;
4573 case clang::Type::InjectedClassName: break;
4574 case clang::Type::DependentName: break;
Greg Claytonea3e7d52011-10-08 00:49:15 +00004575 case clang::Type::Atomic: break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004576 }
4577 // No DeclContext in this type...
4578 return NULL;
4579}
4580
4581#pragma mark Namespace Declarations
4582
4583NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00004584ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004585{
Greg Clayton030a2042011-10-14 21:34:45 +00004586 NamespaceDecl *namespace_decl = NULL;
Greg Clayton9d3d6882011-10-31 23:51:19 +00004587 ASTContext *ast = getASTContext();
4588 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
4589 if (decl_ctx == NULL)
4590 decl_ctx = translation_unit_decl;
4591
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004592 if (name)
4593 {
Greg Clayton030a2042011-10-14 21:34:45 +00004594 IdentifierInfo &identifier_info = ast->Idents.get(name);
4595 DeclarationName decl_name (&identifier_info);
4596 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
4597 for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos)
4598 {
4599 namespace_decl = dyn_cast<clang::NamespaceDecl>(*pos);
4600 if (namespace_decl)
4601 return namespace_decl;
4602 }
4603
4604 namespace_decl = NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), &identifier_info);
4605
Greg Clayton9d3d6882011-10-31 23:51:19 +00004606 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004607 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00004608 else
4609 {
4610 if (decl_ctx == translation_unit_decl)
4611 {
4612 namespace_decl = translation_unit_decl->getAnonymousNamespace();
4613 if (namespace_decl)
4614 return namespace_decl;
4615
4616 namespace_decl = NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), NULL);
4617 translation_unit_decl->setAnonymousNamespace (namespace_decl);
4618 translation_unit_decl->addDecl (namespace_decl);
4619 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
4620 }
4621 else
4622 {
4623 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
4624 if (parent_namespace_decl)
4625 {
4626 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
4627 if (namespace_decl)
4628 return namespace_decl;
4629 namespace_decl = NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), NULL);
4630 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
4631 parent_namespace_decl->addDecl (namespace_decl);
4632 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
4633 }
4634 else
4635 {
4636 // BAD!!!
4637 }
4638 }
4639
4640
4641 if (namespace_decl)
4642 {
4643 // If we make it here, we are creating the anonymous namespace decl
4644 // for the first time, so we need to do the using directive magic
4645 // like SEMA does
4646 UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast,
4647 decl_ctx,
4648 SourceLocation(),
4649 SourceLocation(),
4650 NestedNameSpecifierLoc(),
4651 SourceLocation(),
4652 namespace_decl,
4653 decl_ctx);
4654 using_directive_decl->setImplicit();
4655 decl_ctx->addDecl(using_directive_decl);
4656 }
4657 }
4658#ifdef LLDB_CONFIGURATION_DEBUG
4659 VerifyDecl(namespace_decl);
4660#endif
Greg Clayton030a2042011-10-14 21:34:45 +00004661 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004662}
4663
4664
4665#pragma mark Function Types
4666
4667FunctionDecl *
Greg Clayton147e1fa2011-10-14 22:47:18 +00004668ClangASTContext::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 +00004669{
Greg Clayton147e1fa2011-10-14 22:47:18 +00004670 FunctionDecl *func_decl = NULL;
4671 ASTContext *ast = getASTContext();
4672 if (decl_ctx == NULL)
4673 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004674
Greg Clayton147e1fa2011-10-14 22:47:18 +00004675 if (name && name[0])
4676 {
4677 func_decl = FunctionDecl::Create (*ast,
4678 decl_ctx,
4679 SourceLocation(),
4680 SourceLocation(),
4681 DeclarationName (&ast->Idents.get(name)),
4682 QualType::getFromOpaquePtr(function_clang_type),
4683 NULL,
4684 (FunctionDecl::StorageClass)storage,
4685 (FunctionDecl::StorageClass)storage,
4686 is_inline);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004687 }
Greg Clayton147e1fa2011-10-14 22:47:18 +00004688 else
4689 {
4690 func_decl = FunctionDecl::Create (*ast,
4691 decl_ctx,
4692 SourceLocation(),
4693 SourceLocation(),
4694 DeclarationName (),
4695 QualType::getFromOpaquePtr(function_clang_type),
4696 NULL,
4697 (FunctionDecl::StorageClass)storage,
4698 (FunctionDecl::StorageClass)storage,
4699 is_inline);
4700 }
4701 if (func_decl)
4702 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00004703
4704#ifdef LLDB_CONFIGURATION_DEBUG
4705 VerifyDecl(func_decl);
4706#endif
4707
Greg Clayton147e1fa2011-10-14 22:47:18 +00004708 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004709}
4710
Greg Clayton1be10fc2010-09-29 01:12:09 +00004711clang_type_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00004712ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Clayton1be10fc2010-09-29 01:12:09 +00004713 clang_type_t result_type,
4714 clang_type_t *args,
Sean Callananc81256a2010-09-16 20:40:25 +00004715 unsigned num_args,
4716 bool is_variadic,
4717 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004718{
Greg Clayton6beaaa62011-01-17 03:46:26 +00004719 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004720 std::vector<QualType> qual_type_args;
4721 for (unsigned i=0; i<num_args; ++i)
4722 qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
4723
4724 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00004725 FunctionProtoType::ExtProtoInfo proto_info;
4726 proto_info.Variadic = is_variadic;
Sean Callananfb0b7582011-03-15 00:17:19 +00004727 proto_info.ExceptionSpecType = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00004728 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00004729 proto_info.RefQualifier = RQ_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00004730 proto_info.NumExceptions = 0;
4731 proto_info.Exceptions = NULL;
4732
Greg Clayton147e1fa2011-10-14 22:47:18 +00004733 return ast->getFunctionType (QualType::getFromOpaquePtr(result_type),
4734 qual_type_args.empty() ? NULL : &qual_type_args.front(),
4735 qual_type_args.size(),
4736 proto_info).getAsOpaquePtr(); // NoReturn);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004737}
4738
4739ParmVarDecl *
Greg Clayton1be10fc2010-09-29 01:12:09 +00004740ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004741{
Greg Clayton6beaaa62011-01-17 03:46:26 +00004742 ASTContext *ast = getASTContext();
4743 assert (ast != NULL);
4744 return ParmVarDecl::Create(*ast,
4745 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004746 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00004747 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00004748 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callananc81256a2010-09-16 20:40:25 +00004749 QualType::getFromOpaquePtr(param_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004750 NULL,
4751 (VarDecl::StorageClass)storage,
4752 (VarDecl::StorageClass)storage,
4753 0);
4754}
4755
4756void
4757ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
4758{
4759 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00004760 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004761}
4762
4763
4764#pragma mark Array Types
4765
Greg Clayton1be10fc2010-09-29 01:12:09 +00004766clang_type_t
4767ClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004768{
4769 if (element_type)
4770 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00004771 ASTContext *ast = getASTContext();
4772 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004773 llvm::APInt ap_element_count (64, element_count);
Greg Clayton6beaaa62011-01-17 03:46:26 +00004774 return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004775 ap_element_count,
4776 ArrayType::Normal,
4777 0).getAsOpaquePtr(); // ElemQuals
4778 }
4779 return NULL;
4780}
4781
4782
4783#pragma mark TagDecl
4784
4785bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004786ClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004787{
4788 if (clang_type)
4789 {
4790 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Sean Callanan78e37602011-01-27 04:42:51 +00004791 const clang::Type *t = qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004792 if (t)
4793 {
Sean Callanan78e37602011-01-27 04:42:51 +00004794 const TagType *tag_type = dyn_cast<TagType>(t);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004795 if (tag_type)
4796 {
4797 TagDecl *tag_decl = tag_type->getDecl();
4798 if (tag_decl)
4799 {
4800 tag_decl->startDefinition();
4801 return true;
4802 }
4803 }
4804 }
4805 }
4806 return false;
4807}
4808
4809bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00004810ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004811{
4812 if (clang_type)
4813 {
4814 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton14372242010-09-29 03:44:17 +00004815
4816 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4817
4818 if (cxx_record_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004819 {
Greg Clayton14372242010-09-29 03:44:17 +00004820 cxx_record_decl->completeDefinition();
4821
4822 return true;
4823 }
4824
Sean Callanan78e37602011-01-27 04:42:51 +00004825 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
Sean Callanana2424172010-10-25 00:29:48 +00004826
4827 if (objc_class_type)
4828 {
4829 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4830
Sean Callanand5c17ed2011-11-15 02:11:17 +00004831 class_interface_decl->completedForwardDecl();
Sean Callanana2424172010-10-25 00:29:48 +00004832 }
4833
Greg Clayton14372242010-09-29 03:44:17 +00004834 const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
4835
4836 if (enum_type)
4837 {
4838 EnumDecl *enum_decl = enum_type->getDecl();
4839
4840 if (enum_decl)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004841 {
Greg Clayton14372242010-09-29 03:44:17 +00004842 /// TODO This really needs to be fixed.
4843
4844 unsigned NumPositiveBits = 1;
4845 unsigned NumNegativeBits = 0;
4846
Greg Clayton6beaaa62011-01-17 03:46:26 +00004847 ASTContext *ast = getASTContext();
Greg Claytone02b8502010-10-12 04:29:14 +00004848
4849 QualType promotion_qual_type;
4850 // If the enum integer type is less than an integer in bit width,
4851 // then we must promote it to an integer size.
Greg Clayton6beaaa62011-01-17 03:46:26 +00004852 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
Greg Claytone02b8502010-10-12 04:29:14 +00004853 {
4854 if (enum_decl->getIntegerType()->isSignedIntegerType())
Greg Clayton6beaaa62011-01-17 03:46:26 +00004855 promotion_qual_type = ast->IntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00004856 else
Greg Clayton6beaaa62011-01-17 03:46:26 +00004857 promotion_qual_type = ast->UnsignedIntTy;
Greg Claytone02b8502010-10-12 04:29:14 +00004858 }
4859 else
4860 promotion_qual_type = enum_decl->getIntegerType();
4861
4862 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Clayton14372242010-09-29 03:44:17 +00004863 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004864 }
4865 }
4866 }
4867 return false;
4868}
4869
4870
4871#pragma mark Enumeration Types
4872
Greg Clayton1be10fc2010-09-29 01:12:09 +00004873clang_type_t
Greg Claytonca512b32011-01-14 04:54:56 +00004874ClangASTContext::CreateEnumerationType
4875(
4876 const char *name,
4877 DeclContext *decl_ctx,
4878 const Declaration &decl,
4879 clang_type_t integer_qual_type
4880)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004881{
4882 // TODO: Do something intelligent with the Declaration object passed in
4883 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00004884 ASTContext *ast = getASTContext();
4885 assert (ast != NULL);
Greg Claytone02b8502010-10-12 04:29:14 +00004886
4887 // TODO: ask about these...
4888// const bool IsScoped = false;
4889// const bool IsFixed = false;
4890
Greg Clayton6beaaa62011-01-17 03:46:26 +00004891 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00004892 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00004893 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00004894 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00004895 name && name[0] ? &ast->Idents.get(name) : NULL,
Sean Callanan48114472010-12-13 01:26:27 +00004896 NULL,
4897 false, // IsScoped
4898 false, // IsScopedUsingClassTag
4899 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00004900
4901
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004902 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00004903 {
4904 // TODO: check if we should be setting the promotion type too?
4905 enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00004906
4907 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
4908
Greg Clayton6beaaa62011-01-17 03:46:26 +00004909 return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
Greg Clayton83ff3892010-09-12 23:17:56 +00004910 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004911 return NULL;
4912}
4913
Greg Clayton1be10fc2010-09-29 01:12:09 +00004914clang_type_t
4915ClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
4916{
4917 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
4918
Sean Callanan78e37602011-01-27 04:42:51 +00004919 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Greg Clayton1be10fc2010-09-29 01:12:09 +00004920 if (clang_type)
4921 {
4922 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
4923 if (enum_type)
4924 {
4925 EnumDecl *enum_decl = enum_type->getDecl();
4926 if (enum_decl)
4927 return enum_decl->getIntegerType().getAsOpaquePtr();
4928 }
4929 }
4930 return NULL;
4931}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004932bool
4933ClangASTContext::AddEnumerationValueToEnumerationType
4934(
Greg Clayton1be10fc2010-09-29 01:12:09 +00004935 clang_type_t enum_clang_type,
4936 clang_type_t enumerator_clang_type,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004937 const Declaration &decl,
4938 const char *name,
4939 int64_t enum_value,
4940 uint32_t enum_value_bit_size
4941)
4942{
4943 if (enum_clang_type && enumerator_clang_type && name)
4944 {
4945 // TODO: Do something intelligent with the Declaration object passed in
4946 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00004947 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004948 IdentifierTable *identifier_table = getIdentifierTable();
4949
Greg Clayton6beaaa62011-01-17 03:46:26 +00004950 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004951 assert (identifier_table != NULL);
4952 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
4953
Sean Callanan78e37602011-01-27 04:42:51 +00004954 const clang::Type *clang_type = enum_qual_type.getTypePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004955 if (clang_type)
4956 {
4957 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
4958
4959 if (enum_type)
4960 {
4961 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
4962 enum_llvm_apsint = enum_value;
4963 EnumConstantDecl *enumerator_decl =
Greg Clayton6beaaa62011-01-17 03:46:26 +00004964 EnumConstantDecl::Create (*ast,
4965 enum_type->getDecl(),
4966 SourceLocation(),
4967 name ? &identifier_table->get(name) : NULL, // Identifier
4968 QualType::getFromOpaquePtr(enumerator_clang_type),
4969 NULL,
4970 enum_llvm_apsint);
4971
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004972 if (enumerator_decl)
4973 {
4974 enum_type->getDecl()->addDecl(enumerator_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00004975
4976#ifdef LLDB_CONFIGURATION_DEBUG
4977 VerifyDecl(enumerator_decl);
4978#endif
4979
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004980 return true;
4981 }
4982 }
4983 }
4984 }
4985 return false;
4986}
4987
4988#pragma mark Pointers & References
4989
Greg Clayton1be10fc2010-09-29 01:12:09 +00004990clang_type_t
4991ClangASTContext::CreatePointerType (clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004992{
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00004993 return CreatePointerType (getASTContext(), clang_type);
4994}
4995
4996clang_type_t
4997ClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
4998{
4999 if (ast && clang_type)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005000 {
5001 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5002
Greg Clayton737b9322010-09-13 03:32:57 +00005003 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5004 switch (type_class)
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005005 {
5006 case clang::Type::ObjCObject:
5007 case clang::Type::ObjCInterface:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00005008 return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005009
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005010 default:
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00005011 return ast->getPointerType(qual_type).getAsOpaquePtr();
Greg Clayton5fb47cd2010-07-29 20:06:32 +00005012 }
5013 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005014 return NULL;
5015}
5016
Greg Clayton1be10fc2010-09-29 01:12:09 +00005017clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00005018ClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
5019 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005020{
5021 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00005022 return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005023 return NULL;
5024}
5025
Greg Clayton1be10fc2010-09-29 01:12:09 +00005026clang_type_t
Sean Callanan92adcac2011-01-13 08:53:35 +00005027ClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
5028 clang_type_t clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005029{
5030 if (clang_type)
Sean Callanan92adcac2011-01-13 08:53:35 +00005031 return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005032 return NULL;
5033}
5034
Greg Clayton1be10fc2010-09-29 01:12:09 +00005035clang_type_t
5036ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
Greg Clayton9b81a312010-06-12 01:20:30 +00005037{
5038 if (clang_pointee_type && clang_pointee_type)
5039 return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
5040 QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
5041 return NULL;
5042}
5043
Greg Clayton1a65ae12011-01-25 23:55:37 +00005044uint32_t
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005045ClangASTContext::GetPointerBitSize ()
5046{
Greg Clayton6beaaa62011-01-17 03:46:26 +00005047 ASTContext *ast = getASTContext();
5048 return ast->getTypeSize(ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005049}
5050
5051bool
Greg Claytondea8cb42011-06-29 22:09:02 +00005052ClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
5053{
5054 QualType pointee_qual_type;
5055 if (clang_type)
5056 {
5057 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5058 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5059 bool success = false;
5060 switch (type_class)
5061 {
5062 case clang::Type::Builtin:
5063 if (cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
5064 {
5065 if (dynamic_pointee_type)
5066 *dynamic_pointee_type = clang_type;
5067 return true;
5068 }
5069 break;
5070
5071 case clang::Type::ObjCObjectPointer:
5072 if (dynamic_pointee_type)
5073 *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5074 return true;
5075
5076 case clang::Type::Pointer:
5077 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
5078 success = true;
5079 break;
5080
5081 case clang::Type::LValueReference:
5082 case clang::Type::RValueReference:
5083 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
5084 success = true;
5085 break;
5086
5087 case clang::Type::Typedef:
Greg Claytonaffb03b2011-07-08 18:27:39 +00005088 return ClangASTContext::IsPossibleDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
Sean Callanan912855f2011-08-11 23:56:13 +00005089
5090 case clang::Type::Elaborated:
5091 return ClangASTContext::IsPossibleDynamicType (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), dynamic_pointee_type);
5092
Greg Claytondea8cb42011-06-29 22:09:02 +00005093 default:
5094 break;
5095 }
5096
5097 if (success)
5098 {
5099 // Check to make sure what we are pointing too is a possible dynamic C++ type
5100 // We currently accept any "void *" (in case we have a class that has been
5101 // watered down to an opaque pointer) and virtual C++ classes.
5102 const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
5103 switch (pointee_type_class)
5104 {
5105 case clang::Type::Builtin:
5106 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
5107 {
5108 case clang::BuiltinType::UnknownAny:
5109 case clang::BuiltinType::Void:
5110 if (dynamic_pointee_type)
5111 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5112 return true;
5113
5114 case clang::BuiltinType::NullPtr:
5115 case clang::BuiltinType::Bool:
5116 case clang::BuiltinType::Char_U:
5117 case clang::BuiltinType::UChar:
5118 case clang::BuiltinType::WChar_U:
5119 case clang::BuiltinType::Char16:
5120 case clang::BuiltinType::Char32:
5121 case clang::BuiltinType::UShort:
5122 case clang::BuiltinType::UInt:
5123 case clang::BuiltinType::ULong:
5124 case clang::BuiltinType::ULongLong:
5125 case clang::BuiltinType::UInt128:
5126 case clang::BuiltinType::Char_S:
5127 case clang::BuiltinType::SChar:
5128 case clang::BuiltinType::WChar_S:
5129 case clang::BuiltinType::Short:
5130 case clang::BuiltinType::Int:
5131 case clang::BuiltinType::Long:
5132 case clang::BuiltinType::LongLong:
5133 case clang::BuiltinType::Int128:
5134 case clang::BuiltinType::Float:
5135 case clang::BuiltinType::Double:
5136 case clang::BuiltinType::LongDouble:
5137 case clang::BuiltinType::Dependent:
5138 case clang::BuiltinType::Overload:
5139 case clang::BuiltinType::ObjCId:
5140 case clang::BuiltinType::ObjCClass:
5141 case clang::BuiltinType::ObjCSel:
5142 case clang::BuiltinType::BoundMember:
Greg Claytonf0705c82011-10-22 03:33:13 +00005143 case clang::BuiltinType::Half:
5144 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytoned3ae702011-11-09 19:04:58 +00005145 case clang::BuiltinType::PseudoObject:
Greg Claytondea8cb42011-06-29 22:09:02 +00005146 break;
5147 }
5148 break;
5149
5150 case clang::Type::Record:
5151 {
5152 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
5153 if (cxx_record_decl)
5154 {
5155 if (GetCompleteQualType (ast, pointee_qual_type))
5156 {
5157 success = cxx_record_decl->isDynamicClass();
5158 }
5159 else
5160 {
5161 // We failed to get the complete type, so we have to
5162 // treat this as a void * which we might possibly be
5163 // able to complete
5164 success = true;
5165 }
5166 if (success)
5167 {
5168 if (dynamic_pointee_type)
5169 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5170 return true;
5171 }
5172 }
5173 }
5174 break;
5175
5176 case clang::Type::ObjCObject:
5177 case clang::Type::ObjCInterface:
5178 {
5179 const clang::ObjCObjectType *objc_class_type = pointee_qual_type->getAsObjCQualifiedInterfaceType();
5180 if (objc_class_type)
5181 {
5182 GetCompleteQualType (ast, pointee_qual_type);
5183 if (dynamic_pointee_type)
5184 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5185 return true;
5186 }
5187 }
5188 break;
5189
5190 default:
5191 break;
5192 }
5193 }
5194 }
5195 if (dynamic_pointee_type)
5196 *dynamic_pointee_type = NULL;
5197 return false;
5198}
5199
5200
5201bool
Greg Clayton007d5be2011-05-30 00:49:24 +00005202ClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
5203{
5204 QualType pointee_qual_type;
5205 if (clang_type)
5206 {
5207 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5208 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5209 bool success = false;
5210 switch (type_class)
5211 {
5212 case clang::Type::Pointer:
5213 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
5214 success = true;
5215 break;
5216
5217 case clang::Type::LValueReference:
5218 case clang::Type::RValueReference:
5219 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
5220 success = true;
5221 break;
5222
5223 case clang::Type::Typedef:
5224 return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
5225
Sean Callanan912855f2011-08-11 23:56:13 +00005226 case clang::Type::Elaborated:
5227 return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5228
Greg Clayton007d5be2011-05-30 00:49:24 +00005229 default:
5230 break;
5231 }
5232
5233 if (success)
5234 {
5235 // Check to make sure what we are pointing too is a possible dynamic C++ type
5236 // We currently accept any "void *" (in case we have a class that has been
5237 // watered down to an opaque pointer) and virtual C++ classes.
5238 const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
5239 switch (pointee_type_class)
5240 {
5241 case clang::Type::Builtin:
5242 switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
5243 {
5244 case clang::BuiltinType::UnknownAny:
5245 case clang::BuiltinType::Void:
5246 if (dynamic_pointee_type)
5247 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5248 return true;
5249
5250 case clang::BuiltinType::NullPtr:
5251 case clang::BuiltinType::Bool:
5252 case clang::BuiltinType::Char_U:
5253 case clang::BuiltinType::UChar:
5254 case clang::BuiltinType::WChar_U:
5255 case clang::BuiltinType::Char16:
5256 case clang::BuiltinType::Char32:
5257 case clang::BuiltinType::UShort:
5258 case clang::BuiltinType::UInt:
5259 case clang::BuiltinType::ULong:
5260 case clang::BuiltinType::ULongLong:
5261 case clang::BuiltinType::UInt128:
5262 case clang::BuiltinType::Char_S:
5263 case clang::BuiltinType::SChar:
5264 case clang::BuiltinType::WChar_S:
5265 case clang::BuiltinType::Short:
5266 case clang::BuiltinType::Int:
5267 case clang::BuiltinType::Long:
5268 case clang::BuiltinType::LongLong:
5269 case clang::BuiltinType::Int128:
5270 case clang::BuiltinType::Float:
5271 case clang::BuiltinType::Double:
5272 case clang::BuiltinType::LongDouble:
5273 case clang::BuiltinType::Dependent:
5274 case clang::BuiltinType::Overload:
5275 case clang::BuiltinType::ObjCId:
5276 case clang::BuiltinType::ObjCClass:
5277 case clang::BuiltinType::ObjCSel:
5278 case clang::BuiltinType::BoundMember:
Greg Claytonf0705c82011-10-22 03:33:13 +00005279 case clang::BuiltinType::Half:
5280 case clang::BuiltinType::ARCUnbridgedCast:
Greg Claytoned3ae702011-11-09 19:04:58 +00005281 case clang::BuiltinType::PseudoObject:
Greg Clayton007d5be2011-05-30 00:49:24 +00005282 break;
5283 }
5284 break;
5285 case clang::Type::Record:
5286 {
5287 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
5288 if (cxx_record_decl)
5289 {
5290 if (GetCompleteQualType (ast, pointee_qual_type))
5291 {
Greg Claytona13ad2ad2011-06-02 01:26:44 +00005292 success = cxx_record_decl->isDynamicClass();
Greg Clayton007d5be2011-05-30 00:49:24 +00005293 }
5294 else
5295 {
5296 // We failed to get the complete type, so we have to
5297 // treat this as a void * which we might possibly be
5298 // able to complete
5299 success = true;
5300 }
5301 if (success)
5302 {
5303 if (dynamic_pointee_type)
5304 *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
5305 return true;
5306 }
5307 }
5308 }
5309 break;
5310
5311 default:
5312 break;
5313 }
5314 }
5315 }
5316 if (dynamic_pointee_type)
5317 *dynamic_pointee_type = NULL;
5318 return false;
5319}
5320
Sean Callanan98298012011-10-27 19:41:13 +00005321bool
5322ClangASTContext::IsReferenceType (clang_type_t clang_type, clang_type_t *target_type)
5323{
5324 if (clang_type == NULL)
5325 return false;
5326
5327 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5328 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5329
5330 switch (type_class)
5331 {
5332 case clang::Type::LValueReference:
5333 if (target_type)
5334 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5335 return true;
5336 case clang::Type::RValueReference:
5337 if (target_type)
5338 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5339 return true;
5340 case clang::Type::Typedef:
5341 return ClangASTContext::IsReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5342 case clang::Type::Elaborated:
5343 return ClangASTContext::IsReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5344 default:
5345 break;
5346 }
5347
5348 return false;
5349}
Greg Clayton007d5be2011-05-30 00:49:24 +00005350
5351bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005352ClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005353{
5354 if (clang_type == NULL)
5355 return false;
5356
5357 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00005358 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5359 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005360 {
Sean Callanana2424172010-10-25 00:29:48 +00005361 case clang::Type::Builtin:
5362 switch (cast<clang::BuiltinType>(qual_type)->getKind())
5363 {
5364 default:
5365 break;
5366 case clang::BuiltinType::ObjCId:
5367 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00005368 return true;
5369 }
5370 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00005371 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005372 if (target_type)
5373 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5374 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005375 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005376 if (target_type)
5377 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5378 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005379 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005380 if (target_type)
5381 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5382 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005383 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005384 if (target_type)
5385 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5386 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005387 case clang::Type::LValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005388 if (target_type)
5389 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5390 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005391 case clang::Type::RValueReference:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005392 if (target_type)
5393 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
5394 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005395 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00005396 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00005397 case clang::Type::Elaborated:
5398 return ClangASTContext::IsPointerOrReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005399 default:
5400 break;
5401 }
5402 return false;
5403}
5404
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005405bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005406ClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005407{
5408 if (!clang_type)
5409 return false;
5410
5411 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5412 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
5413
5414 if (builtin_type)
5415 {
5416 if (builtin_type->isInteger())
Jim Inghamef651602011-12-22 19:12:40 +00005417 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005418 is_signed = builtin_type->isSignedInteger();
Jim Inghamef651602011-12-22 19:12:40 +00005419 return true;
5420 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005421 }
5422
5423 return false;
5424}
5425
5426bool
Greg Claytonaffb03b2011-07-08 18:27:39 +00005427ClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t *target_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005428{
Greg Claytonaffb03b2011-07-08 18:27:39 +00005429 if (target_type)
5430 *target_type = NULL;
5431
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005432 if (clang_type)
5433 {
5434 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton737b9322010-09-13 03:32:57 +00005435 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5436 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005437 {
Sean Callanana2424172010-10-25 00:29:48 +00005438 case clang::Type::Builtin:
5439 switch (cast<clang::BuiltinType>(qual_type)->getKind())
5440 {
5441 default:
5442 break;
5443 case clang::BuiltinType::ObjCId:
5444 case clang::BuiltinType::ObjCClass:
Sean Callanana2424172010-10-25 00:29:48 +00005445 return true;
5446 }
5447 return false;
Greg Claytone1a916a2010-07-21 22:12:05 +00005448 case clang::Type::ObjCObjectPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005449 if (target_type)
5450 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5451 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005452 case clang::Type::BlockPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005453 if (target_type)
5454 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5455 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005456 case clang::Type::Pointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005457 if (target_type)
5458 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5459 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005460 case clang::Type::MemberPointer:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005461 if (target_type)
5462 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
5463 return true;
Greg Claytone1a916a2010-07-21 22:12:05 +00005464 case clang::Type::Typedef:
Greg Claytonaffb03b2011-07-08 18:27:39 +00005465 return ClangASTContext::IsPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
Sean Callanan912855f2011-08-11 23:56:13 +00005466 case clang::Type::Elaborated:
5467 return ClangASTContext::IsPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), target_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005468 default:
5469 break;
5470 }
5471 }
5472 return false;
5473}
5474
5475bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005476ClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005477{
5478 if (clang_type)
5479 {
5480 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5481
5482 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
5483 {
5484 clang::BuiltinType::Kind kind = BT->getKind();
5485 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
5486 {
5487 count = 1;
5488 is_complex = false;
5489 return true;
5490 }
5491 }
5492 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
5493 {
5494 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
5495 {
5496 count = 2;
5497 is_complex = true;
5498 return true;
5499 }
5500 }
5501 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
5502 {
5503 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
5504 {
5505 count = VT->getNumElements();
5506 is_complex = false;
5507 return true;
5508 }
5509 }
5510 }
5511 return false;
5512}
5513
Enrico Granata9fc19442011-07-06 02:13:41 +00005514bool
5515ClangASTContext::IsScalarType (lldb::clang_type_t clang_type)
5516{
5517 bool is_signed;
5518 if (ClangASTContext::IsIntegerType(clang_type, is_signed))
5519 return true;
5520
5521 uint32_t count;
5522 bool is_complex;
5523 return ClangASTContext::IsFloatingPointType(clang_type, count, is_complex) && !is_complex;
5524}
5525
5526bool
5527ClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type)
5528{
5529 if (!IsPointerType(clang_type))
5530 return false;
5531
5532 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5533 lldb::clang_type_t pointee_type = qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr();
5534 return IsScalarType(pointee_type);
5535}
5536
5537bool
5538ClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type)
5539{
Sean Callanan0caa21c2012-01-19 23:54:24 +00005540 clang_type = GetAsArrayType(clang_type);
5541
5542 if (clang_type == 0)
Enrico Granata9fc19442011-07-06 02:13:41 +00005543 return false;
5544
5545 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5546 lldb::clang_type_t item_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
5547 return IsScalarType(item_type);
5548}
5549
Greg Clayton8f92f0a2010-10-14 22:52:14 +00005550
5551bool
5552ClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
5553{
5554 if (clang_type)
5555 {
5556 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5557
5558 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5559 if (cxx_record_decl)
5560 {
5561 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
5562 return true;
5563 }
5564 }
5565 class_name.clear();
5566 return false;
5567}
5568
5569
Greg Clayton0fffff52010-09-24 05:15:53 +00005570bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005571ClangASTContext::IsCXXClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00005572{
5573 if (clang_type)
5574 {
5575 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5576 if (qual_type->getAsCXXRecordDecl() != NULL)
5577 return true;
5578 }
5579 return false;
5580}
5581
Greg Clayton20568dd2011-10-13 23:13:20 +00005582bool
5583ClangASTContext::IsBeingDefined (lldb::clang_type_t clang_type)
5584{
5585 if (clang_type)
5586 {
5587 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5588 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type);
5589 if (tag_type)
5590 return tag_type->isBeingDefined();
5591 }
5592 return false;
5593}
5594
Greg Clayton0fffff52010-09-24 05:15:53 +00005595bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005596ClangASTContext::IsObjCClassType (clang_type_t clang_type)
Greg Clayton0fffff52010-09-24 05:15:53 +00005597{
5598 if (clang_type)
5599 {
5600 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5601 if (qual_type->isObjCObjectOrInterfaceType())
5602 return true;
5603 }
5604 return false;
5605}
5606
5607
Greg Clayton73b472d2010-10-27 03:32:59 +00005608bool
5609ClangASTContext::IsCharType (clang_type_t clang_type)
5610{
5611 if (clang_type)
5612 return QualType::getFromOpaquePtr(clang_type)->isCharType();
5613 return false;
5614}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005615
5616bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005617ClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005618{
Greg Clayton73b472d2010-10-27 03:32:59 +00005619 clang_type_t pointee_or_element_clang_type = NULL;
5620 Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
5621
5622 if (pointee_or_element_clang_type == NULL)
5623 return false;
5624
5625 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005626 {
Greg Clayton73b472d2010-10-27 03:32:59 +00005627 QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
5628
5629 if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005630 {
Greg Clayton73b472d2010-10-27 03:32:59 +00005631 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5632 if (type_flags.Test (eTypeIsArray))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005633 {
Greg Clayton73b472d2010-10-27 03:32:59 +00005634 // We know the size of the array and it could be a C string
5635 // since it is an array of characters
5636 length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
5637 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005638 }
Greg Clayton73b472d2010-10-27 03:32:59 +00005639 else
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005640 {
Greg Clayton73b472d2010-10-27 03:32:59 +00005641 length = 0;
5642 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005643 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005644
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005645 }
5646 }
5647 return false;
5648}
5649
5650bool
Greg Clayton1be10fc2010-09-29 01:12:09 +00005651ClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
Greg Clayton737b9322010-09-13 03:32:57 +00005652{
5653 if (clang_type)
5654 {
5655 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5656
5657 if (qual_type->isFunctionPointerType())
5658 return true;
5659
5660 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5661 switch (type_class)
5662 {
Sean Callananfb0b7582011-03-15 00:17:19 +00005663 default:
5664 break;
Greg Clayton737b9322010-09-13 03:32:57 +00005665 case clang::Type::Typedef:
Sean Callanan48114472010-12-13 01:26:27 +00005666 return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00005667 case clang::Type::Elaborated:
5668 return ClangASTContext::IsFunctionPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00005669
5670 case clang::Type::LValueReference:
5671 case clang::Type::RValueReference:
5672 {
Sean Callanan78e37602011-01-27 04:42:51 +00005673 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
Greg Clayton737b9322010-09-13 03:32:57 +00005674 if (reference_type)
5675 return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
5676 }
5677 break;
5678 }
5679 }
5680 return false;
5681}
5682
Greg Clayton73b472d2010-10-27 03:32:59 +00005683size_t
5684ClangASTContext::GetArraySize (clang_type_t clang_type)
5685{
5686 if (clang_type)
5687 {
Greg Claytonef37d68a2011-07-09 17:12:27 +00005688 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
5689 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5690 switch (type_class)
5691 {
5692 case clang::Type::ConstantArray:
5693 {
5694 const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
5695 if (array)
5696 return array->getSize().getLimitedValue();
5697 }
5698 break;
5699
5700 case clang::Type::Typedef:
5701 return ClangASTContext::GetArraySize(cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Sean Callanan912855f2011-08-11 23:56:13 +00005702
5703 case clang::Type::Elaborated:
5704 return ClangASTContext::GetArraySize(cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
Enrico Granataf9fa6ee2011-07-12 00:18:11 +00005705
5706 default:
5707 break;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005708 }
Greg Clayton73b472d2010-10-27 03:32:59 +00005709 }
5710 return 0;
5711}
Greg Clayton737b9322010-09-13 03:32:57 +00005712
Sean Callanan0caa21c2012-01-19 23:54:24 +00005713clang_type_t
5714ClangASTContext::GetAsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005715{
5716 if (!clang_type)
Sean Callanan0caa21c2012-01-19 23:54:24 +00005717 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005718
5719 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5720
Greg Clayton737b9322010-09-13 03:32:57 +00005721 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5722 switch (type_class)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005723 {
Sean Callananfb0b7582011-03-15 00:17:19 +00005724 default:
5725 break;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005726
Greg Claytone1a916a2010-07-21 22:12:05 +00005727 case clang::Type::ConstantArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005728 if (member_type)
5729 *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
5730 if (size)
Greg Claytonac4827f2011-04-01 18:14:08 +00005731 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
Sean Callanan0caa21c2012-01-19 23:54:24 +00005732 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005733
Greg Claytone1a916a2010-07-21 22:12:05 +00005734 case clang::Type::IncompleteArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005735 if (member_type)
5736 *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
5737 if (size)
5738 *size = 0;
Sean Callanan0caa21c2012-01-19 23:54:24 +00005739 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005740
Greg Claytone1a916a2010-07-21 22:12:05 +00005741 case clang::Type::VariableArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005742 if (member_type)
5743 *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
5744 if (size)
5745 *size = 0;
Sean Callanan0caa21c2012-01-19 23:54:24 +00005746 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005747
Greg Claytone1a916a2010-07-21 22:12:05 +00005748 case clang::Type::DependentSizedArray:
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005749 if (member_type)
5750 *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
5751 if (size)
5752 *size = 0;
Sean Callanan0caa21c2012-01-19 23:54:24 +00005753 return clang_type;
Greg Claytonef37d68a2011-07-09 17:12:27 +00005754
5755 case clang::Type::Typedef:
Sean Callanan0caa21c2012-01-19 23:54:24 +00005756 return ClangASTContext::GetAsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
5757 member_type,
5758 size);
Sean Callanan912855f2011-08-11 23:56:13 +00005759
5760 case clang::Type::Elaborated:
Sean Callanan0caa21c2012-01-19 23:54:24 +00005761 return ClangASTContext::GetAsArrayType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
5762 member_type,
5763 size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005764 }
Sean Callanan0caa21c2012-01-19 23:54:24 +00005765 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005766}
5767
5768
5769#pragma mark Typedefs
5770
Greg Clayton1be10fc2010-09-29 01:12:09 +00005771clang_type_t
5772ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005773{
5774 if (clang_type)
5775 {
5776 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00005777 ASTContext *ast = getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005778 IdentifierTable *identifier_table = getIdentifierTable();
Greg Clayton6beaaa62011-01-17 03:46:26 +00005779 assert (ast != NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005780 assert (identifier_table != NULL);
5781 if (decl_ctx == NULL)
Greg Clayton6beaaa62011-01-17 03:46:26 +00005782 decl_ctx = ast->getTranslationUnitDecl();
5783 TypedefDecl *decl = TypedefDecl::Create (*ast,
5784 decl_ctx,
5785 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00005786 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00005787 name ? &identifier_table->get(name) : NULL, // Identifier
5788 ast->CreateTypeSourceInfo(qual_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00005789
Greg Clayton147e1fa2011-10-14 22:47:18 +00005790 //decl_ctx->addDecl (decl);
5791
Sean Callanan2652ad22011-01-18 01:03:44 +00005792 decl->setAccess(AS_public); // TODO respect proper access specifier
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005793
5794 // Get a uniqued QualType for the typedef decl type
Greg Clayton6beaaa62011-01-17 03:46:26 +00005795 return ast->getTypedefType (decl).getAsOpaquePtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005796 }
5797 return NULL;
5798}
5799
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005800// Disable this for now since I can't seem to get a nicely formatted float
5801// out of the APFloat class without just getting the float, double or quad
5802// and then using a formatted print on it which defeats the purpose. We ideally
5803// would like to get perfect string values for any kind of float semantics
5804// so we can support remote targets. The code below also requires a patch to
5805// llvm::APInt.
5806//bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00005807//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 +00005808//{
5809// uint32_t count = 0;
5810// bool is_complex = false;
5811// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
5812// {
5813// unsigned num_bytes_per_float = byte_size / count;
5814// unsigned num_bits_per_float = num_bytes_per_float * 8;
5815//
5816// float_str.clear();
5817// uint32_t i;
5818// for (i=0; i<count; i++)
5819// {
5820// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
5821// bool is_ieee = false;
5822// APFloat ap_float(ap_int, is_ieee);
5823// char s[1024];
5824// unsigned int hex_digits = 0;
5825// bool upper_case = false;
5826//
5827// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
5828// {
5829// if (i > 0)
5830// float_str.append(", ");
5831// float_str.append(s);
5832// if (i == 1 && is_complex)
5833// float_str.append(1, 'i');
5834// }
5835// }
5836// return !float_str.empty();
5837// }
5838// return false;
5839//}
5840
5841size_t
Greg Clayton6beaaa62011-01-17 03:46:26 +00005842ClangASTContext::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 +00005843{
5844 if (clang_type)
5845 {
5846 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5847 uint32_t count = 0;
5848 bool is_complex = false;
5849 if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
5850 {
5851 // TODO: handle complex and vector types
5852 if (count != 1)
5853 return false;
5854
5855 StringRef s_sref(s);
Greg Clayton6beaaa62011-01-17 03:46:26 +00005856 APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005857
Greg Clayton6beaaa62011-01-17 03:46:26 +00005858 const uint64_t bit_size = ast->getTypeSize (qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005859 const uint64_t byte_size = bit_size / 8;
5860 if (dst_size >= byte_size)
5861 {
5862 if (bit_size == sizeof(float)*8)
5863 {
5864 float float32 = ap_float.convertToFloat();
5865 ::memcpy (dst, &float32, byte_size);
5866 return byte_size;
5867 }
5868 else if (bit_size >= 64)
5869 {
5870 llvm::APInt ap_int(ap_float.bitcastToAPInt());
5871 ::memcpy (dst, ap_int.getRawData(), byte_size);
5872 return byte_size;
5873 }
5874 }
5875 }
5876 }
5877 return 0;
5878}
Sean Callanan6fe64b52010-09-17 02:24:29 +00005879
5880unsigned
Greg Clayton1be10fc2010-09-29 01:12:09 +00005881ClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
Sean Callanan6fe64b52010-09-17 02:24:29 +00005882{
5883 assert (clang_type);
5884
5885 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
5886
5887 return qual_type.getQualifiers().getCVRQualifiers();
5888}
Greg Clayton6beaaa62011-01-17 03:46:26 +00005889
Sean Callanan3b107b12011-12-03 03:15:28 +00005890uint64_t
5891GetTypeFlags(clang::ASTContext *ast, lldb::clang_type_t clang_type)
5892{
5893 assert (clang_type);
5894
5895 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
5896
5897 if (!external_ast_source)
5898 return 0;
5899
5900 ClangExternalASTSourceCommon *common_ast_source = static_cast<ClangExternalASTSourceCommon*>(external_ast_source);
5901
5902 return common_ast_source->GetMetadata((uintptr_t)clang_type);
5903}
5904
5905void
5906SetTypeFlags(clang::ASTContext *ast, lldb::clang_type_t clang_type, uint64_t flags)
5907{
5908 assert (clang_type);
5909
5910 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
5911
5912 if (!external_ast_source)
5913 return;
5914
5915 ClangExternalASTSourceCommon *common_ast_source = static_cast<ClangExternalASTSourceCommon*>(external_ast_source);
5916
5917 return common_ast_source->SetMetadata((uintptr_t)clang_type, flags);
5918}
5919
Greg Clayton6beaaa62011-01-17 03:46:26 +00005920bool
5921ClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
5922{
5923 if (clang_type == NULL)
5924 return false;
5925
Greg Claytonc432c192011-01-20 04:18:48 +00005926 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
Greg Clayton6beaaa62011-01-17 03:46:26 +00005927}
5928
5929
5930bool
5931ClangASTContext::GetCompleteType (clang_type_t clang_type)
5932{
5933 return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
5934}
5935
Greg Claytona2721472011-06-25 00:44:06 +00005936bool
5937ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
5938 clang::Decl *decl)
5939{
5940 if (!decl)
5941 return false;
5942
5943 ExternalASTSource *ast_source = ast->getExternalSource();
5944
5945 if (!ast_source)
5946 return false;
5947
5948 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
5949 {
5950 if (tag_decl->getDefinition())
5951 return true;
5952
5953 if (!tag_decl->hasExternalLexicalStorage())
5954 return false;
5955
5956 ast_source->CompleteType(tag_decl);
5957
5958 return !tag_decl->getTypeForDecl()->isIncompleteType();
5959 }
5960 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
5961 {
5962 if (!objc_interface_decl->isForwardDecl())
5963 return true;
5964
5965 if (!objc_interface_decl->hasExternalLexicalStorage())
5966 return false;
5967
5968 ast_source->CompleteType(objc_interface_decl);
5969
5970 return !objc_interface_decl->isForwardDecl();
5971 }
5972 else
5973 {
5974 return false;
5975 }
5976}
5977
Greg Clayton2c5f0e92011-08-04 21:02:57 +00005978clang::DeclContext *
5979ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
5980{
Sean Callanana87bee82011-08-19 06:19:25 +00005981 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00005982}
5983
5984clang::DeclContext *
5985ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
5986{
Sean Callanana87bee82011-08-19 06:19:25 +00005987 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00005988}
5989