blob: 06ccb5e0b59dd8ed3c28762c2a585ffb6719654c [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
Greg Claytonff48e4b2015-02-03 02:05:44 +000014#include <mutex> // std::once
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015#include <string>
16
17// Other libraries and framework includes
Greg Clayton6beaaa62011-01-17 03:46:26 +000018
19// Clang headers like to use NDEBUG inside of them to enable/disable debug
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +000020// related features using "#ifndef NDEBUG" preprocessor blocks to do one thing
Greg Clayton6beaaa62011-01-17 03:46:26 +000021// or another. This is bad because it means that if clang was built in release
22// mode, it assumes that you are building in release mode which is not always
23// the case. You can end up with functions that are defined as empty in header
24// files when NDEBUG is not defined, and this can cause link errors with the
25// clang .a files that you have since you might be missing functions in the .a
26// file. So we have to define NDEBUG when including clang headers to avoid any
27// mismatches. This is covered by rdar://problem/8691220
28
Sean Callanan3b1d4f62011-10-26 17:46:51 +000029#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
Greg Clayton6beaaa62011-01-17 03:46:26 +000030#define LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000031#define NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000032// Need to include assert.h so it is as clang would expect it to be (disabled)
33#include <assert.h>
34#endif
35
Chris Lattner30fdc8d2010-06-08 16:52:24 +000036#include "clang/AST/ASTContext.h"
37#include "clang/AST/ASTImporter.h"
Greg Claytonf74c4032012-12-03 18:29:55 +000038#include "clang/AST/Attr.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039#include "clang/AST/CXXInheritance.h"
Greg Clayton8cf05932010-07-22 18:30:50 +000040#include "clang/AST/DeclObjC.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000041#include "clang/AST/DeclTemplate.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042#include "clang/AST/RecordLayout.h"
43#include "clang/AST/Type.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000044#include "clang/AST/VTableBuilder.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045#include "clang/Basic/Builtins.h"
Sean Callanan7e2863b2012-02-06 21:28:03 +000046#include "clang/Basic/Diagnostic.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047#include "clang/Basic/FileManager.h"
Sean Callanan79439e82010-11-18 02:56:27 +000048#include "clang/Basic/FileSystemOptions.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049#include "clang/Basic/SourceManager.h"
50#include "clang/Basic/TargetInfo.h"
51#include "clang/Basic/TargetOptions.h"
52#include "clang/Frontend/FrontendOptions.h"
53#include "clang/Frontend/LangStandard.h"
Greg Clayton6beaaa62011-01-17 03:46:26 +000054
55#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000056#undef NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000057#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
58// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
59#include <assert.h>
60#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +000061
Greg Claytond8d4a572015-08-11 21:38:15 +000062#include "llvm/Support/Signals.h"
63
Greg Clayton514487e2011-02-15 21:59:32 +000064#include "lldb/Core/ArchSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065#include "lldb/Core/dwarf.h"
Greg Clayton73b472d2010-10-27 03:32:59 +000066#include "lldb/Core/Flags.h"
Sean Callananfb8b7092010-10-28 18:19:36 +000067#include "lldb/Core/Log.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000068#include "lldb/Core/RegularExpression.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000069#include "lldb/Core/StreamFile.h"
Enrico Granata2267ad42014-09-16 17:28:40 +000070#include "lldb/Core/ThreadSafeDenseMap.h"
Greg Clayton57ee3062013-07-11 22:46:58 +000071#include "lldb/Core/UniqueCStringMap.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000072#include "lldb/Expression/ASTDumper.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000073#include "lldb/Symbol/ClangASTContext.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000074#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Sean Callanan5e9e1992011-10-26 01:06:27 +000075#include "lldb/Symbol/VerifyDecl.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000076#include "lldb/Target/ExecutionContext.h"
77#include "lldb/Target/Process.h"
78#include "lldb/Target/ObjCLanguageRuntime.h"
79
Eli Friedman932197d2010-06-13 19:06:42 +000080#include <stdio.h>
81
Greg Clayton1341baf2013-07-11 23:36:31 +000082#include <mutex>
83
Greg Claytonc86103d2010-08-05 01:57:25 +000084using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000085using namespace lldb_private;
86using namespace llvm;
87using namespace clang;
88
Enrico Granata2267ad42014-09-16 17:28:40 +000089typedef lldb_private::ThreadSafeDenseMap<clang::ASTContext *, ClangASTContext*> ClangASTMap;
Enrico Granata5d84a692014-08-19 21:46:37 +000090
91static ClangASTMap &
92GetASTMap()
93{
Enrico Granata2267ad42014-09-16 17:28:40 +000094 static ClangASTMap *g_map_ptr = nullptr;
95 static std::once_flag g_once_flag;
96 std::call_once(g_once_flag, []() {
97 g_map_ptr = new ClangASTMap(); // leaked on purpose to avoid spins
98 });
99 return *g_map_ptr;
Enrico Granata5d84a692014-08-19 21:46:37 +0000100}
101
102
Greg Clayton57ee3062013-07-11 22:46:58 +0000103clang::AccessSpecifier
104ClangASTContext::ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000105{
106 switch (access)
107 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000108 default: break;
109 case eAccessNone: return AS_none;
110 case eAccessPublic: return AS_public;
111 case eAccessPrivate: return AS_private;
112 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000113 }
114 return AS_none;
115}
116
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000117static void
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000118ParseLangArgs (LangOptions &Opts, InputKind IK, const char* triple)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000119{
120 // FIXME: Cleanup per-file based stuff.
121
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000122 // Set some properties which depend solely on the input kind; it would be nice
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000123 // to move these to the language standard, and have the driver resolve the
124 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000125 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000126 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000127 } else if (IK == IK_ObjC ||
128 IK == IK_ObjCXX ||
129 IK == IK_PreprocessedObjC ||
130 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000131 Opts.ObjC1 = Opts.ObjC2 = 1;
132 }
133
134 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
135
136 if (LangStd == LangStandard::lang_unspecified) {
137 // Based on the base language, pick one.
138 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000139 case IK_None:
140 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000141 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000142 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000143 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000144 LangStd = LangStandard::lang_opencl;
145 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000146 case IK_CUDA:
Artem Belevich52210ae2015-03-19 18:12:26 +0000147 case IK_PreprocessedCuda:
Sean Callananfb0b7582011-03-15 00:17:19 +0000148 LangStd = LangStandard::lang_cuda;
149 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000150 case IK_Asm:
151 case IK_C:
152 case IK_PreprocessedC:
153 case IK_ObjC:
154 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155 LangStd = LangStandard::lang_gnu99;
156 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000157 case IK_CXX:
158 case IK_PreprocessedCXX:
159 case IK_ObjCXX:
160 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000161 LangStd = LangStandard::lang_gnucxx98;
162 break;
163 }
164 }
165
166 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
Filipe Cabecinhase818ca22012-11-12 21:26:32 +0000167 Opts.LineComment = Std.hasLineComments();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000168 Opts.C99 = Std.isC99();
169 Opts.CPlusPlus = Std.isCPlusPlus();
Chandler Carruth38336a12013-01-02 12:55:00 +0000170 Opts.CPlusPlus11 = Std.isCPlusPlus11();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000171 Opts.Digraphs = Std.hasDigraphs();
172 Opts.GNUMode = Std.isGNUMode();
173 Opts.GNUInline = !Std.isC99();
174 Opts.HexFloats = Std.hasHexFloats();
175 Opts.ImplicitInt = Std.hasImplicitInt();
Enrico Granatac921e342013-01-10 02:37:22 +0000176
177 Opts.WChar = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000178
179 // OpenCL has some additional defaults.
180 if (LangStd == LangStandard::lang_opencl) {
181 Opts.OpenCL = 1;
182 Opts.AltiVec = 1;
183 Opts.CXXOperatorNames = 1;
184 Opts.LaxVectorConversions = 1;
185 }
186
187 // OpenCL and C++ both have bool, true, false keywords.
188 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
189
190// if (Opts.CPlusPlus)
191// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
192//
193// if (Args.hasArg(OPT_fobjc_gc_only))
194// Opts.setGCMode(LangOptions::GCOnly);
195// else if (Args.hasArg(OPT_fobjc_gc))
196// Opts.setGCMode(LangOptions::HybridGC);
197//
198// if (Args.hasArg(OPT_print_ivar_layout))
199// Opts.ObjCGCBitmapPrint = 1;
200//
201// if (Args.hasArg(OPT_faltivec))
202// Opts.AltiVec = 1;
203//
204// if (Args.hasArg(OPT_pthread))
205// Opts.POSIXThreads = 1;
206//
207// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
208// "default");
209// if (Vis == "default")
Sean Callanan37f76e52013-02-19 19:16:37 +0000210 Opts.setValueVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000211// else if (Vis == "hidden")
212// Opts.setVisibilityMode(LangOptions::Hidden);
213// else if (Vis == "protected")
214// Opts.setVisibilityMode(LangOptions::Protected);
215// else
216// Diags.Report(diag::err_drv_invalid_value)
217// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
218
219// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
220
221 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
222 // is specified, or -std is set to a conforming mode.
223 Opts.Trigraphs = !Opts.GNUMode;
224// if (Args.hasArg(OPT_trigraphs))
225// Opts.Trigraphs = 1;
226//
227// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
228// OPT_fno_dollars_in_identifiers,
229// !Opts.AsmPreprocessor);
230// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
231// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
232// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
233// if (Args.hasArg(OPT_fno_lax_vector_conversions))
234// Opts.LaxVectorConversions = 0;
235// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
236// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
237// Opts.Blocks = Args.hasArg(OPT_fblocks);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000238 Opts.CharIsSigned = ArchSpec(triple).CharIsSignedByDefault();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000239// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
240// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
241// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
242// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
243// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
244// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
245// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
246// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
247// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
248// Diags);
249// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
250// Opts.ObjCConstantStringClass = getLastArgValue(Args,
251// OPT_fconstant_string_class);
252// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
253// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
254// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
255// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
256// Opts.Static = Args.hasArg(OPT_static_define);
257 Opts.OptimizeSize = 0;
258
259 // FIXME: Eliminate this dependency.
260// unsigned Opt =
261// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
262// Opts.Optimize = Opt != 0;
263 unsigned Opt = 0;
264
265 // This is the __NO_INLINE__ define, which just depends on things like the
266 // optimization level and -fno-inline, not actually whether the backend has
267 // inlining enabled.
268 //
269 // FIXME: This is affected by other options (-fno-inline).
Sean Callanan3d654b32012-09-24 22:25:51 +0000270 Opts.NoInlineDefine = !Opt;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000271
272// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
273// switch (SSP) {
274// default:
275// Diags.Report(diag::err_drv_invalid_value)
276// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
277// break;
278// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
279// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
280// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
281// }
282}
283
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000284
Greg Clayton6beaaa62011-01-17 03:46:26 +0000285ClangASTContext::ClangASTContext (const char *target_triple) :
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000286 m_target_triple(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000287 m_ast_ap(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000288 m_language_options_ap(),
289 m_source_manager_ap(),
Sean Callanan880e6802011-10-07 23:18:13 +0000290 m_diagnostics_engine_ap(),
Sean Callananc5069ad2012-10-17 22:11:14 +0000291 m_target_options_rp(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000292 m_target_info_ap(),
293 m_identifier_table_ap(),
294 m_selector_table_ap(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000295 m_builtins_ap(),
Ed Masted4612ad2014-04-20 13:17:36 +0000296 m_callback_tag_decl (nullptr),
297 m_callback_objc_decl (nullptr),
298 m_callback_baton (nullptr),
Greg Claytond8d4a572015-08-11 21:38:15 +0000299 m_pointer_byte_size (0),
300 m_ast_owned(false)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000301
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000302{
303 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000304 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000305}
306
307//----------------------------------------------------------------------
308// Destructor
309//----------------------------------------------------------------------
310ClangASTContext::~ClangASTContext()
311{
Enrico Granata5d84a692014-08-19 21:46:37 +0000312 if (m_ast_ap.get())
313 {
Enrico Granata2267ad42014-09-16 17:28:40 +0000314 GetASTMap().Erase(m_ast_ap.get());
Greg Claytond8d4a572015-08-11 21:38:15 +0000315 if (!m_ast_owned)
316 m_ast_ap.release();
Enrico Granata5d84a692014-08-19 21:46:37 +0000317 }
318
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000319 m_builtins_ap.reset();
320 m_selector_table_ap.reset();
321 m_identifier_table_ap.reset();
322 m_target_info_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000323 m_target_options_rp.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000324 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000325 m_source_manager_ap.reset();
326 m_language_options_ap.reset();
Greg Clayton6beaaa62011-01-17 03:46:26 +0000327 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000328}
329
330
331void
332ClangASTContext::Clear()
333{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000334 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000335 m_language_options_ap.reset();
336 m_source_manager_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000337 m_diagnostics_engine_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000338 m_target_options_rp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000339 m_target_info_ap.reset();
340 m_identifier_table_ap.reset();
341 m_selector_table_ap.reset();
342 m_builtins_ap.reset();
Greg Clayton57ee3062013-07-11 22:46:58 +0000343 m_pointer_byte_size = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000344}
345
346const char *
347ClangASTContext::GetTargetTriple ()
348{
349 return m_target_triple.c_str();
350}
351
352void
353ClangASTContext::SetTargetTriple (const char *target_triple)
354{
355 Clear();
356 m_target_triple.assign(target_triple);
357}
358
Greg Clayton514487e2011-02-15 21:59:32 +0000359void
360ClangASTContext::SetArchitecture (const ArchSpec &arch)
361{
Greg Clayton880cbb02011-07-30 01:26:02 +0000362 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000363}
364
Greg Clayton6beaaa62011-01-17 03:46:26 +0000365bool
366ClangASTContext::HasExternalSource ()
367{
368 ASTContext *ast = getASTContext();
369 if (ast)
Ed Masted4612ad2014-04-20 13:17:36 +0000370 return ast->getExternalSource () != nullptr;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000371 return false;
372}
373
374void
Todd Fiala955fe6f2014-02-27 17:18:23 +0000375ClangASTContext::SetExternalSource (llvm::IntrusiveRefCntPtr<ExternalASTSource> &ast_source_ap)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000376{
377 ASTContext *ast = getASTContext();
378 if (ast)
379 {
380 ast->setExternalSource (ast_source_ap);
381 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
382 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
383 }
384}
385
386void
387ClangASTContext::RemoveExternalSource ()
388{
389 ASTContext *ast = getASTContext();
390
391 if (ast)
392 {
Todd Fiala955fe6f2014-02-27 17:18:23 +0000393 llvm::IntrusiveRefCntPtr<ExternalASTSource> empty_ast_source_ap;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000394 ast->setExternalSource (empty_ast_source_ap);
395 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
396 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
397 }
398}
399
Greg Claytond8d4a572015-08-11 21:38:15 +0000400void
401ClangASTContext::setASTContext(clang::ASTContext *ast_ctx)
402{
403 if (!m_ast_owned) {
404 m_ast_ap.release();
405 }
406 m_ast_owned = false;
407 m_ast_ap.reset(ast_ctx);
408 GetASTMap().Insert(ast_ctx, this);
409}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000410
411ASTContext *
412ClangASTContext::getASTContext()
413{
Ed Masted4612ad2014-04-20 13:17:36 +0000414 if (m_ast_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000415 {
Greg Claytond8d4a572015-08-11 21:38:15 +0000416 m_ast_owned = true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000417 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
418 *getSourceManager(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000419 *getIdentifierTable(),
420 *getSelectorTable(),
Alp Tokercf55e882014-05-03 15:05:45 +0000421 *getBuiltinContext()));
Sean Callanan6d61b632015-04-09 17:42:48 +0000422
423 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Greg Clayton28eb7bf2015-05-07 00:07:44 +0000424
425 // This can be NULL if we don't know anything about the architecture or if the
426 // target for an architecture isn't enabled in the llvm/clang that we built
427 TargetInfo *target_info = getTargetInfo();
428 if (target_info)
429 m_ast_ap->InitBuiltinTypes(*target_info);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000430
Greg Clayton6beaaa62011-01-17 03:46:26 +0000431 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
432 {
433 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
434 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
435 }
436
Enrico Granata2267ad42014-09-16 17:28:40 +0000437 GetASTMap().Insert(m_ast_ap.get(), this);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000438 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000439 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000440}
441
Enrico Granata5d84a692014-08-19 21:46:37 +0000442ClangASTContext*
443ClangASTContext::GetASTContext (clang::ASTContext* ast)
444{
Enrico Granata2267ad42014-09-16 17:28:40 +0000445 ClangASTContext *clang_ast = GetASTMap().Lookup(ast);
Enrico Granata5d84a692014-08-19 21:46:37 +0000446 return clang_ast;
447}
448
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000449Builtin::Context *
450ClangASTContext::getBuiltinContext()
451{
Ed Masted4612ad2014-04-20 13:17:36 +0000452 if (m_builtins_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000453 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000454 return m_builtins_ap.get();
455}
456
457IdentifierTable *
458ClangASTContext::getIdentifierTable()
459{
Ed Masted4612ad2014-04-20 13:17:36 +0000460 if (m_identifier_table_ap.get() == nullptr)
461 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), nullptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000462 return m_identifier_table_ap.get();
463}
464
465LangOptions *
466ClangASTContext::getLanguageOptions()
467{
Ed Masted4612ad2014-04-20 13:17:36 +0000468 if (m_language_options_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000469 {
470 m_language_options_ap.reset(new LangOptions());
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000471 ParseLangArgs(*m_language_options_ap, IK_ObjCXX, GetTargetTriple());
Greg Clayton94e5d782010-06-13 17:34:29 +0000472// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000473 }
474 return m_language_options_ap.get();
475}
476
477SelectorTable *
478ClangASTContext::getSelectorTable()
479{
Ed Masted4612ad2014-04-20 13:17:36 +0000480 if (m_selector_table_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000481 m_selector_table_ap.reset (new SelectorTable());
482 return m_selector_table_ap.get();
483}
484
Sean Callanan79439e82010-11-18 02:56:27 +0000485clang::FileManager *
486ClangASTContext::getFileManager()
487{
Ed Masted4612ad2014-04-20 13:17:36 +0000488 if (m_file_manager_ap.get() == nullptr)
Greg Clayton38a61402010-12-02 23:20:03 +0000489 {
490 clang::FileSystemOptions file_system_options;
491 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
492 }
Sean Callanan79439e82010-11-18 02:56:27 +0000493 return m_file_manager_ap.get();
494}
495
Greg Claytone1a916a2010-07-21 22:12:05 +0000496clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000497ClangASTContext::getSourceManager()
498{
Ed Masted4612ad2014-04-20 13:17:36 +0000499 if (m_source_manager_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000500 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000501 return m_source_manager_ap.get();
502}
503
Sean Callanan880e6802011-10-07 23:18:13 +0000504clang::DiagnosticsEngine *
505ClangASTContext::getDiagnosticsEngine()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000506{
Ed Masted4612ad2014-04-20 13:17:36 +0000507 if (m_diagnostics_engine_ap.get() == nullptr)
Greg Claytona651b532010-11-19 21:46:54 +0000508 {
509 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callananec8f1ef2012-10-25 01:00:25 +0000510 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
Greg Claytona651b532010-11-19 21:46:54 +0000511 }
Sean Callanan880e6802011-10-07 23:18:13 +0000512 return m_diagnostics_engine_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000513}
514
Sean Callanan880e6802011-10-07 23:18:13 +0000515class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000516{
517public:
Sean Callanan880e6802011-10-07 23:18:13 +0000518 NullDiagnosticConsumer ()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000519 {
520 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
521 }
522
Sean Callanan880e6802011-10-07 23:18:13 +0000523 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000524 {
525 if (m_log)
526 {
Sean Callanan5b26f272012-02-04 08:49:35 +0000527 llvm::SmallVector<char, 32> diag_str(10);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000528 info.FormatDiagnostic(diag_str);
529 diag_str.push_back('\0');
530 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
531 }
532 }
Sean Callanan880e6802011-10-07 23:18:13 +0000533
534 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
535 {
536 return new NullDiagnosticConsumer ();
537 }
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000538private:
Greg Clayton5160ce52013-03-27 23:08:40 +0000539 Log * m_log;
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000540};
541
Sean Callanan880e6802011-10-07 23:18:13 +0000542DiagnosticConsumer *
543ClangASTContext::getDiagnosticConsumer()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000544{
Ed Masted4612ad2014-04-20 13:17:36 +0000545 if (m_diagnostic_consumer_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000546 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000547
Sean Callanan880e6802011-10-07 23:18:13 +0000548 return m_diagnostic_consumer_ap.get();
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000549}
550
Jason Molenda45938b92014-07-08 23:46:39 +0000551std::shared_ptr<TargetOptions> &
552ClangASTContext::getTargetOptions() {
Alp Tokeredc902f2014-07-05 03:06:05 +0000553 if (m_target_options_rp.get() == nullptr && !m_target_triple.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554 {
Alp Toker5f838642014-07-06 05:36:57 +0000555 m_target_options_rp = std::make_shared<TargetOptions>();
Alp Tokeredc902f2014-07-05 03:06:05 +0000556 if (m_target_options_rp.get() != nullptr)
Sean Callananc5069ad2012-10-17 22:11:14 +0000557 m_target_options_rp->Triple = m_target_triple;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000558 }
Alp Toker5f838642014-07-06 05:36:57 +0000559 return m_target_options_rp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000560}
561
562
563TargetInfo *
564ClangASTContext::getTargetInfo()
565{
Greg Clayton70512312012-05-08 01:45:38 +0000566 // target_triple should be something like "x86_64-apple-macosx"
Ed Masted4612ad2014-04-20 13:17:36 +0000567 if (m_target_info_ap.get() == nullptr && !m_target_triple.empty())
Greg Clayton38d880a2012-11-16 21:35:22 +0000568 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), getTargetOptions()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000569 return m_target_info_ap.get();
570}
571
572#pragma mark Basic Types
573
574static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000575QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000576{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000577 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000578 if (qual_type_bit_size == bit_size)
579 return true;
580 return false;
581}
Greg Claytona1e5dc82015-08-11 22:53:00 +0000582CompilerType
Greg Claytonc86103d2010-08-05 01:57:25 +0000583ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000584{
Greg Clayton57ee3062013-07-11 22:46:58 +0000585 return ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (getASTContext(), encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000586}
587
Greg Claytona1e5dc82015-08-11 22:53:00 +0000588CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +0000589ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000590{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000591 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +0000592 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000593 switch (encoding)
594 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000595 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000596 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000597 return CompilerType (ast, ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000598 break;
599
Greg Claytonc86103d2010-08-05 01:57:25 +0000600 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000601 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000602 return CompilerType (ast, ast->UnsignedCharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000603 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000604 return CompilerType (ast, ast->UnsignedShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000605 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000606 return CompilerType (ast, ast->UnsignedIntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000607 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000608 return CompilerType (ast, ast->UnsignedLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000609 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000610 return CompilerType (ast, ast->UnsignedLongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000611 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000612 return CompilerType (ast, ast->UnsignedInt128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000613 break;
614
Greg Claytonc86103d2010-08-05 01:57:25 +0000615 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000616 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000617 return CompilerType (ast, ast->CharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000618 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000619 return CompilerType (ast, ast->ShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000620 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000621 return CompilerType (ast, ast->IntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000622 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000623 return CompilerType (ast, ast->LongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000624 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000625 return CompilerType (ast, ast->LongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000626 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000627 return CompilerType (ast, ast->Int128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000628 break;
629
Greg Claytonc86103d2010-08-05 01:57:25 +0000630 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000631 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000632 return CompilerType (ast, ast->FloatTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000633 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000634 return CompilerType (ast, ast->DoubleTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000635 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000636 return CompilerType (ast, ast->LongDoubleTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000637 break;
638
Greg Claytonc86103d2010-08-05 01:57:25 +0000639 case eEncodingVector:
Johnny Chenc79c93a2012-03-07 01:12:24 +0000640 // Sanity check that bit_size is a multiple of 8's.
641 if (bit_size && !(bit_size & 0x7u))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000642 return CompilerType (ast, ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8));
Johnny Chenc79c93a2012-03-07 01:12:24 +0000643 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000644 }
645
Greg Claytona1e5dc82015-08-11 22:53:00 +0000646 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000647}
648
Greg Clayton57ee3062013-07-11 22:46:58 +0000649
650
651lldb::BasicType
652ClangASTContext::GetBasicTypeEnumeration (const ConstString &name)
653{
654 if (name)
655 {
656 typedef UniqueCStringMap<lldb::BasicType> TypeNameToBasicTypeMap;
657 static TypeNameToBasicTypeMap g_type_map;
658 static std::once_flag g_once_flag;
659 std::call_once(g_once_flag, [](){
660 // "void"
661 g_type_map.Append(ConstString("void").GetCString(), eBasicTypeVoid);
662
663 // "char"
664 g_type_map.Append(ConstString("char").GetCString(), eBasicTypeChar);
665 g_type_map.Append(ConstString("signed char").GetCString(), eBasicTypeSignedChar);
666 g_type_map.Append(ConstString("unsigned char").GetCString(), eBasicTypeUnsignedChar);
667 g_type_map.Append(ConstString("wchar_t").GetCString(), eBasicTypeWChar);
668 g_type_map.Append(ConstString("signed wchar_t").GetCString(), eBasicTypeSignedWChar);
669 g_type_map.Append(ConstString("unsigned wchar_t").GetCString(), eBasicTypeUnsignedWChar);
670 // "short"
671 g_type_map.Append(ConstString("short").GetCString(), eBasicTypeShort);
672 g_type_map.Append(ConstString("short int").GetCString(), eBasicTypeShort);
673 g_type_map.Append(ConstString("unsigned short").GetCString(), eBasicTypeUnsignedShort);
674 g_type_map.Append(ConstString("unsigned short int").GetCString(), eBasicTypeUnsignedShort);
675
676 // "int"
677 g_type_map.Append(ConstString("int").GetCString(), eBasicTypeInt);
678 g_type_map.Append(ConstString("signed int").GetCString(), eBasicTypeInt);
679 g_type_map.Append(ConstString("unsigned int").GetCString(), eBasicTypeUnsignedInt);
680 g_type_map.Append(ConstString("unsigned").GetCString(), eBasicTypeUnsignedInt);
681
682 // "long"
683 g_type_map.Append(ConstString("long").GetCString(), eBasicTypeLong);
684 g_type_map.Append(ConstString("long int").GetCString(), eBasicTypeLong);
685 g_type_map.Append(ConstString("unsigned long").GetCString(), eBasicTypeUnsignedLong);
686 g_type_map.Append(ConstString("unsigned long int").GetCString(), eBasicTypeUnsignedLong);
687
688 // "long long"
689 g_type_map.Append(ConstString("long long").GetCString(), eBasicTypeLongLong);
690 g_type_map.Append(ConstString("long long int").GetCString(), eBasicTypeLongLong);
691 g_type_map.Append(ConstString("unsigned long long").GetCString(), eBasicTypeUnsignedLongLong);
692 g_type_map.Append(ConstString("unsigned long long int").GetCString(), eBasicTypeUnsignedLongLong);
693
694 // "int128"
695 g_type_map.Append(ConstString("__int128_t").GetCString(), eBasicTypeInt128);
696 g_type_map.Append(ConstString("__uint128_t").GetCString(), eBasicTypeUnsignedInt128);
697
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000698 // Miscellaneous
Greg Clayton57ee3062013-07-11 22:46:58 +0000699 g_type_map.Append(ConstString("bool").GetCString(), eBasicTypeBool);
700 g_type_map.Append(ConstString("float").GetCString(), eBasicTypeFloat);
701 g_type_map.Append(ConstString("double").GetCString(), eBasicTypeDouble);
702 g_type_map.Append(ConstString("long double").GetCString(), eBasicTypeLongDouble);
703 g_type_map.Append(ConstString("id").GetCString(), eBasicTypeObjCID);
704 g_type_map.Append(ConstString("SEL").GetCString(), eBasicTypeObjCSel);
705 g_type_map.Append(ConstString("nullptr").GetCString(), eBasicTypeNullPtr);
706 g_type_map.Sort();
707 });
708
709 return g_type_map.Find(name.GetCString(), eBasicTypeInvalid);
710 }
711 return eBasicTypeInvalid;
712}
713
Greg Claytona1e5dc82015-08-11 22:53:00 +0000714CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000715ClangASTContext::GetBasicType (ASTContext *ast, const ConstString &name)
716{
717 if (ast)
718 {
719 lldb::BasicType basic_type = ClangASTContext::GetBasicTypeEnumeration (name);
720 return ClangASTContext::GetBasicType (ast, basic_type);
721 }
Greg Claytona1e5dc82015-08-11 22:53:00 +0000722 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +0000723}
724
725uint32_t
726ClangASTContext::GetPointerByteSize ()
727{
728 if (m_pointer_byte_size == 0)
Enrico Granata1cd5e922015-01-28 00:07:51 +0000729 m_pointer_byte_size = GetBasicType(lldb::eBasicTypeVoid).GetPointerType().GetByteSize(nullptr);
Greg Clayton57ee3062013-07-11 22:46:58 +0000730 return m_pointer_byte_size;
731}
732
Greg Claytona1e5dc82015-08-11 22:53:00 +0000733CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000734ClangASTContext::GetBasicType (lldb::BasicType basic_type)
735{
736 return GetBasicType (getASTContext(), basic_type);
737}
738
Greg Claytona1e5dc82015-08-11 22:53:00 +0000739CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000740ClangASTContext::GetBasicType (ASTContext *ast, lldb::BasicType basic_type)
741{
742 if (ast)
743 {
Ed Masted4612ad2014-04-20 13:17:36 +0000744 clang_type_t clang_type = nullptr;
Greg Clayton57ee3062013-07-11 22:46:58 +0000745
746 switch (basic_type)
747 {
748 case eBasicTypeInvalid:
749 case eBasicTypeOther:
750 break;
751 case eBasicTypeVoid:
752 clang_type = ast->VoidTy.getAsOpaquePtr();
753 break;
754 case eBasicTypeChar:
755 clang_type = ast->CharTy.getAsOpaquePtr();
756 break;
757 case eBasicTypeSignedChar:
758 clang_type = ast->SignedCharTy.getAsOpaquePtr();
759 break;
760 case eBasicTypeUnsignedChar:
761 clang_type = ast->UnsignedCharTy.getAsOpaquePtr();
762 break;
763 case eBasicTypeWChar:
764 clang_type = ast->getWCharType().getAsOpaquePtr();
765 break;
766 case eBasicTypeSignedWChar:
767 clang_type = ast->getSignedWCharType().getAsOpaquePtr();
768 break;
769 case eBasicTypeUnsignedWChar:
770 clang_type = ast->getUnsignedWCharType().getAsOpaquePtr();
771 break;
772 case eBasicTypeChar16:
773 clang_type = ast->Char16Ty.getAsOpaquePtr();
774 break;
775 case eBasicTypeChar32:
776 clang_type = ast->Char32Ty.getAsOpaquePtr();
777 break;
778 case eBasicTypeShort:
779 clang_type = ast->ShortTy.getAsOpaquePtr();
780 break;
781 case eBasicTypeUnsignedShort:
782 clang_type = ast->UnsignedShortTy.getAsOpaquePtr();
783 break;
784 case eBasicTypeInt:
785 clang_type = ast->IntTy.getAsOpaquePtr();
786 break;
787 case eBasicTypeUnsignedInt:
788 clang_type = ast->UnsignedIntTy.getAsOpaquePtr();
789 break;
790 case eBasicTypeLong:
791 clang_type = ast->LongTy.getAsOpaquePtr();
792 break;
793 case eBasicTypeUnsignedLong:
794 clang_type = ast->UnsignedLongTy.getAsOpaquePtr();
795 break;
796 case eBasicTypeLongLong:
797 clang_type = ast->LongLongTy.getAsOpaquePtr();
798 break;
799 case eBasicTypeUnsignedLongLong:
800 clang_type = ast->UnsignedLongLongTy.getAsOpaquePtr();
801 break;
802 case eBasicTypeInt128:
803 clang_type = ast->Int128Ty.getAsOpaquePtr();
804 break;
805 case eBasicTypeUnsignedInt128:
806 clang_type = ast->UnsignedInt128Ty.getAsOpaquePtr();
807 break;
808 case eBasicTypeBool:
809 clang_type = ast->BoolTy.getAsOpaquePtr();
810 break;
811 case eBasicTypeHalf:
812 clang_type = ast->HalfTy.getAsOpaquePtr();
813 break;
814 case eBasicTypeFloat:
815 clang_type = ast->FloatTy.getAsOpaquePtr();
816 break;
817 case eBasicTypeDouble:
818 clang_type = ast->DoubleTy.getAsOpaquePtr();
819 break;
820 case eBasicTypeLongDouble:
821 clang_type = ast->LongDoubleTy.getAsOpaquePtr();
822 break;
823 case eBasicTypeFloatComplex:
824 clang_type = ast->FloatComplexTy.getAsOpaquePtr();
825 break;
826 case eBasicTypeDoubleComplex:
827 clang_type = ast->DoubleComplexTy.getAsOpaquePtr();
828 break;
829 case eBasicTypeLongDoubleComplex:
830 clang_type = ast->LongDoubleComplexTy.getAsOpaquePtr();
831 break;
832 case eBasicTypeObjCID:
833 clang_type = ast->getObjCIdType().getAsOpaquePtr();
834 break;
835 case eBasicTypeObjCClass:
836 clang_type = ast->getObjCClassType().getAsOpaquePtr();
837 break;
838 case eBasicTypeObjCSel:
839 clang_type = ast->getObjCSelType().getAsOpaquePtr();
840 break;
841 case eBasicTypeNullPtr:
842 clang_type = ast->NullPtrTy.getAsOpaquePtr();
843 break;
844 }
845
846 if (clang_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +0000847 return CompilerType (GetASTContext(ast), clang_type);
Greg Clayton57ee3062013-07-11 22:46:58 +0000848 }
Greg Claytona1e5dc82015-08-11 22:53:00 +0000849 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +0000850}
851
852
Greg Claytona1e5dc82015-08-11 22:53:00 +0000853CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000854ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
855{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000856 ASTContext *ast = getASTContext();
Sean Callanan38d4df52012-04-03 01:10:10 +0000857
858#define streq(a,b) strcmp(a,b) == 0
Ed Masted4612ad2014-04-20 13:17:36 +0000859 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000860 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000861 {
862 switch (dw_ate)
863 {
Sean Callanan38d4df52012-04-03 01:10:10 +0000864 default:
865 break;
Greg Clayton605684e2011-10-28 23:06:08 +0000866
Sean Callanan38d4df52012-04-03 01:10:10 +0000867 case DW_ATE_address:
868 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000869 return CompilerType (ast, ast->VoidPtrTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000870 break;
871
872 case DW_ATE_boolean:
873 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000874 return CompilerType (ast, ast->BoolTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000875 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000876 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000877 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000878 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000879 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000880 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000881 break;
882
883 case DW_ATE_lo_user:
884 // This has been seen to mean DW_AT_complex_integer
885 if (type_name)
Greg Clayton605684e2011-10-28 23:06:08 +0000886 {
Sean Callanan38d4df52012-04-03 01:10:10 +0000887 if (::strstr(type_name, "complex"))
888 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000889 CompilerType complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
890 return CompilerType (ast, ast->getComplexType (GetQualType(complex_int_clang_type)));
Sean Callanan38d4df52012-04-03 01:10:10 +0000891 }
Greg Clayton605684e2011-10-28 23:06:08 +0000892 }
Sean Callanan38d4df52012-04-03 01:10:10 +0000893 break;
894
895 case DW_ATE_complex_float:
896 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000897 return CompilerType (ast, ast->FloatComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000898 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000899 return CompilerType (ast, ast->DoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000900 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000901 return CompilerType (ast, ast->LongDoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000902 else
Greg Clayton605684e2011-10-28 23:06:08 +0000903 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000904 CompilerType complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
905 return CompilerType (ast, ast->getComplexType (GetQualType(complex_float_clang_type)));
Greg Clayton605684e2011-10-28 23:06:08 +0000906 }
Sean Callanan38d4df52012-04-03 01:10:10 +0000907 break;
908
909 case DW_ATE_float:
Greg Clayton8012cad2014-11-17 19:39:20 +0000910 if (streq(type_name, "float") && QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000911 return CompilerType (ast, ast->FloatTy);
Greg Clayton8012cad2014-11-17 19:39:20 +0000912 if (streq(type_name, "double") && QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000913 return CompilerType (ast, ast->DoubleTy);
Greg Clayton8012cad2014-11-17 19:39:20 +0000914 if (streq(type_name, "long double") && QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000915 return CompilerType (ast, ast->LongDoubleTy);
Bruce Mitchenere171da52015-07-22 00:16:02 +0000916 // Fall back to not requiring a name match
Sean Callanan38d4df52012-04-03 01:10:10 +0000917 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000918 return CompilerType (ast, ast->FloatTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000919 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000920 return CompilerType (ast, ast->DoubleTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000921 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000922 return CompilerType (ast, ast->LongDoubleTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000923 break;
924
925 case DW_ATE_signed:
926 if (type_name)
927 {
928 if (streq(type_name, "wchar_t") &&
Tamas Berghammer3c0d0052015-04-01 09:48:02 +0000929 QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy) &&
Greg Clayton28eb7bf2015-05-07 00:07:44 +0000930 (getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000931 return CompilerType (ast, ast->WCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000932 if (streq(type_name, "void") &&
933 QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000934 return CompilerType (ast, ast->VoidTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000935 if (strstr(type_name, "long long") &&
936 QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000937 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000938 if (strstr(type_name, "long") &&
939 QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000940 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000941 if (strstr(type_name, "short") &&
942 QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000943 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000944 if (strstr(type_name, "char"))
945 {
946 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000947 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000948 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000949 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000950 }
951 if (strstr(type_name, "int"))
952 {
953 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000954 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000955 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000956 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +0000957 }
958 }
959 // We weren't able to match up a type name, just search by size
960 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000961 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000962 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000963 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000964 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000965 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000966 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000967 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000968 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000969 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000970 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000971 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +0000972 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000973
Sean Callanan38d4df52012-04-03 01:10:10 +0000974 case DW_ATE_signed_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000975 if (ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
Sean Callanan38d4df52012-04-03 01:10:10 +0000976 {
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000977 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000978 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000979 }
Sean Callanan38d4df52012-04-03 01:10:10 +0000980 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000981 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000982 break;
983
984 case DW_ATE_unsigned:
985 if (type_name)
986 {
Tamas Berghammer3c0d0052015-04-01 09:48:02 +0000987 if (streq(type_name, "wchar_t"))
988 {
989 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
990 {
Greg Clayton28eb7bf2015-05-07 00:07:44 +0000991 if (!(getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000992 return CompilerType (ast, ast->WCharTy);
Tamas Berghammer3c0d0052015-04-01 09:48:02 +0000993 }
994 }
Sean Callanan38d4df52012-04-03 01:10:10 +0000995 if (strstr(type_name, "long long"))
996 {
997 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000998 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000999 }
1000 else if (strstr(type_name, "long"))
1001 {
1002 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001003 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001004 }
1005 else if (strstr(type_name, "short"))
1006 {
1007 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001008 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001009 }
1010 else if (strstr(type_name, "char"))
1011 {
1012 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001013 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001014 }
1015 else if (strstr(type_name, "int"))
1016 {
1017 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001018 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001019 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001020 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001021 }
1022 }
1023 // We weren't able to match up a type name, just search by size
1024 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001025 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001026 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001027 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001028 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001029 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001030 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001031 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001032 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001033 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001034 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001035 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001036 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001037
Sean Callanan38d4df52012-04-03 01:10:10 +00001038 case DW_ATE_unsigned_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001039 if (!ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
1040 {
1041 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001042 return CompilerType (ast, ast->CharTy);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001043 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001044 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001045 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001046 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001047 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001048 break;
1049
1050 case DW_ATE_imaginary_float:
1051 break;
1052
1053 case DW_ATE_UTF:
1054 if (type_name)
1055 {
1056 if (streq(type_name, "char16_t"))
1057 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001058 return CompilerType (ast, ast->Char16Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001059 }
1060 else if (streq(type_name, "char32_t"))
1061 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001062 return CompilerType (ast, ast->Char32Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001063 }
1064 }
1065 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001066 }
1067 }
1068 // This assert should fire for anything that we don't catch above so we know
1069 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +00001070 if (type_name)
1071 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001072 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 +00001073 }
1074 else
1075 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001076 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 +00001077 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001078 return CompilerType ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001079}
1080
Greg Claytona1e5dc82015-08-11 22:53:00 +00001081CompilerType
Sean Callanan77502262011-05-12 23:54:16 +00001082ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
1083{
Greg Clayton57ee3062013-07-11 22:46:58 +00001084 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001085 return CompilerType (ast, ast->UnknownAnyTy);
1086 return CompilerType();
Sean Callanan77502262011-05-12 23:54:16 +00001087}
1088
Greg Claytona1e5dc82015-08-11 22:53:00 +00001089CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001090ClangASTContext::GetCStringType (bool is_const)
1091{
Greg Clayton57ee3062013-07-11 22:46:58 +00001092 ASTContext *ast = getASTContext();
1093 QualType char_type(ast->CharTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001094
1095 if (is_const)
1096 char_type.addConst();
1097
Greg Claytona1e5dc82015-08-11 22:53:00 +00001098 return CompilerType (ast, ast->getPointerType(char_type));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001099}
1100
Sean Callanan09ab4b72011-11-30 22:11:59 +00001101clang::DeclContext *
1102ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
1103{
1104 return ast->getTranslationUnitDecl();
1105}
1106
Greg Claytona1e5dc82015-08-11 22:53:00 +00001107CompilerType
Greg Clayton38a61402010-12-02 23:20:03 +00001108ClangASTContext::CopyType (ASTContext *dst_ast,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001109 CompilerType src)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001110{
Sean Callanan79439e82010-11-18 02:56:27 +00001111 FileSystemOptions file_system_options;
Greg Claytond8d4a572015-08-11 21:38:15 +00001112 ClangASTContext *src_ast = src.GetTypeSystem()->AsClangASTContext();
1113 if (src_ast == nullptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001114 return CompilerType();
Greg Clayton38a61402010-12-02 23:20:03 +00001115 FileManager file_manager (file_system_options);
1116 ASTImporter importer(*dst_ast, file_manager,
Greg Claytond8d4a572015-08-11 21:38:15 +00001117 *src_ast->getASTContext(), file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001118 false);
Sean Callanan0617fcb2010-11-09 22:37:10 +00001119
Greg Claytond8d4a572015-08-11 21:38:15 +00001120 QualType dst (importer.Import(GetQualType(src)));
Sean Callanan0617fcb2010-11-09 22:37:10 +00001121
Greg Claytona1e5dc82015-08-11 22:53:00 +00001122 return CompilerType (dst_ast, dst);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001123}
1124
Greg Clayton526e5af2010-11-13 03:52:47 +00001125
1126clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001127ClangASTContext::CopyDecl (ASTContext *dst_ast,
1128 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001129 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001130{
Sean Callanan79439e82010-11-18 02:56:27 +00001131 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001132 FileManager file_manager (file_system_options);
1133 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001134 *src_ast, file_manager,
1135 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001136
1137 return importer.Import(source_decl);
1138}
1139
Sean Callanan23a30272010-07-16 00:00:27 +00001140bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00001141ClangASTContext::AreTypesSame (CompilerType type1,
1142 CompilerType type2,
Greg Clayton84db9102012-03-26 23:03:23 +00001143 bool ignore_qualifiers)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001144{
Greg Claytond8d4a572015-08-11 21:38:15 +00001145 TypeSystem *ast = type1.GetTypeSystem();
1146 if (!ast->AsClangASTContext() || ast != type2.GetTypeSystem())
Greg Clayton57ee3062013-07-11 22:46:58 +00001147 return false;
1148
1149 if (type1.GetOpaqueQualType() == type2.GetOpaqueQualType())
Greg Clayton55995eb2012-04-06 17:38:55 +00001150 return true;
1151
Greg Claytond8d4a572015-08-11 21:38:15 +00001152 QualType type1_qual = GetQualType(type1);
1153 QualType type2_qual = GetQualType(type2);
Sean Callanan5056ab02012-02-18 02:01:03 +00001154
1155 if (ignore_qualifiers)
1156 {
1157 type1_qual = type1_qual.getUnqualifiedType();
1158 type2_qual = type2_qual.getUnqualifiedType();
1159 }
1160
Greg Claytond8d4a572015-08-11 21:38:15 +00001161 return ast->AsClangASTContext()->getASTContext()->hasSameType (type1_qual, type2_qual);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001162}
1163
Greg Claytona1e5dc82015-08-11 22:53:00 +00001164CompilerType
Sean Callanan9998acd2014-12-05 01:21:59 +00001165ClangASTContext::GetTypeForDecl (clang::NamedDecl *decl)
1166{
1167 if (clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
1168 return GetTypeForDecl(interface_decl);
1169 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
1170 return GetTypeForDecl(tag_decl);
Greg Claytona1e5dc82015-08-11 22:53:00 +00001171 return CompilerType();
Sean Callanan9998acd2014-12-05 01:21:59 +00001172}
1173
Greg Clayton6beaaa62011-01-17 03:46:26 +00001174
Greg Claytona1e5dc82015-08-11 22:53:00 +00001175CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001176ClangASTContext::GetTypeForDecl (TagDecl *decl)
1177{
1178 // No need to call the getASTContext() accessor (which can create the AST
1179 // if it isn't created yet, because we can't have created a decl in this
1180 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001181 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001182 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001183 return CompilerType (ast, ast->getTagDeclType(decl));
1184 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001185}
1186
Greg Claytona1e5dc82015-08-11 22:53:00 +00001187CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001188ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1189{
1190 // No need to call the getASTContext() accessor (which can create the AST
1191 // if it isn't created yet, because we can't have created a decl in this
1192 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001193 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001194 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001195 return CompilerType (ast, ast->getObjCInterfaceType(decl));
1196 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001197}
1198
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001199#pragma mark Structure, Unions, Classes
1200
Greg Claytona1e5dc82015-08-11 22:53:00 +00001201CompilerType
Greg Claytonc4ffd662013-03-08 01:37:30 +00001202ClangASTContext::CreateRecordType (DeclContext *decl_ctx,
1203 AccessType access_type,
1204 const char *name,
1205 int kind,
1206 LanguageType language,
1207 ClangASTMetadata *metadata)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001208{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001209 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001210 assert (ast != nullptr);
Sean Callananad880762012-04-18 01:06:17 +00001211
Ed Masted4612ad2014-04-20 13:17:36 +00001212 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001213 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001214
Greg Clayton9e409562010-07-28 02:04:09 +00001215
Greg Claytone1be9962011-08-24 23:50:00 +00001216 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001217 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001218 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001219 bool isInternal = false;
Sean Callananad880762012-04-18 01:06:17 +00001220 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
Greg Clayton9e409562010-07-28 02:04:09 +00001221 }
1222
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001223 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1224 // we will need to update this code. I was told to currently always use
1225 // the CXXRecordDecl class since we often don't know from debug information
1226 // if something is struct or a class, so we default to always use the more
1227 // complete definition just in case.
Sean Callanan11e32d32014-02-18 00:31:38 +00001228
1229 bool is_anonymous = (!name) || (!name[0]);
1230
Greg Claytonf0705c82011-10-22 03:33:13 +00001231 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1232 (TagDecl::TagKind)kind,
1233 decl_ctx,
1234 SourceLocation(),
1235 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001236 is_anonymous ? nullptr : &ast->Idents.get(name));
Sean Callanan11e32d32014-02-18 00:31:38 +00001237
1238 if (is_anonymous)
1239 decl->setAnonymousStructOrUnion(true);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001240
Greg Claytonc4ffd662013-03-08 01:37:30 +00001241 if (decl)
Greg Clayton55561e92011-10-26 03:31:36 +00001242 {
Greg Claytonc4ffd662013-03-08 01:37:30 +00001243 if (metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001244 SetMetadata(ast, decl, *metadata);
Greg Claytonc4ffd662013-03-08 01:37:30 +00001245
Greg Clayton55561e92011-10-26 03:31:36 +00001246 if (access_type != eAccessNone)
1247 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Claytonc4ffd662013-03-08 01:37:30 +00001248
1249 if (decl_ctx)
1250 decl_ctx->addDecl (decl);
1251
Greg Claytona1e5dc82015-08-11 22:53:00 +00001252 return CompilerType(ast, ast->getTagDeclType(decl));
Greg Clayton55561e92011-10-26 03:31:36 +00001253 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001254 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001255}
1256
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001257static TemplateParameterList *
1258CreateTemplateParameterList (ASTContext *ast,
Sean Callanan3d654b32012-09-24 22:25:51 +00001259 const ClangASTContext::TemplateParameterInfos &template_param_infos,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001260 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1261{
1262 const bool parameter_pack = false;
1263 const bool is_typename = false;
1264 const unsigned depth = 0;
1265 const size_t num_template_params = template_param_infos.GetSize();
1266 for (size_t i=0; i<num_template_params; ++i)
1267 {
1268 const char *name = template_param_infos.names[i];
Greg Clayton283b2652013-04-23 22:38:02 +00001269
Ed Masted4612ad2014-04-20 13:17:36 +00001270 IdentifierInfo *identifier_info = nullptr;
Greg Clayton283b2652013-04-23 22:38:02 +00001271 if (name && name[0])
1272 identifier_info = &ast->Idents.get(name);
Sean Callanan3d654b32012-09-24 22:25:51 +00001273 if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001274 {
1275 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1276 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1277 SourceLocation(),
1278 SourceLocation(),
1279 depth,
1280 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001281 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001282 template_param_infos.args[i].getIntegralType(),
1283 parameter_pack,
Ed Masted4612ad2014-04-20 13:17:36 +00001284 nullptr));
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001285
1286 }
1287 else
1288 {
1289 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1290 ast->getTranslationUnitDecl(), // Is this the right decl context?
1291 SourceLocation(),
1292 SourceLocation(),
1293 depth,
1294 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001295 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001296 is_typename,
1297 parameter_pack));
1298 }
1299 }
1300
1301 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1302 SourceLocation(),
1303 SourceLocation(),
1304 &template_param_decls.front(),
1305 template_param_decls.size(),
1306 SourceLocation());
1307 return template_param_list;
1308}
1309
1310clang::FunctionTemplateDecl *
1311ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1312 clang::FunctionDecl *func_decl,
1313 const char *name,
1314 const TemplateParameterInfos &template_param_infos)
1315{
1316// /// \brief Create a function template node.
1317 ASTContext *ast = getASTContext();
1318
1319 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1320
1321 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1322 template_param_infos,
1323 template_param_decls);
1324 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1325 decl_ctx,
1326 func_decl->getLocation(),
1327 func_decl->getDeclName(),
1328 template_param_list,
1329 func_decl);
1330
1331 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1332 i < template_param_decl_count;
1333 ++i)
1334 {
1335 // TODO: verify which decl context we should put template_param_decls into..
1336 template_param_decls[i]->setDeclContext (func_decl);
1337 }
1338
1339 return func_tmpl_decl;
1340}
1341
1342void
1343ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1344 clang::FunctionTemplateDecl *func_tmpl_decl,
1345 const TemplateParameterInfos &infos)
1346{
1347 TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1348 infos.args.data(),
1349 infos.args.size());
1350
1351 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1352 &template_args,
Ed Masted4612ad2014-04-20 13:17:36 +00001353 nullptr);
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001354}
1355
1356
Greg Claytonf0705c82011-10-22 03:33:13 +00001357ClassTemplateDecl *
1358ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001359 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001360 const char *class_name,
1361 int kind,
1362 const TemplateParameterInfos &template_param_infos)
1363{
1364 ASTContext *ast = getASTContext();
1365
Ed Masted4612ad2014-04-20 13:17:36 +00001366 ClassTemplateDecl *class_template_decl = nullptr;
1367 if (decl_ctx == nullptr)
Greg Claytonf0705c82011-10-22 03:33:13 +00001368 decl_ctx = ast->getTranslationUnitDecl();
1369
1370 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1371 DeclarationName decl_name (&identifier_info);
1372
1373 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001374
1375 for (NamedDecl *decl : result)
Greg Claytonf0705c82011-10-22 03:33:13 +00001376 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001377 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
Greg Claytonf0705c82011-10-22 03:33:13 +00001378 if (class_template_decl)
1379 return class_template_decl;
1380 }
1381
1382 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf0705c82011-10-22 03:33:13 +00001383
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001384 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1385 template_param_infos,
1386 template_param_decls);
Greg Claytonf0705c82011-10-22 03:33:13 +00001387
1388 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1389 (TagDecl::TagKind)kind,
1390 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1391 SourceLocation(),
1392 SourceLocation(),
1393 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001394
1395 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1396 i < template_param_decl_count;
1397 ++i)
1398 {
1399 template_param_decls[i]->setDeclContext (template_cxx_decl);
1400 }
1401
Sean Callananb5c79622011-11-19 01:35:08 +00001402 // With templated classes, we say that a class is templated with
1403 // specializations, but that the bare class has no functions.
Sean Callananfa4fab72013-02-01 06:55:48 +00001404 //template_cxx_decl->startDefinition();
1405 //template_cxx_decl->completeDefinition();
Sean Callananb5c79622011-11-19 01:35:08 +00001406
Greg Claytonf0705c82011-10-22 03:33:13 +00001407 class_template_decl = ClassTemplateDecl::Create (*ast,
1408 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1409 SourceLocation(),
1410 decl_name,
1411 template_param_list,
1412 template_cxx_decl,
Ed Masted4612ad2014-04-20 13:17:36 +00001413 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001414
1415 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001416 {
Greg Clayton55561e92011-10-26 03:31:36 +00001417 if (access_type != eAccessNone)
1418 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan5b26f272012-02-04 08:49:35 +00001419
1420 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1421 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1422
Greg Claytonf0705c82011-10-22 03:33:13 +00001423 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001424
1425#ifdef LLDB_CONFIGURATION_DEBUG
1426 VerifyDecl(class_template_decl);
1427#endif
1428 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001429
1430 return class_template_decl;
1431}
1432
1433
1434ClassTemplateSpecializationDecl *
1435ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1436 ClassTemplateDecl *class_template_decl,
1437 int kind,
1438 const TemplateParameterInfos &template_param_infos)
1439{
1440 ASTContext *ast = getASTContext();
1441 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1442 (TagDecl::TagKind)kind,
1443 decl_ctx,
1444 SourceLocation(),
1445 SourceLocation(),
1446 class_template_decl,
1447 &template_param_infos.args.front(),
1448 template_param_infos.args.size(),
Ed Masted4612ad2014-04-20 13:17:36 +00001449 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001450
Sean Callananfa4fab72013-02-01 06:55:48 +00001451 class_template_specialization_decl->setSpecializationKind(TSK_ExplicitSpecialization);
1452
Greg Claytonf0705c82011-10-22 03:33:13 +00001453 return class_template_specialization_decl;
1454}
1455
Greg Claytona1e5dc82015-08-11 22:53:00 +00001456CompilerType
Greg Claytonf0705c82011-10-22 03:33:13 +00001457ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1458{
1459 if (class_template_specialization_decl)
1460 {
1461 ASTContext *ast = getASTContext();
1462 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001463 return CompilerType(ast, ast->getTagDeclType(class_template_specialization_decl));
Greg Claytonf0705c82011-10-22 03:33:13 +00001464 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001465 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001466}
1467
Greg Clayton090d0982011-06-19 03:43:27 +00001468static inline bool
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001469check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001470{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001471 // Special-case call since it can take any number of operands
1472 if(op_kind == OO_Call)
1473 return true;
1474
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001475 // The parameter count doesn't include "this"
Greg Clayton090d0982011-06-19 03:43:27 +00001476 if (num_params == 0)
1477 return unary;
1478 if (num_params == 1)
1479 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001480 else
Greg Clayton090d0982011-06-19 03:43:27 +00001481 return false;
1482}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001483
Greg Clayton090d0982011-06-19 03:43:27 +00001484bool
1485ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1486{
Sean Callanan5b26f272012-02-04 08:49:35 +00001487 switch (op_kind)
1488 {
1489 default:
1490 break;
1491 // C++ standard allows any number of arguments to new/delete
1492 case OO_New:
1493 case OO_Array_New:
1494 case OO_Delete:
1495 case OO_Array_Delete:
1496 return true;
1497 }
1498
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001499#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 +00001500 switch (op_kind)
1501 {
1502#include "clang/Basic/OperatorKinds.def"
1503 default: break;
1504 }
1505 return false;
1506}
1507
Greg Clayton57ee3062013-07-11 22:46:58 +00001508clang::AccessSpecifier
1509ClangASTContext::UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs)
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001510{
1511 clang::AccessSpecifier ret = lhs;
1512
1513 // Make the access equal to the stricter of the field and the nested field's access
1514 switch (ret)
1515 {
1516 case clang::AS_none:
1517 break;
1518 case clang::AS_private:
1519 break;
1520 case clang::AS_protected:
1521 if (rhs == AS_private)
1522 ret = AS_private;
1523 break;
1524 case clang::AS_public:
1525 ret = rhs;
1526 break;
1527 }
1528
1529 return ret;
1530}
1531
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001532bool
1533ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1534{
1535 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1536}
1537
1538bool
1539ClangASTContext::FieldIsBitfield
1540(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001541 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001542 FieldDecl* field,
1543 uint32_t& bitfield_bit_size
1544)
1545{
Ed Masted4612ad2014-04-20 13:17:36 +00001546 if (ast == nullptr || field == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001547 return false;
1548
1549 if (field->isBitField())
1550 {
1551 Expr* bit_width_expr = field->getBitWidth();
1552 if (bit_width_expr)
1553 {
1554 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001555 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001556 {
1557 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1558 return true;
1559 }
1560 }
1561 }
1562 return false;
1563}
1564
1565bool
1566ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1567{
Ed Masted4612ad2014-04-20 13:17:36 +00001568 if (record_decl == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001569 return false;
1570
1571 if (!record_decl->field_empty())
1572 return true;
1573
1574 // No fields, lets check this is a CXX record and check the base classes
1575 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1576 if (cxx_record_decl)
1577 {
1578 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1579 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1580 base_class != base_class_end;
1581 ++base_class)
1582 {
1583 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1584 if (RecordHasFields(base_class_decl))
1585 return true;
1586 }
1587 }
1588 return false;
1589}
1590
Greg Clayton8cf05932010-07-22 18:30:50 +00001591#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001592
Greg Claytona1e5dc82015-08-11 22:53:00 +00001593CompilerType
Sean Callananad880762012-04-18 01:06:17 +00001594ClangASTContext::CreateObjCClass
Greg Clayton8cf05932010-07-22 18:30:50 +00001595(
1596 const char *name,
1597 DeclContext *decl_ctx,
1598 bool isForwardDecl,
Sean Callananad880762012-04-18 01:06:17 +00001599 bool isInternal,
Jim Ingham379397632012-10-27 02:54:13 +00001600 ClangASTMetadata *metadata
Greg Clayton8cf05932010-07-22 18:30:50 +00001601)
1602{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001603 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001604 assert (ast != nullptr);
Greg Clayton8cf05932010-07-22 18:30:50 +00001605 assert (name && name[0]);
Ed Masted4612ad2014-04-20 13:17:36 +00001606 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001607 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00001608
Greg Clayton6beaaa62011-01-17 03:46:26 +00001609 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001610 decl_ctx,
1611 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001612 &ast->Idents.get(name),
Ed Masted4612ad2014-04-20 13:17:36 +00001613 nullptr,
Pavel Labath67add942015-07-07 10:11:16 +00001614 nullptr,
Greg Clayton8cf05932010-07-22 18:30:50 +00001615 SourceLocation(),
Sean Callanan5b26f272012-02-04 08:49:35 +00001616 /*isForwardDecl,*/
Greg Clayton8cf05932010-07-22 18:30:50 +00001617 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00001618
Jim Ingham379397632012-10-27 02:54:13 +00001619 if (decl && metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001620 SetMetadata(ast, decl, *metadata);
Sean Callananad880762012-04-18 01:06:17 +00001621
Greg Claytona1e5dc82015-08-11 22:53:00 +00001622 return CompilerType (ast, ast->getObjCInterfaceType(decl));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001623}
1624
1625static inline bool
1626BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
1627{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001628 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001629}
1630
Greg Clayton57ee3062013-07-11 22:46:58 +00001631uint32_t
1632ClangASTContext::GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001633{
1634 uint32_t num_bases = 0;
1635 if (cxx_record_decl)
1636 {
1637 if (omit_empty_base_classes)
1638 {
1639 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1640 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1641 base_class != base_class_end;
1642 ++base_class)
1643 {
1644 // Skip empty base classes
1645 if (omit_empty_base_classes)
1646 {
1647 if (BaseSpecifierIsEmpty (base_class))
1648 continue;
1649 }
1650 ++num_bases;
1651 }
1652 }
1653 else
1654 num_bases = cxx_record_decl->getNumBases();
1655 }
1656 return num_bases;
1657}
1658
1659
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001660#pragma mark Namespace Declarations
1661
1662NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00001663ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001664{
Ed Masted4612ad2014-04-20 13:17:36 +00001665 NamespaceDecl *namespace_decl = nullptr;
Greg Clayton9d3d6882011-10-31 23:51:19 +00001666 ASTContext *ast = getASTContext();
1667 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
Ed Masted4612ad2014-04-20 13:17:36 +00001668 if (decl_ctx == nullptr)
Greg Clayton9d3d6882011-10-31 23:51:19 +00001669 decl_ctx = translation_unit_decl;
1670
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001671 if (name)
1672 {
Greg Clayton030a2042011-10-14 21:34:45 +00001673 IdentifierInfo &identifier_info = ast->Idents.get(name);
1674 DeclarationName decl_name (&identifier_info);
1675 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001676 for (NamedDecl *decl : result)
Greg Clayton030a2042011-10-14 21:34:45 +00001677 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001678 namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
Greg Clayton030a2042011-10-14 21:34:45 +00001679 if (namespace_decl)
1680 return namespace_decl;
1681 }
1682
Sean Callanan5b26f272012-02-04 08:49:35 +00001683 namespace_decl = NamespaceDecl::Create(*ast,
1684 decl_ctx,
1685 false,
1686 SourceLocation(),
1687 SourceLocation(),
1688 &identifier_info,
Ed Masted4612ad2014-04-20 13:17:36 +00001689 nullptr);
Greg Clayton030a2042011-10-14 21:34:45 +00001690
Greg Clayton9d3d6882011-10-31 23:51:19 +00001691 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001692 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001693 else
1694 {
1695 if (decl_ctx == translation_unit_decl)
1696 {
1697 namespace_decl = translation_unit_decl->getAnonymousNamespace();
1698 if (namespace_decl)
1699 return namespace_decl;
1700
Sean Callanan5b26f272012-02-04 08:49:35 +00001701 namespace_decl = NamespaceDecl::Create(*ast,
1702 decl_ctx,
1703 false,
1704 SourceLocation(),
1705 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001706 nullptr,
1707 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001708 translation_unit_decl->setAnonymousNamespace (namespace_decl);
1709 translation_unit_decl->addDecl (namespace_decl);
1710 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
1711 }
1712 else
1713 {
1714 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
1715 if (parent_namespace_decl)
1716 {
1717 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
1718 if (namespace_decl)
1719 return namespace_decl;
Sean Callanan5b26f272012-02-04 08:49:35 +00001720 namespace_decl = NamespaceDecl::Create(*ast,
1721 decl_ctx,
1722 false,
1723 SourceLocation(),
1724 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001725 nullptr,
1726 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001727 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
1728 parent_namespace_decl->addDecl (namespace_decl);
1729 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
1730 }
1731 else
1732 {
1733 // BAD!!!
1734 }
1735 }
1736
1737
1738 if (namespace_decl)
1739 {
1740 // If we make it here, we are creating the anonymous namespace decl
1741 // for the first time, so we need to do the using directive magic
1742 // like SEMA does
1743 UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast,
1744 decl_ctx,
1745 SourceLocation(),
1746 SourceLocation(),
1747 NestedNameSpecifierLoc(),
1748 SourceLocation(),
1749 namespace_decl,
1750 decl_ctx);
1751 using_directive_decl->setImplicit();
1752 decl_ctx->addDecl(using_directive_decl);
1753 }
1754 }
1755#ifdef LLDB_CONFIGURATION_DEBUG
1756 VerifyDecl(namespace_decl);
1757#endif
Greg Clayton030a2042011-10-14 21:34:45 +00001758 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001759}
1760
1761
1762#pragma mark Function Types
1763
1764FunctionDecl *
Greg Clayton57ee3062013-07-11 22:46:58 +00001765ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx,
1766 const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001767 const CompilerType &function_clang_type,
Greg Clayton57ee3062013-07-11 22:46:58 +00001768 int storage,
1769 bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001770{
Ed Masted4612ad2014-04-20 13:17:36 +00001771 FunctionDecl *func_decl = nullptr;
Greg Clayton147e1fa2011-10-14 22:47:18 +00001772 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001773 if (decl_ctx == nullptr)
Greg Clayton147e1fa2011-10-14 22:47:18 +00001774 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001775
Greg Clayton0d551042013-06-28 21:08:47 +00001776
1777 const bool hasWrittenPrototype = true;
1778 const bool isConstexprSpecified = false;
1779
Greg Clayton147e1fa2011-10-14 22:47:18 +00001780 if (name && name[0])
1781 {
1782 func_decl = FunctionDecl::Create (*ast,
1783 decl_ctx,
1784 SourceLocation(),
1785 SourceLocation(),
1786 DeclarationName (&ast->Idents.get(name)),
Greg Claytond8d4a572015-08-11 21:38:15 +00001787 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001788 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001789 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00001790 is_inline,
1791 hasWrittenPrototype,
1792 isConstexprSpecified);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001793 }
Greg Clayton147e1fa2011-10-14 22:47:18 +00001794 else
1795 {
1796 func_decl = FunctionDecl::Create (*ast,
1797 decl_ctx,
1798 SourceLocation(),
1799 SourceLocation(),
1800 DeclarationName (),
Greg Claytond8d4a572015-08-11 21:38:15 +00001801 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001802 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001803 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00001804 is_inline,
1805 hasWrittenPrototype,
1806 isConstexprSpecified);
Greg Clayton147e1fa2011-10-14 22:47:18 +00001807 }
1808 if (func_decl)
1809 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001810
1811#ifdef LLDB_CONFIGURATION_DEBUG
1812 VerifyDecl(func_decl);
1813#endif
1814
Greg Clayton147e1fa2011-10-14 22:47:18 +00001815 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001816}
1817
Greg Claytona1e5dc82015-08-11 22:53:00 +00001818CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001819ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001820 const CompilerType& result_type,
1821 const CompilerType *args,
Sean Callananc81256a2010-09-16 20:40:25 +00001822 unsigned num_args,
1823 bool is_variadic,
1824 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001825{
Ed Masted4612ad2014-04-20 13:17:36 +00001826 assert (ast != nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001827 std::vector<QualType> qual_type_args;
1828 for (unsigned i=0; i<num_args; ++i)
Greg Claytond8d4a572015-08-11 21:38:15 +00001829 qual_type_args.push_back (GetQualType(args[i]));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001830
1831 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00001832 FunctionProtoType::ExtProtoInfo proto_info;
1833 proto_info.Variadic = is_variadic;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00001834 proto_info.ExceptionSpec = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00001835 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00001836 proto_info.RefQualifier = RQ_None;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00001837
Greg Claytona1e5dc82015-08-11 22:53:00 +00001838 return CompilerType (ast, ast->getFunctionType (GetQualType(result_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00001839 qual_type_args,
Greg Claytond8d4a572015-08-11 21:38:15 +00001840 proto_info));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001841}
1842
1843ParmVarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00001844ClangASTContext::CreateParameterDeclaration (const char *name, const CompilerType &param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001845{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001846 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001847 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001848 return ParmVarDecl::Create(*ast,
1849 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001850 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00001851 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001852 name && name[0] ? &ast->Idents.get(name) : nullptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00001853 GetQualType(param_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001854 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001855 (clang::StorageClass)storage,
Ed Masted4612ad2014-04-20 13:17:36 +00001856 nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001857}
1858
1859void
1860ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
1861{
1862 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00001863 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001864}
1865
1866
1867#pragma mark Array Types
1868
Greg Claytona1e5dc82015-08-11 22:53:00 +00001869CompilerType
1870ClangASTContext::CreateArrayType (const CompilerType &element_type,
Greg Clayton1c8ef472013-04-05 23:27:21 +00001871 size_t element_count,
1872 bool is_vector)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001873{
Greg Clayton57ee3062013-07-11 22:46:58 +00001874 if (element_type.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001875 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001876 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001877 assert (ast != nullptr);
Greg Clayton4ef877f2012-12-06 02:33:54 +00001878
Greg Clayton1c8ef472013-04-05 23:27:21 +00001879 if (is_vector)
1880 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001881 return CompilerType (ast, ast->getExtVectorType(GetQualType(element_type), element_count));
Greg Clayton4ef877f2012-12-06 02:33:54 +00001882 }
1883 else
1884 {
Greg Clayton1c8ef472013-04-05 23:27:21 +00001885
1886 llvm::APInt ap_element_count (64, element_count);
1887 if (element_count == 0)
1888 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001889 return CompilerType (ast, ast->getIncompleteArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00001890 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00001891 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00001892 }
1893 else
1894 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001895 return CompilerType (ast, ast->getConstantArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00001896 ap_element_count,
1897 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00001898 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00001899 }
Greg Clayton4ef877f2012-12-06 02:33:54 +00001900 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001901 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001902 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001903}
1904
Greg Claytona1e5dc82015-08-11 22:53:00 +00001905CompilerType
Enrico Granata76b08d52014-10-29 23:08:02 +00001906ClangASTContext::GetOrCreateStructForIdentifier (const ConstString &type_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001907 const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields,
Enrico Granataa449e862014-10-30 00:53:28 +00001908 bool packed)
Enrico Granata76b08d52014-10-29 23:08:02 +00001909{
Greg Claytona1e5dc82015-08-11 22:53:00 +00001910 CompilerType type;
Enrico Granata76b08d52014-10-29 23:08:02 +00001911 if ((type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
1912 return type;
1913 type = CreateRecordType(nullptr, lldb::eAccessPublic, type_name.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC);
Greg Claytond8d4a572015-08-11 21:38:15 +00001914 StartTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00001915 for (const auto& field : type_fields)
Greg Claytond8d4a572015-08-11 21:38:15 +00001916 AddFieldToRecordType(type, field.first, field.second, lldb::eAccessPublic, 0);
Enrico Granataa449e862014-10-30 00:53:28 +00001917 if (packed)
Greg Claytond8d4a572015-08-11 21:38:15 +00001918 SetIsPacked(type);
1919 CompleteTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00001920 return type;
1921}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001922
1923#pragma mark Enumeration Types
1924
Greg Claytona1e5dc82015-08-11 22:53:00 +00001925CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00001926ClangASTContext::CreateEnumerationType
Greg Claytonca512b32011-01-14 04:54:56 +00001927(
Greg Claytond8d4a572015-08-11 21:38:15 +00001928 const char *name,
1929 DeclContext *decl_ctx,
1930 const Declaration &decl,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001931 const CompilerType &integer_clang_type
Greg Claytond8d4a572015-08-11 21:38:15 +00001932 )
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001933{
1934 // TODO: Do something intelligent with the Declaration object passed in
1935 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00001936 ASTContext *ast = getASTContext();
Greg Claytond8d4a572015-08-11 21:38:15 +00001937
Greg Claytone02b8502010-10-12 04:29:14 +00001938 // TODO: ask about these...
Greg Claytond8d4a572015-08-11 21:38:15 +00001939 // const bool IsScoped = false;
1940 // const bool IsFixed = false;
1941
Greg Clayton6beaaa62011-01-17 03:46:26 +00001942 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00001943 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00001944 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00001945 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001946 name && name[0] ? &ast->Idents.get(name) : nullptr,
1947 nullptr,
Sean Callanan48114472010-12-13 01:26:27 +00001948 false, // IsScoped
1949 false, // IsScopedUsingClassTag
1950 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00001951
1952
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001953 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00001954 {
1955 // TODO: check if we should be setting the promotion type too?
Greg Claytond8d4a572015-08-11 21:38:15 +00001956 enum_decl->setIntegerType(GetQualType(integer_clang_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00001957
1958 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
1959
Greg Claytona1e5dc82015-08-11 22:53:00 +00001960 return CompilerType (ast, ast->getTagDeclType(enum_decl));
Greg Clayton83ff3892010-09-12 23:17:56 +00001961 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001962 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001963}
1964
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001965// Disable this for now since I can't seem to get a nicely formatted float
1966// out of the APFloat class without just getting the float, double or quad
1967// and then using a formatted print on it which defeats the purpose. We ideally
1968// would like to get perfect string values for any kind of float semantics
1969// so we can support remote targets. The code below also requires a patch to
1970// llvm::APInt.
1971//bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00001972//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 +00001973//{
1974// uint32_t count = 0;
1975// bool is_complex = false;
1976// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
1977// {
1978// unsigned num_bytes_per_float = byte_size / count;
1979// unsigned num_bits_per_float = num_bytes_per_float * 8;
1980//
1981// float_str.clear();
1982// uint32_t i;
1983// for (i=0; i<count; i++)
1984// {
1985// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
1986// bool is_ieee = false;
1987// APFloat ap_float(ap_int, is_ieee);
1988// char s[1024];
1989// unsigned int hex_digits = 0;
1990// bool upper_case = false;
1991//
1992// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
1993// {
1994// if (i > 0)
1995// float_str.append(", ");
1996// float_str.append(s);
1997// if (i == 1 && is_complex)
1998// float_str.append(1, 'i');
1999// }
2000// }
2001// return !float_str.empty();
2002// }
2003// return false;
2004//}
2005
Greg Claytona1e5dc82015-08-11 22:53:00 +00002006CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002007ClangASTContext::GetIntTypeFromBitSize (clang::ASTContext *ast,
2008 size_t bit_size, bool is_signed)
2009{
2010 if (ast)
2011 {
2012 if (is_signed)
2013 {
2014 if (bit_size == ast->getTypeSize(ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002015 return CompilerType(ast, ast->SignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002016
2017 if (bit_size == ast->getTypeSize(ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002018 return CompilerType(ast, ast->ShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002019
2020 if (bit_size == ast->getTypeSize(ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002021 return CompilerType(ast, ast->IntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002022
2023 if (bit_size == ast->getTypeSize(ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002024 return CompilerType(ast, ast->LongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002025
2026 if (bit_size == ast->getTypeSize(ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002027 return CompilerType(ast, ast->LongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002028
2029 if (bit_size == ast->getTypeSize(ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002030 return CompilerType(ast, ast->Int128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002031 }
2032 else
2033 {
2034 if (bit_size == ast->getTypeSize(ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002035 return CompilerType(ast, ast->UnsignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002036
2037 if (bit_size == ast->getTypeSize(ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002038 return CompilerType(ast, ast->UnsignedShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002039
2040 if (bit_size == ast->getTypeSize(ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002041 return CompilerType(ast, ast->UnsignedIntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002042
2043 if (bit_size == ast->getTypeSize(ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002044 return CompilerType(ast, ast->UnsignedLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002045
2046 if (bit_size == ast->getTypeSize(ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002047 return CompilerType(ast, ast->UnsignedLongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002048
2049 if (bit_size == ast->getTypeSize(ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002050 return CompilerType(ast, ast->UnsignedInt128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002051 }
2052 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002053 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002054}
2055
Greg Claytona1e5dc82015-08-11 22:53:00 +00002056CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002057ClangASTContext::GetPointerSizedIntType (clang::ASTContext *ast, bool is_signed)
2058{
2059 if (ast)
2060 return GetIntTypeFromBitSize(ast, ast->getTypeSize(ast->VoidPtrTy), is_signed);
Greg Claytona1e5dc82015-08-11 22:53:00 +00002061 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002062}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002063
Greg Claytona1e5dc82015-08-11 22:53:00 +00002064CompilerType
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002065ClangASTContext::GetFloatTypeFromBitSize (clang::ASTContext *ast,
2066 size_t bit_size)
2067{
2068 if (ast)
2069 {
2070 if (bit_size == ast->getTypeSize(ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002071 return CompilerType(ast, ast->FloatTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002072 else if (bit_size == ast->getTypeSize(ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002073 return CompilerType(ast, ast->DoubleTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002074 else if (bit_size == ast->getTypeSize(ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002075 return CompilerType(ast, ast->LongDoubleTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002076 else if (bit_size == ast->getTypeSize(ast->HalfTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002077 return CompilerType(ast, ast->HalfTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002078 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002079 return CompilerType();
Enrico Granata86027e92012-03-24 01:11:14 +00002080}
2081
2082bool
Greg Claytona2721472011-06-25 00:44:06 +00002083ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
2084 clang::Decl *decl)
2085{
2086 if (!decl)
2087 return false;
2088
2089 ExternalASTSource *ast_source = ast->getExternalSource();
2090
2091 if (!ast_source)
2092 return false;
2093
2094 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
2095 {
Greg Clayton219cf312012-03-30 00:51:13 +00002096 if (tag_decl->isCompleteDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002097 return true;
2098
2099 if (!tag_decl->hasExternalLexicalStorage())
2100 return false;
2101
2102 ast_source->CompleteType(tag_decl);
2103
2104 return !tag_decl->getTypeForDecl()->isIncompleteType();
2105 }
2106 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
2107 {
Sean Callanan5b26f272012-02-04 08:49:35 +00002108 if (objc_interface_decl->getDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002109 return true;
2110
2111 if (!objc_interface_decl->hasExternalLexicalStorage())
2112 return false;
2113
2114 ast_source->CompleteType(objc_interface_decl);
2115
Sean Callanan5b26f272012-02-04 08:49:35 +00002116 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytona2721472011-06-25 00:44:06 +00002117 }
2118 else
2119 {
2120 return false;
2121 }
2122}
2123
Sean Callanan60217122012-04-13 00:10:03 +00002124void
Greg Claytond0029442013-03-27 01:48:02 +00002125ClangASTContext::SetMetadataAsUserID (const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002126 user_id_t user_id)
2127{
2128 ClangASTMetadata meta_data;
2129 meta_data.SetUserID (user_id);
2130 SetMetadata (object, meta_data);
2131}
2132
2133void
Sean Callanan60217122012-04-13 00:10:03 +00002134ClangASTContext::SetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002135 const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002136 ClangASTMetadata &metadata)
Sean Callanan60217122012-04-13 00:10:03 +00002137{
2138 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002139 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002140
2141 if (external_source)
2142 external_source->SetMetadata(object, metadata);
2143}
2144
Jim Ingham379397632012-10-27 02:54:13 +00002145ClangASTMetadata *
Sean Callanan60217122012-04-13 00:10:03 +00002146ClangASTContext::GetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002147 const void *object)
Sean Callanan60217122012-04-13 00:10:03 +00002148{
2149 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002150 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002151
2152 if (external_source && external_source->HasMetadata(object))
2153 return external_source->GetMetadata(object);
2154 else
Ed Masted4612ad2014-04-20 13:17:36 +00002155 return nullptr;
Sean Callanan60217122012-04-13 00:10:03 +00002156}
2157
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002158clang::DeclContext *
2159ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
2160{
Sean Callanana87bee82011-08-19 06:19:25 +00002161 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002162}
2163
2164clang::DeclContext *
2165ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
2166{
Sean Callanana87bee82011-08-19 06:19:25 +00002167 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002168}
2169
Greg Clayton685c88c2012-07-14 00:53:55 +00002170
2171bool
2172ClangASTContext::GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx,
2173 lldb::LanguageType &language,
2174 bool &is_instance_method,
2175 ConstString &language_object_name)
2176{
2177 language_object_name.Clear();
2178 language = eLanguageTypeUnknown;
2179 is_instance_method = false;
2180
2181 if (decl_ctx)
2182 {
2183 if (clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
2184 {
2185 if (method_decl->isStatic())
2186 {
2187 is_instance_method = false;
2188 }
2189 else
2190 {
2191 language_object_name.SetCString("this");
2192 is_instance_method = true;
2193 }
2194 language = eLanguageTypeC_plus_plus;
2195 return true;
2196 }
2197 else if (clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
2198 {
2199 // Both static and instance methods have a "self" object in objective C
2200 language_object_name.SetCString("self");
2201 if (method_decl->isInstanceMethod())
2202 {
2203 is_instance_method = true;
2204 }
2205 else
2206 {
2207 is_instance_method = false;
2208 }
2209 language = eLanguageTypeObjC;
2210 return true;
2211 }
Jim Ingham379397632012-10-27 02:54:13 +00002212 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
2213 {
Greg Claytond0029442013-03-27 01:48:02 +00002214 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
Jim Ingham379397632012-10-27 02:54:13 +00002215 if (metadata && metadata->HasObjectPtr())
2216 {
2217 language_object_name.SetCString (metadata->GetObjectPtrName());
2218 language = eLanguageTypeObjC;
2219 is_instance_method = true;
2220 }
2221 return true;
2222 }
Greg Clayton685c88c2012-07-14 00:53:55 +00002223 }
2224 return false;
2225}
2226
Greg Claytond8d4a572015-08-11 21:38:15 +00002227
2228bool
2229ClangASTContext::SetTagTypeKind (clang::QualType tag_qual_type, int kind) const
2230{
2231 const clang::Type *clang_type = tag_qual_type.getTypePtr();
2232 if (clang_type)
2233 {
2234 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(clang_type);
2235 if (tag_type)
2236 {
2237 clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(tag_type->getDecl());
2238 if (tag_decl)
2239 {
2240 tag_decl->setTagKind ((clang::TagDecl::TagKind)kind);
2241 return true;
2242 }
2243 }
2244 }
2245 return false;
2246}
2247
2248
2249bool
2250ClangASTContext::SetDefaultAccessForRecordFields (clang::RecordDecl* record_decl,
2251 int default_accessibility,
2252 int *assigned_accessibilities,
2253 size_t num_assigned_accessibilities)
2254{
2255 if (record_decl)
2256 {
2257 uint32_t field_idx;
2258 clang::RecordDecl::field_iterator field, field_end;
2259 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2260 field != field_end;
2261 ++field, ++field_idx)
2262 {
2263 // If no accessibility was assigned, assign the correct one
2264 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2265 field->setAccess ((clang::AccessSpecifier)default_accessibility);
2266 }
2267 return true;
2268 }
2269 return false;
2270}
2271
2272clang::DeclContext *
2273ClangASTContext::GetDeclContextForType (clang::QualType type)
2274{
2275 if (type.isNull())
2276 return nullptr;
2277
2278 clang::QualType qual_type = type.getCanonicalType();
2279 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2280 switch (type_class)
2281 {
2282 case clang::Type::UnaryTransform: break;
2283 case clang::Type::FunctionNoProto: break;
2284 case clang::Type::FunctionProto: break;
2285 case clang::Type::IncompleteArray: break;
2286 case clang::Type::VariableArray: break;
2287 case clang::Type::ConstantArray: break;
2288 case clang::Type::DependentSizedArray: break;
2289 case clang::Type::ExtVector: break;
2290 case clang::Type::DependentSizedExtVector: break;
2291 case clang::Type::Vector: break;
2292 case clang::Type::Builtin: break;
2293 case clang::Type::BlockPointer: break;
2294 case clang::Type::Pointer: break;
2295 case clang::Type::LValueReference: break;
2296 case clang::Type::RValueReference: break;
2297 case clang::Type::MemberPointer: break;
2298 case clang::Type::Complex: break;
2299 case clang::Type::ObjCObject: break;
2300 case clang::Type::ObjCInterface: return llvm::cast<clang::ObjCObjectType>(qual_type.getTypePtr())->getInterface();
2301 case clang::Type::ObjCObjectPointer: return GetDeclContextForType (llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
2302 case clang::Type::Record: return llvm::cast<clang::RecordType>(qual_type)->getDecl();
2303 case clang::Type::Enum: return llvm::cast<clang::EnumType>(qual_type)->getDecl();
2304 case clang::Type::Typedef: return GetDeclContextForType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
2305 case clang::Type::Elaborated: return GetDeclContextForType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
2306 case clang::Type::Paren: return GetDeclContextForType (llvm::cast<clang::ParenType>(qual_type)->desugar());
2307 case clang::Type::TypeOfExpr: break;
2308 case clang::Type::TypeOf: break;
2309 case clang::Type::Decltype: break;
2310 //case clang::Type::QualifiedName: break;
2311 case clang::Type::TemplateSpecialization: break;
2312 case clang::Type::DependentTemplateSpecialization: break;
2313 case clang::Type::TemplateTypeParm: break;
2314 case clang::Type::SubstTemplateTypeParm: break;
2315 case clang::Type::SubstTemplateTypeParmPack:break;
2316 case clang::Type::PackExpansion: break;
2317 case clang::Type::UnresolvedUsing: break;
2318 case clang::Type::Attributed: break;
2319 case clang::Type::Auto: break;
2320 case clang::Type::InjectedClassName: break;
2321 case clang::Type::DependentName: break;
2322 case clang::Type::Atomic: break;
2323 case clang::Type::Adjusted: break;
2324
2325 // pointer type decayed from an array or function type.
2326 case clang::Type::Decayed: break;
2327 }
2328 // No DeclContext in this type...
2329 return nullptr;
2330}
2331
2332static bool
2333GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true)
2334{
2335 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2336 switch (type_class)
2337 {
2338 case clang::Type::ConstantArray:
2339 case clang::Type::IncompleteArray:
2340 case clang::Type::VariableArray:
2341 {
2342 const clang::ArrayType *array_type = llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
2343
2344 if (array_type)
2345 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
2346 }
2347 break;
2348
2349 case clang::Type::Record:
2350 case clang::Type::Enum:
2351 {
2352 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
2353 if (tag_type)
2354 {
2355 clang::TagDecl *tag_decl = tag_type->getDecl();
2356 if (tag_decl)
2357 {
2358 if (tag_decl->isCompleteDefinition())
2359 return true;
2360
2361 if (!allow_completion)
2362 return false;
2363
2364 if (tag_decl->hasExternalLexicalStorage())
2365 {
2366 if (ast)
2367 {
2368 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2369 if (external_ast_source)
2370 {
2371 external_ast_source->CompleteType(tag_decl);
2372 return !tag_type->isIncompleteType();
2373 }
2374 }
2375 }
2376 return false;
2377 }
2378 }
2379
2380 }
2381 break;
2382
2383 case clang::Type::ObjCObject:
2384 case clang::Type::ObjCInterface:
2385 {
2386 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
2387 if (objc_class_type)
2388 {
2389 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2390 // We currently can't complete objective C types through the newly added ASTContext
2391 // because it only supports TagDecl objects right now...
2392 if (class_interface_decl)
2393 {
2394 if (class_interface_decl->getDefinition())
2395 return true;
2396
2397 if (!allow_completion)
2398 return false;
2399
2400 if (class_interface_decl->hasExternalLexicalStorage())
2401 {
2402 if (ast)
2403 {
2404 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2405 if (external_ast_source)
2406 {
2407 external_ast_source->CompleteType (class_interface_decl);
2408 return !objc_class_type->isIncompleteType();
2409 }
2410 }
2411 }
2412 return false;
2413 }
2414 }
2415 }
2416 break;
2417
2418 case clang::Type::Typedef:
2419 return GetCompleteQualType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
2420
2421 case clang::Type::Elaborated:
2422 return GetCompleteQualType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType(), allow_completion);
2423
2424 case clang::Type::Paren:
2425 return GetCompleteQualType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar(), allow_completion);
2426
2427 default:
2428 break;
2429 }
2430
2431 return true;
2432}
2433
2434static clang::ObjCIvarDecl::AccessControl
2435ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
2436{
2437 switch (access)
2438 {
2439 case eAccessNone: return clang::ObjCIvarDecl::None;
2440 case eAccessPublic: return clang::ObjCIvarDecl::Public;
2441 case eAccessPrivate: return clang::ObjCIvarDecl::Private;
2442 case eAccessProtected: return clang::ObjCIvarDecl::Protected;
2443 case eAccessPackage: return clang::ObjCIvarDecl::Package;
2444 }
2445 return clang::ObjCIvarDecl::None;
2446}
2447
2448
2449//----------------------------------------------------------------------
2450// Tests
2451//----------------------------------------------------------------------
2452
2453bool
2454ClangASTContext::IsAggregateType (void* type)
2455{
2456 clang::QualType qual_type (GetCanonicalQualType(type));
2457
2458 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2459 switch (type_class)
2460 {
2461 case clang::Type::IncompleteArray:
2462 case clang::Type::VariableArray:
2463 case clang::Type::ConstantArray:
2464 case clang::Type::ExtVector:
2465 case clang::Type::Vector:
2466 case clang::Type::Record:
2467 case clang::Type::ObjCObject:
2468 case clang::Type::ObjCInterface:
2469 return true;
2470 case clang::Type::Elaborated:
2471 return IsAggregateType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2472 case clang::Type::Typedef:
2473 return IsAggregateType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2474 case clang::Type::Paren:
2475 return IsAggregateType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2476 default:
2477 break;
2478 }
2479 // The clang type does have a value
2480 return false;
2481}
2482
2483bool
2484ClangASTContext::IsArrayType (void* type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002485 CompilerType *element_type_ptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00002486 uint64_t *size,
2487 bool *is_incomplete)
2488{
2489 clang::QualType qual_type (GetCanonicalQualType(type));
2490
2491 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2492 switch (type_class)
2493 {
2494 default:
2495 break;
2496
2497 case clang::Type::ConstantArray:
2498 if (element_type_ptr)
2499 element_type_ptr->SetClangType (getASTContext(), llvm::cast<clang::ConstantArrayType>(qual_type)->getElementType());
2500 if (size)
2501 *size = llvm::cast<clang::ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
2502 return true;
2503
2504 case clang::Type::IncompleteArray:
2505 if (element_type_ptr)
2506 element_type_ptr->SetClangType (getASTContext(), llvm::cast<clang::IncompleteArrayType>(qual_type)->getElementType());
2507 if (size)
2508 *size = 0;
2509 if (is_incomplete)
2510 *is_incomplete = true;
2511 return true;
2512
2513 case clang::Type::VariableArray:
2514 if (element_type_ptr)
2515 element_type_ptr->SetClangType (getASTContext(), llvm::cast<clang::VariableArrayType>(qual_type)->getElementType());
2516 if (size)
2517 *size = 0;
2518 return true;
2519
2520 case clang::Type::DependentSizedArray:
2521 if (element_type_ptr)
2522 element_type_ptr->SetClangType (getASTContext(), llvm::cast<clang::DependentSizedArrayType>(qual_type)->getElementType());
2523 if (size)
2524 *size = 0;
2525 return true;
2526
2527 case clang::Type::Typedef:
2528 return IsArrayType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2529 element_type_ptr,
2530 size,
2531 is_incomplete);
2532 case clang::Type::Elaborated:
2533 return IsArrayType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2534 element_type_ptr,
2535 size,
2536 is_incomplete);
2537 case clang::Type::Paren:
2538 return IsArrayType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
2539 element_type_ptr,
2540 size,
2541 is_incomplete);
2542 }
2543 if (element_type_ptr)
2544 element_type_ptr->Clear();
2545 if (size)
2546 *size = 0;
2547 if (is_incomplete)
2548 *is_incomplete = false;
2549 return 0;
2550}
2551
2552bool
2553ClangASTContext::IsVectorType (void* type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002554 CompilerType *element_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00002555 uint64_t *size)
2556{
2557 clang::QualType qual_type (GetCanonicalQualType(type));
2558
2559 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2560 switch (type_class)
2561 {
2562 case clang::Type::Vector:
2563 {
2564 const clang::VectorType *vector_type = qual_type->getAs<clang::VectorType>();
2565 if (vector_type)
2566 {
2567 if (size)
2568 *size = vector_type->getNumElements();
2569 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002570 *element_type = CompilerType(getASTContext(), vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002571 }
2572 return true;
2573 }
2574 break;
2575 case clang::Type::ExtVector:
2576 {
2577 const clang::ExtVectorType *ext_vector_type = qual_type->getAs<clang::ExtVectorType>();
2578 if (ext_vector_type)
2579 {
2580 if (size)
2581 *size = ext_vector_type->getNumElements();
2582 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002583 *element_type = CompilerType(getASTContext(), ext_vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002584 }
2585 return true;
2586 }
2587 default:
2588 break;
2589 }
2590 return false;
2591}
2592
2593bool
2594ClangASTContext::IsRuntimeGeneratedType (void* type)
2595{
2596 clang::DeclContext* decl_ctx = ClangASTContext::GetASTContext(getASTContext())->GetDeclContextForType(GetQualType(type));
2597 if (!decl_ctx)
2598 return false;
2599
2600 if (!llvm::isa<clang::ObjCInterfaceDecl>(decl_ctx))
2601 return false;
2602
2603 clang::ObjCInterfaceDecl *result_iface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
2604
2605 ClangASTMetadata* ast_metadata = ClangASTContext::GetMetadata(getASTContext(), result_iface_decl);
2606 if (!ast_metadata)
2607 return false;
2608 return (ast_metadata->GetISAPtr() != 0);
2609}
2610
2611bool
2612ClangASTContext::IsCharType (void* type)
2613{
2614 return GetQualType(type).getUnqualifiedType()->isCharType();
2615}
2616
2617
2618bool
2619ClangASTContext::IsCompleteType (void* type)
2620{
2621 const bool allow_completion = false;
2622 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
2623}
2624
2625bool
2626ClangASTContext::IsConst(void* type)
2627{
2628 return GetQualType(type).isConstQualified();
2629}
2630
2631bool
2632ClangASTContext::IsCStringType (void* type, uint32_t &length)
2633{
Greg Claytona1e5dc82015-08-11 22:53:00 +00002634 CompilerType pointee_or_element_clang_type;
Greg Claytond8d4a572015-08-11 21:38:15 +00002635 length = 0;
2636 Flags type_flags (GetTypeInfo (type, &pointee_or_element_clang_type));
2637
2638 if (!pointee_or_element_clang_type.IsValid())
2639 return false;
2640
2641 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
2642 {
2643 if (pointee_or_element_clang_type.IsCharType())
2644 {
2645 if (type_flags.Test (eTypeIsArray))
2646 {
2647 // We know the size of the array and it could be a C string
2648 // since it is an array of characters
2649 length = llvm::cast<clang::ConstantArrayType>(GetCanonicalQualType(type).getTypePtr())->getSize().getLimitedValue();
2650 }
2651 return true;
2652
2653 }
2654 }
2655 return false;
2656}
2657
2658bool
2659ClangASTContext::IsFunctionType (void* type, bool *is_variadic_ptr)
2660{
2661 if (type)
2662 {
2663 clang::QualType qual_type (GetCanonicalQualType(type));
2664
2665 if (qual_type->isFunctionType())
2666 {
2667 if (is_variadic_ptr)
2668 {
2669 const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2670 if (function_proto_type)
2671 *is_variadic_ptr = function_proto_type->isVariadic();
2672 else
2673 *is_variadic_ptr = false;
2674 }
2675 return true;
2676 }
2677
2678 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2679 switch (type_class)
2680 {
2681 default:
2682 break;
2683 case clang::Type::Typedef:
2684 return IsFunctionType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), nullptr);
2685 case clang::Type::Elaborated:
2686 return IsFunctionType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), nullptr);
2687 case clang::Type::Paren:
2688 return IsFunctionType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), nullptr);
2689 case clang::Type::LValueReference:
2690 case clang::Type::RValueReference:
2691 {
2692 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2693 if (reference_type)
2694 return IsFunctionType(reference_type->getPointeeType().getAsOpaquePtr(), nullptr);
2695 }
2696 break;
2697 }
2698 }
2699 return false;
2700}
2701
2702// Used to detect "Homogeneous Floating-point Aggregates"
2703uint32_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00002704ClangASTContext::IsHomogeneousAggregate (void* type, CompilerType* base_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00002705{
2706 if (!type)
2707 return 0;
2708
2709 clang::QualType qual_type(GetCanonicalQualType(type));
2710 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2711 switch (type_class)
2712 {
2713 case clang::Type::Record:
2714 if (GetCompleteType (type))
2715 {
2716 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2717 if (cxx_record_decl)
2718 {
2719 if (cxx_record_decl->getNumBases() ||
2720 cxx_record_decl->isDynamicClass())
2721 return 0;
2722 }
2723 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
2724 if (record_type)
2725 {
2726 const clang::RecordDecl *record_decl = record_type->getDecl();
2727 if (record_decl)
2728 {
2729 // We are looking for a structure that contains only floating point types
2730 clang::RecordDecl::field_iterator field_pos, field_end = record_decl->field_end();
2731 uint32_t num_fields = 0;
2732 bool is_hva = false;
2733 bool is_hfa = false;
2734 clang::QualType base_qual_type;
2735 for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos)
2736 {
2737 clang::QualType field_qual_type = field_pos->getType();
2738 if (field_qual_type->isFloatingType())
2739 {
2740 if (field_qual_type->isComplexType())
2741 return 0;
2742 else
2743 {
2744 if (num_fields == 0)
2745 base_qual_type = field_qual_type;
2746 else
2747 {
2748 if (is_hva)
2749 return 0;
2750 is_hfa = true;
2751 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
2752 return 0;
2753 }
2754 }
2755 }
2756 else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType())
2757 {
2758 const clang::VectorType *array = field_qual_type.getTypePtr()->getAs<clang::VectorType>();
2759 if (array && array->getNumElements() <= 4)
2760 {
2761 if (num_fields == 0)
2762 base_qual_type = array->getElementType();
2763 else
2764 {
2765 if (is_hfa)
2766 return 0;
2767 is_hva = true;
2768 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
2769 return 0;
2770 }
2771 }
2772 else
2773 return 0;
2774 }
2775 else
2776 return 0;
2777 ++num_fields;
2778 }
2779 if (base_type_ptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002780 *base_type_ptr = CompilerType (getASTContext(), base_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00002781 return num_fields;
2782 }
2783 }
2784 }
2785 break;
2786
2787 case clang::Type::Typedef:
2788 return IsHomogeneousAggregate(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), base_type_ptr);
2789
2790 case clang::Type::Elaborated:
2791 return IsHomogeneousAggregate(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), base_type_ptr);
2792 default:
2793 break;
2794 }
2795 return 0;
2796}
2797
2798size_t
2799ClangASTContext::GetNumberOfFunctionArguments (void* type)
2800{
2801 if (type)
2802 {
2803 clang::QualType qual_type (GetCanonicalQualType(type));
2804 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2805 if (func)
2806 return func->getNumParams();
2807 }
2808 return 0;
2809}
2810
Greg Claytona1e5dc82015-08-11 22:53:00 +00002811CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00002812ClangASTContext::GetFunctionArgumentAtIndex (void* type, const size_t index)
2813{
2814 if (type)
2815 {
2816 clang::QualType qual_type (GetCanonicalQualType(type));
2817 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2818 if (func)
2819 {
2820 if (index < func->getNumParams())
Greg Claytona1e5dc82015-08-11 22:53:00 +00002821 return CompilerType(getASTContext(), func->getParamType(index));
Greg Claytond8d4a572015-08-11 21:38:15 +00002822 }
2823 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002824 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00002825}
2826
2827bool
2828ClangASTContext::IsFunctionPointerType (void* type)
2829{
2830 if (type)
2831 {
2832 clang::QualType qual_type (GetCanonicalQualType(type));
2833
2834 if (qual_type->isFunctionPointerType())
2835 return true;
2836
2837 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2838 switch (type_class)
2839 {
2840 default:
2841 break;
2842 case clang::Type::Typedef:
2843 return IsFunctionPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2844 case clang::Type::Elaborated:
2845 return IsFunctionPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2846 case clang::Type::Paren:
2847 return IsFunctionPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2848
2849 case clang::Type::LValueReference:
2850 case clang::Type::RValueReference:
2851 {
2852 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2853 if (reference_type)
2854 return IsFunctionPointerType(reference_type->getPointeeType().getAsOpaquePtr());
2855 }
2856 break;
2857 }
2858 }
2859 return false;
2860
2861}
2862
2863bool
2864ClangASTContext::IsIntegerType (void* type, bool &is_signed)
2865{
2866 if (!type)
2867 return false;
2868
2869 clang::QualType qual_type (GetCanonicalQualType(type));
2870 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
2871
2872 if (builtin_type)
2873 {
2874 if (builtin_type->isInteger())
2875 {
2876 is_signed = builtin_type->isSignedInteger();
2877 return true;
2878 }
2879 }
2880
2881 return false;
2882}
2883
2884bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00002885ClangASTContext::IsPointerType (void* type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002886{
2887 if (type)
2888 {
2889 clang::QualType qual_type (GetCanonicalQualType(type));
2890 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2891 switch (type_class)
2892 {
2893 case clang::Type::Builtin:
2894 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
2895 {
2896 default:
2897 break;
2898 case clang::BuiltinType::ObjCId:
2899 case clang::BuiltinType::ObjCClass:
2900 return true;
2901 }
2902 return false;
2903 case clang::Type::ObjCObjectPointer:
2904 if (pointee_type)
2905 pointee_type->SetClangType (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
2906 return true;
2907 case clang::Type::BlockPointer:
2908 if (pointee_type)
2909 pointee_type->SetClangType (getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
2910 return true;
2911 case clang::Type::Pointer:
2912 if (pointee_type)
2913 pointee_type->SetClangType (getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
2914 return true;
2915 case clang::Type::MemberPointer:
2916 if (pointee_type)
2917 pointee_type->SetClangType (getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
2918 return true;
2919 case clang::Type::Typedef:
2920 return IsPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
2921 case clang::Type::Elaborated:
2922 return IsPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
2923 case clang::Type::Paren:
2924 return IsPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
2925 default:
2926 break;
2927 }
2928 }
2929 if (pointee_type)
2930 pointee_type->Clear();
2931 return false;
2932}
2933
2934
2935bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00002936ClangASTContext::IsPointerOrReferenceType (void* type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002937{
2938 if (type)
2939 {
2940 clang::QualType qual_type (GetCanonicalQualType(type));
2941 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2942 switch (type_class)
2943 {
2944 case clang::Type::Builtin:
2945 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
2946 {
2947 default:
2948 break;
2949 case clang::BuiltinType::ObjCId:
2950 case clang::BuiltinType::ObjCClass:
2951 return true;
2952 }
2953 return false;
2954 case clang::Type::ObjCObjectPointer:
2955 if (pointee_type)
2956 pointee_type->SetClangType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
2957 return true;
2958 case clang::Type::BlockPointer:
2959 if (pointee_type)
2960 pointee_type->SetClangType(getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
2961 return true;
2962 case clang::Type::Pointer:
2963 if (pointee_type)
2964 pointee_type->SetClangType(getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
2965 return true;
2966 case clang::Type::MemberPointer:
2967 if (pointee_type)
2968 pointee_type->SetClangType(getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
2969 return true;
2970 case clang::Type::LValueReference:
2971 if (pointee_type)
2972 pointee_type->SetClangType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
2973 return true;
2974 case clang::Type::RValueReference:
2975 if (pointee_type)
2976 pointee_type->SetClangType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
2977 return true;
2978 case clang::Type::Typedef:
2979 return IsPointerOrReferenceType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
2980 case clang::Type::Elaborated:
2981 return IsPointerOrReferenceType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
2982 case clang::Type::Paren:
2983 return IsPointerOrReferenceType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
2984 default:
2985 break;
2986 }
2987 }
2988 if (pointee_type)
2989 pointee_type->Clear();
2990 return false;
2991}
2992
2993
2994bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00002995ClangASTContext::IsReferenceType (void* type, CompilerType *pointee_type, bool* is_rvalue)
Greg Claytond8d4a572015-08-11 21:38:15 +00002996{
2997 if (type)
2998 {
2999 clang::QualType qual_type (GetCanonicalQualType(type));
3000 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3001
3002 switch (type_class)
3003 {
3004 case clang::Type::LValueReference:
3005 if (pointee_type)
3006 pointee_type->SetClangType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
3007 if (is_rvalue)
3008 *is_rvalue = false;
3009 return true;
3010 case clang::Type::RValueReference:
3011 if (pointee_type)
3012 pointee_type->SetClangType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
3013 if (is_rvalue)
3014 *is_rvalue = true;
3015 return true;
3016 case clang::Type::Typedef:
3017 return IsReferenceType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type, is_rvalue);
3018 case clang::Type::Elaborated:
3019 return IsReferenceType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type, is_rvalue);
3020 case clang::Type::Paren:
3021 return IsReferenceType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type, is_rvalue);
3022
3023 default:
3024 break;
3025 }
3026 }
3027 if (pointee_type)
3028 pointee_type->Clear();
3029 return false;
3030}
3031
3032bool
3033ClangASTContext::IsFloatingPointType (void* type, uint32_t &count, bool &is_complex)
3034{
3035 if (type)
3036 {
3037 clang::QualType qual_type (GetCanonicalQualType(type));
3038
3039 if (const clang::BuiltinType *BT = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal()))
3040 {
3041 clang::BuiltinType::Kind kind = BT->getKind();
3042 if (kind >= clang::BuiltinType::Float && kind <= clang::BuiltinType::LongDouble)
3043 {
3044 count = 1;
3045 is_complex = false;
3046 return true;
3047 }
3048 }
3049 else if (const clang::ComplexType *CT = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal()))
3050 {
3051 if (IsFloatingPointType (CT->getElementType().getAsOpaquePtr(), count, is_complex))
3052 {
3053 count = 2;
3054 is_complex = true;
3055 return true;
3056 }
3057 }
3058 else if (const clang::VectorType *VT = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal()))
3059 {
3060 if (IsFloatingPointType (VT->getElementType().getAsOpaquePtr(), count, is_complex))
3061 {
3062 count = VT->getNumElements();
3063 is_complex = false;
3064 return true;
3065 }
3066 }
3067 }
3068 count = 0;
3069 is_complex = false;
3070 return false;
3071}
3072
3073
3074bool
3075ClangASTContext::IsDefined(void* type)
3076{
3077 if (!type)
3078 return false;
3079
3080 clang::QualType qual_type(GetQualType(type));
3081 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
3082 if (tag_type)
3083 {
3084 clang::TagDecl *tag_decl = tag_type->getDecl();
3085 if (tag_decl)
3086 return tag_decl->isCompleteDefinition();
3087 return false;
3088 }
3089 else
3090 {
3091 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3092 if (objc_class_type)
3093 {
3094 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3095 if (class_interface_decl)
3096 return class_interface_decl->getDefinition() != nullptr;
3097 return false;
3098 }
3099 }
3100 return true;
3101}
3102
3103bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003104ClangASTContext::IsObjCClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003105{
3106 if (type)
3107 {
3108 clang::QualType qual_type (GetCanonicalQualType(type));
3109
3110 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3111
3112 if (obj_pointer_type)
3113 return obj_pointer_type->isObjCClassType();
3114 }
3115 return false;
3116}
3117
3118bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003119ClangASTContext::IsObjCObjectOrInterfaceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003120{
3121 if (type)
3122 return GetCanonicalQualType(type)->isObjCObjectOrInterfaceType();
3123 return false;
3124}
3125
3126bool
3127ClangASTContext::IsPolymorphicClass (void* type)
3128{
3129 if (type)
3130 {
3131 clang::QualType qual_type(GetCanonicalQualType(type));
3132 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3133 switch (type_class)
3134 {
3135 case clang::Type::Record:
3136 if (GetCompleteType(type))
3137 {
3138 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3139 const clang::RecordDecl *record_decl = record_type->getDecl();
3140 if (record_decl)
3141 {
3142 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3143 if (cxx_record_decl)
3144 return cxx_record_decl->isPolymorphic();
3145 }
3146 }
3147 break;
3148
3149 default:
3150 break;
3151 }
3152 }
3153 return false;
3154}
3155
3156bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003157ClangASTContext::IsPossibleDynamicType (void* type, CompilerType *dynamic_pointee_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00003158 bool check_cplusplus,
3159 bool check_objc)
3160{
3161 clang::QualType pointee_qual_type;
3162 if (type)
3163 {
3164 clang::QualType qual_type (GetCanonicalQualType(type));
3165 bool success = false;
3166 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3167 switch (type_class)
3168 {
3169 case clang::Type::Builtin:
3170 if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
3171 {
3172 if (dynamic_pointee_type)
3173 dynamic_pointee_type->SetClangType(this, type);
3174 return true;
3175 }
3176 break;
3177
3178 case clang::Type::ObjCObjectPointer:
3179 if (check_objc)
3180 {
3181 if (dynamic_pointee_type)
3182 dynamic_pointee_type->SetClangType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
3183 return true;
3184 }
3185 break;
3186
3187 case clang::Type::Pointer:
3188 pointee_qual_type = llvm::cast<clang::PointerType>(qual_type)->getPointeeType();
3189 success = true;
3190 break;
3191
3192 case clang::Type::LValueReference:
3193 case clang::Type::RValueReference:
3194 pointee_qual_type = llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType();
3195 success = true;
3196 break;
3197
3198 case clang::Type::Typedef:
3199 return IsPossibleDynamicType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3200 dynamic_pointee_type,
3201 check_cplusplus,
3202 check_objc);
3203
3204 case clang::Type::Elaborated:
3205 return IsPossibleDynamicType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3206 dynamic_pointee_type,
3207 check_cplusplus,
3208 check_objc);
3209
3210 case clang::Type::Paren:
3211 return IsPossibleDynamicType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
3212 dynamic_pointee_type,
3213 check_cplusplus,
3214 check_objc);
3215 default:
3216 break;
3217 }
3218
3219 if (success)
3220 {
3221 // Check to make sure what we are pointing too is a possible dynamic C++ type
3222 // We currently accept any "void *" (in case we have a class that has been
3223 // watered down to an opaque pointer) and virtual C++ classes.
3224 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
3225 switch (pointee_type_class)
3226 {
3227 case clang::Type::Builtin:
3228 switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind())
3229 {
3230 case clang::BuiltinType::UnknownAny:
3231 case clang::BuiltinType::Void:
3232 if (dynamic_pointee_type)
3233 dynamic_pointee_type->SetClangType(getASTContext(), pointee_qual_type);
3234 return true;
3235
3236 case clang::BuiltinType::NullPtr:
3237 case clang::BuiltinType::Bool:
3238 case clang::BuiltinType::Char_U:
3239 case clang::BuiltinType::UChar:
3240 case clang::BuiltinType::WChar_U:
3241 case clang::BuiltinType::Char16:
3242 case clang::BuiltinType::Char32:
3243 case clang::BuiltinType::UShort:
3244 case clang::BuiltinType::UInt:
3245 case clang::BuiltinType::ULong:
3246 case clang::BuiltinType::ULongLong:
3247 case clang::BuiltinType::UInt128:
3248 case clang::BuiltinType::Char_S:
3249 case clang::BuiltinType::SChar:
3250 case clang::BuiltinType::WChar_S:
3251 case clang::BuiltinType::Short:
3252 case clang::BuiltinType::Int:
3253 case clang::BuiltinType::Long:
3254 case clang::BuiltinType::LongLong:
3255 case clang::BuiltinType::Int128:
3256 case clang::BuiltinType::Float:
3257 case clang::BuiltinType::Double:
3258 case clang::BuiltinType::LongDouble:
3259 case clang::BuiltinType::Dependent:
3260 case clang::BuiltinType::Overload:
3261 case clang::BuiltinType::ObjCId:
3262 case clang::BuiltinType::ObjCClass:
3263 case clang::BuiltinType::ObjCSel:
3264 case clang::BuiltinType::BoundMember:
3265 case clang::BuiltinType::Half:
3266 case clang::BuiltinType::ARCUnbridgedCast:
3267 case clang::BuiltinType::PseudoObject:
3268 case clang::BuiltinType::BuiltinFn:
3269 case clang::BuiltinType::OCLEvent:
3270 case clang::BuiltinType::OCLImage1d:
3271 case clang::BuiltinType::OCLImage1dArray:
3272 case clang::BuiltinType::OCLImage1dBuffer:
3273 case clang::BuiltinType::OCLImage2d:
3274 case clang::BuiltinType::OCLImage2dArray:
3275 case clang::BuiltinType::OCLImage3d:
3276 case clang::BuiltinType::OCLSampler:
3277 break;
3278 }
3279 break;
3280
3281 case clang::Type::Record:
3282 if (check_cplusplus)
3283 {
3284 clang::CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
3285 if (cxx_record_decl)
3286 {
3287 bool is_complete = cxx_record_decl->isCompleteDefinition();
3288
3289 if (is_complete)
3290 success = cxx_record_decl->isDynamicClass();
3291 else
3292 {
3293 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), cxx_record_decl);
3294 if (metadata)
3295 success = metadata->GetIsDynamicCXXType();
3296 else
3297 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00003298 is_complete = CompilerType(getASTContext(), pointee_qual_type).GetCompleteType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003299 if (is_complete)
3300 success = cxx_record_decl->isDynamicClass();
3301 else
3302 success = false;
3303 }
3304 }
3305
3306 if (success)
3307 {
3308 if (dynamic_pointee_type)
3309 dynamic_pointee_type->SetClangType(getASTContext(), pointee_qual_type);
3310 return true;
3311 }
3312 }
3313 }
3314 break;
3315
3316 case clang::Type::ObjCObject:
3317 case clang::Type::ObjCInterface:
3318 if (check_objc)
3319 {
3320 if (dynamic_pointee_type)
3321 dynamic_pointee_type->SetClangType(getASTContext(), pointee_qual_type);
3322 return true;
3323 }
3324 break;
3325
3326 default:
3327 break;
3328 }
3329 }
3330 }
3331 if (dynamic_pointee_type)
3332 dynamic_pointee_type->Clear();
3333 return false;
3334}
3335
3336
3337bool
3338ClangASTContext::IsScalarType (void* type)
3339{
3340 if (!type)
3341 return false;
3342
3343 return (GetTypeInfo (type, nullptr) & eTypeIsScalar) != 0;
3344}
3345
3346bool
3347ClangASTContext::IsTypedefType (void* type)
3348{
3349 if (!type)
3350 return false;
3351 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
3352}
3353
3354bool
3355ClangASTContext::IsVoidType (void* type)
3356{
3357 if (!type)
3358 return false;
3359 return GetCanonicalQualType(type)->isVoidType();
3360}
3361
3362bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003363ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003364{
3365 if (type)
3366 {
3367 clang::QualType qual_type (GetCanonicalQualType(type));
3368
3369 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3370 if (cxx_record_decl)
3371 {
3372 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
3373 return true;
3374 }
3375 }
3376 class_name.clear();
3377 return false;
3378}
3379
3380
3381bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003382ClangASTContext::IsCXXClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003383{
3384 if (!type)
3385 return false;
3386
3387 clang::QualType qual_type (GetCanonicalQualType(type));
3388 if (qual_type->getAsCXXRecordDecl() != nullptr)
3389 return true;
3390 return false;
3391}
3392
3393bool
3394ClangASTContext::IsBeingDefined (void* type)
3395{
3396 if (!type)
3397 return false;
3398 clang::QualType qual_type (GetCanonicalQualType(type));
3399 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
3400 if (tag_type)
3401 return tag_type->isBeingDefined();
3402 return false;
3403}
3404
3405bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003406ClangASTContext::IsObjCObjectPointerType (const CompilerType& type, CompilerType *class_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003407{
3408 if (!type)
3409 return false;
3410
3411 clang::QualType qual_type (GetCanonicalQualType(type));
3412
3413 if (qual_type->isObjCObjectPointerType())
3414 {
3415 if (class_type_ptr)
3416 {
3417 if (!qual_type->isObjCClassType() &&
3418 !qual_type->isObjCIdType())
3419 {
3420 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3421 if (obj_pointer_type == nullptr)
3422 class_type_ptr->Clear();
3423 else
3424 class_type_ptr->SetClangType (type.GetTypeSystem(), clang::QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr());
3425 }
3426 }
3427 return true;
3428 }
3429 if (class_type_ptr)
3430 class_type_ptr->Clear();
3431 return false;
3432}
3433
3434bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003435ClangASTContext::GetObjCClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003436{
3437 if (!type)
3438 return false;
3439
3440 clang::QualType qual_type (GetCanonicalQualType(type));
3441
3442 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3443 if (object_type)
3444 {
3445 const clang::ObjCInterfaceDecl *interface = object_type->getInterface();
3446 if (interface)
3447 {
3448 class_name = interface->getNameAsString();
3449 return true;
3450 }
3451 }
3452 return false;
3453}
3454
3455
3456//----------------------------------------------------------------------
3457// Type Completion
3458//----------------------------------------------------------------------
3459
3460bool
3461ClangASTContext::GetCompleteType (void* type)
3462{
3463 if (!type)
3464 return false;
3465 const bool allow_completion = true;
3466 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
3467}
3468
3469ConstString
3470ClangASTContext::GetTypeName (void* type)
3471{
3472 std::string type_name;
3473 if (type)
3474 {
3475 clang::PrintingPolicy printing_policy (getASTContext()->getPrintingPolicy());
3476 clang::QualType qual_type(GetQualType(type));
3477 printing_policy.SuppressTagKeyword = true;
3478 printing_policy.LangOpts.WChar = true;
3479 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
3480 if (typedef_type)
3481 {
3482 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
3483 type_name = typedef_decl->getQualifiedNameAsString();
3484 }
3485 else
3486 {
3487 type_name = qual_type.getAsString(printing_policy);
3488 }
3489 }
3490 return ConstString(type_name);
3491}
3492
3493uint32_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00003494ClangASTContext::GetTypeInfo (void* type, CompilerType *pointee_or_element_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003495{
3496 if (!type)
3497 return 0;
3498
3499 if (pointee_or_element_clang_type)
3500 pointee_or_element_clang_type->Clear();
3501
3502 clang::QualType qual_type (GetQualType(type));
3503
3504 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3505 switch (type_class)
3506 {
3507 case clang::Type::Builtin:
3508 {
3509 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3510
3511 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
3512 switch (builtin_type->getKind())
3513 {
3514 case clang::BuiltinType::ObjCId:
3515 case clang::BuiltinType::ObjCClass:
3516 if (pointee_or_element_clang_type)
3517 pointee_or_element_clang_type->SetClangType(getASTContext(), getASTContext()->ObjCBuiltinClassTy);
3518 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3519 break;
3520
3521 case clang::BuiltinType::ObjCSel:
3522 if (pointee_or_element_clang_type)
3523 pointee_or_element_clang_type->SetClangType(getASTContext(), getASTContext()->CharTy);
3524 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3525 break;
3526
3527 case clang::BuiltinType::Bool:
3528 case clang::BuiltinType::Char_U:
3529 case clang::BuiltinType::UChar:
3530 case clang::BuiltinType::WChar_U:
3531 case clang::BuiltinType::Char16:
3532 case clang::BuiltinType::Char32:
3533 case clang::BuiltinType::UShort:
3534 case clang::BuiltinType::UInt:
3535 case clang::BuiltinType::ULong:
3536 case clang::BuiltinType::ULongLong:
3537 case clang::BuiltinType::UInt128:
3538 case clang::BuiltinType::Char_S:
3539 case clang::BuiltinType::SChar:
3540 case clang::BuiltinType::WChar_S:
3541 case clang::BuiltinType::Short:
3542 case clang::BuiltinType::Int:
3543 case clang::BuiltinType::Long:
3544 case clang::BuiltinType::LongLong:
3545 case clang::BuiltinType::Int128:
3546 case clang::BuiltinType::Float:
3547 case clang::BuiltinType::Double:
3548 case clang::BuiltinType::LongDouble:
3549 builtin_type_flags |= eTypeIsScalar;
3550 if (builtin_type->isInteger())
3551 {
3552 builtin_type_flags |= eTypeIsInteger;
3553 if (builtin_type->isSignedInteger())
3554 builtin_type_flags |= eTypeIsSigned;
3555 }
3556 else if (builtin_type->isFloatingPoint())
3557 builtin_type_flags |= eTypeIsFloat;
3558 break;
3559 default:
3560 break;
3561 }
3562 return builtin_type_flags;
3563 }
3564
3565 case clang::Type::BlockPointer:
3566 if (pointee_or_element_clang_type)
3567 pointee_or_element_clang_type->SetClangType(getASTContext(), qual_type->getPointeeType());
3568 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3569
3570 case clang::Type::Complex:
3571 {
3572 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3573 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal());
3574 if (complex_type)
3575 {
3576 clang::QualType complex_element_type (complex_type->getElementType());
3577 if (complex_element_type->isIntegerType())
3578 complex_type_flags |= eTypeIsFloat;
3579 else if (complex_element_type->isFloatingType())
3580 complex_type_flags |= eTypeIsInteger;
3581 }
3582 return complex_type_flags;
3583 }
3584 break;
3585
3586 case clang::Type::ConstantArray:
3587 case clang::Type::DependentSizedArray:
3588 case clang::Type::IncompleteArray:
3589 case clang::Type::VariableArray:
3590 if (pointee_or_element_clang_type)
3591 pointee_or_element_clang_type->SetClangType(getASTContext(), llvm::cast<clang::ArrayType>(qual_type.getTypePtr())->getElementType());
3592 return eTypeHasChildren | eTypeIsArray;
3593
3594 case clang::Type::DependentName: return 0;
3595 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
3596 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
3597 case clang::Type::Decltype: return 0;
3598
3599 case clang::Type::Enum:
3600 if (pointee_or_element_clang_type)
3601 pointee_or_element_clang_type->SetClangType(getASTContext(), llvm::cast<clang::EnumType>(qual_type)->getDecl()->getIntegerType());
3602 return eTypeIsEnumeration | eTypeHasValue;
3603
3604 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003605 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003606 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003607 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003608
3609 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
3610 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
3611 case clang::Type::InjectedClassName: return 0;
3612
3613 case clang::Type::LValueReference:
3614 case clang::Type::RValueReference:
3615 if (pointee_or_element_clang_type)
3616 pointee_or_element_clang_type->SetClangType(getASTContext(), llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())->getPointeeType());
3617 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3618
3619 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
3620
3621 case clang::Type::ObjCObjectPointer:
3622 if (pointee_or_element_clang_type)
3623 pointee_or_element_clang_type->SetClangType(getASTContext(), qual_type->getPointeeType());
3624 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
3625
3626 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3627 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3628
3629 case clang::Type::Pointer:
3630 if (pointee_or_element_clang_type)
3631 pointee_or_element_clang_type->SetClangType(getASTContext(), qual_type->getPointeeType());
3632 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3633
3634 case clang::Type::Record:
3635 if (qual_type->getAsCXXRecordDecl())
3636 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3637 else
3638 return eTypeHasChildren | eTypeIsStructUnion;
3639 break;
3640 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
3641 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
3642 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
3643
3644 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003645 return eTypeIsTypedef | CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003646 case clang::Type::TypeOfExpr: return 0;
3647 case clang::Type::TypeOf: return 0;
3648 case clang::Type::UnresolvedUsing: return 0;
3649
3650 case clang::Type::ExtVector:
3651 case clang::Type::Vector:
3652 {
3653 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
3654 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal());
3655 if (vector_type)
3656 {
3657 if (vector_type->isIntegerType())
3658 vector_type_flags |= eTypeIsFloat;
3659 else if (vector_type->isFloatingType())
3660 vector_type_flags |= eTypeIsInteger;
3661 }
3662 return vector_type_flags;
3663 }
3664 default: return 0;
3665 }
3666 return 0;
3667}
3668
3669
3670
3671lldb::LanguageType
3672ClangASTContext::GetMinimumLanguage (void* type)
3673{
3674 if (!type)
3675 return lldb::eLanguageTypeC;
3676
3677 // If the type is a reference, then resolve it to what it refers to first:
3678 clang::QualType qual_type (GetCanonicalQualType(type).getNonReferenceType());
3679 if (qual_type->isAnyPointerType())
3680 {
3681 if (qual_type->isObjCObjectPointerType())
3682 return lldb::eLanguageTypeObjC;
3683
3684 clang::QualType pointee_type (qual_type->getPointeeType());
3685 if (pointee_type->getPointeeCXXRecordDecl() != nullptr)
3686 return lldb::eLanguageTypeC_plus_plus;
3687 if (pointee_type->isObjCObjectOrInterfaceType())
3688 return lldb::eLanguageTypeObjC;
3689 if (pointee_type->isObjCClassType())
3690 return lldb::eLanguageTypeObjC;
3691 if (pointee_type.getTypePtr() == getASTContext()->ObjCBuiltinIdTy.getTypePtr())
3692 return lldb::eLanguageTypeObjC;
3693 }
3694 else
3695 {
3696 if (qual_type->isObjCObjectOrInterfaceType())
3697 return lldb::eLanguageTypeObjC;
3698 if (qual_type->getAsCXXRecordDecl())
3699 return lldb::eLanguageTypeC_plus_plus;
3700 switch (qual_type->getTypeClass())
3701 {
3702 default:
3703 break;
3704 case clang::Type::Builtin:
3705 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3706 {
3707 default:
3708 case clang::BuiltinType::Void:
3709 case clang::BuiltinType::Bool:
3710 case clang::BuiltinType::Char_U:
3711 case clang::BuiltinType::UChar:
3712 case clang::BuiltinType::WChar_U:
3713 case clang::BuiltinType::Char16:
3714 case clang::BuiltinType::Char32:
3715 case clang::BuiltinType::UShort:
3716 case clang::BuiltinType::UInt:
3717 case clang::BuiltinType::ULong:
3718 case clang::BuiltinType::ULongLong:
3719 case clang::BuiltinType::UInt128:
3720 case clang::BuiltinType::Char_S:
3721 case clang::BuiltinType::SChar:
3722 case clang::BuiltinType::WChar_S:
3723 case clang::BuiltinType::Short:
3724 case clang::BuiltinType::Int:
3725 case clang::BuiltinType::Long:
3726 case clang::BuiltinType::LongLong:
3727 case clang::BuiltinType::Int128:
3728 case clang::BuiltinType::Float:
3729 case clang::BuiltinType::Double:
3730 case clang::BuiltinType::LongDouble:
3731 break;
3732
3733 case clang::BuiltinType::NullPtr:
3734 return eLanguageTypeC_plus_plus;
3735
3736 case clang::BuiltinType::ObjCId:
3737 case clang::BuiltinType::ObjCClass:
3738 case clang::BuiltinType::ObjCSel:
3739 return eLanguageTypeObjC;
3740
3741 case clang::BuiltinType::Dependent:
3742 case clang::BuiltinType::Overload:
3743 case clang::BuiltinType::BoundMember:
3744 case clang::BuiltinType::UnknownAny:
3745 break;
3746 }
3747 break;
3748 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003749 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
Greg Claytond8d4a572015-08-11 21:38:15 +00003750 }
3751 }
3752 return lldb::eLanguageTypeC;
3753}
3754
3755lldb::TypeClass
3756ClangASTContext::GetTypeClass (void* type)
3757{
3758 if (!type)
3759 return lldb::eTypeClassInvalid;
3760
3761 clang::QualType qual_type(GetQualType(type));
3762
3763 switch (qual_type->getTypeClass())
3764 {
3765 case clang::Type::UnaryTransform: break;
3766 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
3767 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
3768 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
3769 case clang::Type::VariableArray: return lldb::eTypeClassArray;
3770 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
3771 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
3772 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
3773 case clang::Type::ExtVector: return lldb::eTypeClassVector;
3774 case clang::Type::Vector: return lldb::eTypeClassVector;
3775 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
3776 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
3777 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
3778 case clang::Type::Pointer: return lldb::eTypeClassPointer;
3779 case clang::Type::LValueReference: return lldb::eTypeClassReference;
3780 case clang::Type::RValueReference: return lldb::eTypeClassReference;
3781 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
3782 case clang::Type::Complex:
3783 if (qual_type->isComplexType())
3784 return lldb::eTypeClassComplexFloat;
3785 else
3786 return lldb::eTypeClassComplexInteger;
3787 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
3788 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
3789 case clang::Type::Record:
3790 {
3791 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3792 const clang::RecordDecl *record_decl = record_type->getDecl();
3793 if (record_decl->isUnion())
3794 return lldb::eTypeClassUnion;
3795 else if (record_decl->isStruct())
3796 return lldb::eTypeClassStruct;
3797 else
3798 return lldb::eTypeClassClass;
3799 }
3800 break;
3801 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
3802 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
3803 case clang::Type::UnresolvedUsing: break;
3804 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003805 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003806 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003807 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003808
3809 case clang::Type::Attributed: break;
3810 case clang::Type::TemplateTypeParm: break;
3811 case clang::Type::SubstTemplateTypeParm: break;
3812 case clang::Type::SubstTemplateTypeParmPack:break;
3813 case clang::Type::Auto: break;
3814 case clang::Type::InjectedClassName: break;
3815 case clang::Type::DependentName: break;
3816 case clang::Type::DependentTemplateSpecialization: break;
3817 case clang::Type::PackExpansion: break;
3818
3819 case clang::Type::TypeOfExpr: break;
3820 case clang::Type::TypeOf: break;
3821 case clang::Type::Decltype: break;
3822 case clang::Type::TemplateSpecialization: break;
3823 case clang::Type::Atomic: break;
3824
3825 // pointer type decayed from an array or function type.
3826 case clang::Type::Decayed: break;
3827 case clang::Type::Adjusted: break;
3828 }
3829 // We don't know hot to display this type...
3830 return lldb::eTypeClassOther;
3831
3832}
3833
3834unsigned
3835ClangASTContext::GetTypeQualifiers(void* type)
3836{
3837 if (type)
3838 return GetQualType(type).getQualifiers().getCVRQualifiers();
3839 return 0;
3840}
3841
3842//----------------------------------------------------------------------
3843// Creating related types
3844//----------------------------------------------------------------------
3845
Greg Claytona1e5dc82015-08-11 22:53:00 +00003846CompilerType
3847ClangASTContext::AddConstModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003848{
3849 if (type && type.GetTypeSystem()->AsClangASTContext())
3850 {
3851 clang::QualType result(GetQualType(type));
3852 result.addConst();
Greg Claytona1e5dc82015-08-11 22:53:00 +00003853 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003854 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003855 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003856}
3857
Greg Claytona1e5dc82015-08-11 22:53:00 +00003858CompilerType
3859ClangASTContext::AddRestrictModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003860{
3861 if (type && type.GetTypeSystem()->AsClangASTContext())
3862 {
3863 clang::QualType result(GetQualType(type));
3864 result.getQualifiers().setRestrict (true);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003865 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003866 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003867 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003868}
3869
Greg Claytona1e5dc82015-08-11 22:53:00 +00003870CompilerType
3871ClangASTContext::AddVolatileModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003872{
3873 if (type && type.GetTypeSystem()->AsClangASTContext())
3874 {
3875 clang::QualType result(GetQualType(type));
3876 result.getQualifiers().setVolatile (true);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003877 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003878 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003879 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003880}
3881
Greg Claytona1e5dc82015-08-11 22:53:00 +00003882CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003883ClangASTContext::GetArrayElementType (void* type, uint64_t *stride)
3884{
3885 if (type)
3886 {
3887 clang::QualType qual_type(GetCanonicalQualType(type));
3888
3889 const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
3890
3891 if (!array_eletype)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003892 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003893
Greg Claytona1e5dc82015-08-11 22:53:00 +00003894 CompilerType element_type (getASTContext(), array_eletype->getCanonicalTypeUnqualified());
Greg Claytond8d4a572015-08-11 21:38:15 +00003895
3896 // TODO: the real stride will be >= this value.. find the real one!
3897 if (stride)
3898 *stride = element_type.GetByteSize(nullptr);
3899
3900 return element_type;
3901
3902 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003903 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003904}
3905
Greg Claytona1e5dc82015-08-11 22:53:00 +00003906CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003907ClangASTContext::GetCanonicalType (void* type)
3908{
3909 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003910 return CompilerType (getASTContext(), GetCanonicalQualType(type));
3911 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003912}
3913
3914static clang::QualType
3915GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
3916{
3917 if (qual_type->isPointerType())
3918 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
3919 else
3920 qual_type = qual_type.getUnqualifiedType();
3921 qual_type.removeLocalConst();
3922 qual_type.removeLocalRestrict();
3923 qual_type.removeLocalVolatile();
3924 return qual_type;
3925}
3926
Greg Claytona1e5dc82015-08-11 22:53:00 +00003927CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003928ClangASTContext::GetFullyUnqualifiedType (void* type)
3929{
3930 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003931 return CompilerType(getASTContext(), GetFullyUnqualifiedType_Impl(getASTContext(), GetQualType(type)));
3932 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003933}
3934
3935
3936int
3937ClangASTContext::GetFunctionArgumentCount (void* type)
3938{
3939 if (type)
3940 {
3941 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3942 if (func)
3943 return func->getNumParams();
3944 }
3945 return -1;
3946}
3947
Greg Claytona1e5dc82015-08-11 22:53:00 +00003948CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003949ClangASTContext::GetFunctionArgumentTypeAtIndex (void* type, size_t idx)
3950{
3951 if (type)
3952 {
3953 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3954 if (func)
3955 {
3956 const uint32_t num_args = func->getNumParams();
3957 if (idx < num_args)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003958 return CompilerType(getASTContext(), func->getParamType(idx));
Greg Claytond8d4a572015-08-11 21:38:15 +00003959 }
3960 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003961 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003962}
3963
Greg Claytona1e5dc82015-08-11 22:53:00 +00003964CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003965ClangASTContext::GetFunctionReturnType (void* type)
3966{
3967 if (type)
3968 {
3969 clang::QualType qual_type(GetCanonicalQualType(type));
3970 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3971 if (func)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003972 return CompilerType(getASTContext(), func->getReturnType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003973 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003974 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003975}
3976
3977size_t
3978ClangASTContext::GetNumMemberFunctions (void* type)
3979{
3980 size_t num_functions = 0;
3981 if (type)
3982 {
3983 clang::QualType qual_type(GetCanonicalQualType(type));
3984 switch (qual_type->getTypeClass()) {
3985 case clang::Type::Record:
3986 if (GetCompleteQualType (getASTContext(), qual_type))
3987 {
3988 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3989 const clang::RecordDecl *record_decl = record_type->getDecl();
3990 assert(record_decl);
3991 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3992 if (cxx_record_decl)
3993 num_functions = std::distance(cxx_record_decl->method_begin(), cxx_record_decl->method_end());
3994 }
3995 break;
3996
3997 case clang::Type::ObjCObjectPointer:
3998 if (GetCompleteType(type))
3999 {
4000 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4001 if (objc_class_type)
4002 {
4003 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4004 if (class_interface_decl)
4005 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4006 }
4007 }
4008 break;
4009
4010 case clang::Type::ObjCObject:
4011 case clang::Type::ObjCInterface:
4012 if (GetCompleteType(type))
4013 {
4014 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4015 if (objc_class_type)
4016 {
4017 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4018 if (class_interface_decl)
4019 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4020 }
4021 }
4022 break;
4023
4024
4025 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004026 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004027
4028 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004029 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004030
4031 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004032 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004033
4034 default:
4035 break;
4036 }
4037 }
4038 return num_functions;
4039}
4040
4041TypeMemberFunctionImpl
4042ClangASTContext::GetMemberFunctionAtIndex (void* type, size_t idx)
4043{
4044 std::string name("");
4045 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
Greg Claytona1e5dc82015-08-11 22:53:00 +00004046 CompilerType clang_type{};
Greg Claytond8d4a572015-08-11 21:38:15 +00004047 clang::ObjCMethodDecl *method_decl(nullptr);
4048 if (type)
4049 {
4050 clang::QualType qual_type(GetCanonicalQualType(type));
4051 switch (qual_type->getTypeClass()) {
4052 case clang::Type::Record:
4053 if (GetCompleteQualType (getASTContext(), qual_type))
4054 {
4055 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4056 const clang::RecordDecl *record_decl = record_type->getDecl();
4057 assert(record_decl);
4058 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4059 if (cxx_record_decl)
4060 {
4061 auto method_iter = cxx_record_decl->method_begin();
4062 auto method_end = cxx_record_decl->method_end();
4063 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4064 {
4065 std::advance(method_iter, idx);
4066 auto method_decl = method_iter->getCanonicalDecl();
4067 if (method_decl)
4068 {
4069 if (!method_decl->getName().empty())
4070 name.assign(method_decl->getName().data());
4071 else
4072 name.clear();
4073 if (method_decl->isStatic())
4074 kind = lldb::eMemberFunctionKindStaticMethod;
4075 else if (llvm::isa<clang::CXXConstructorDecl>(method_decl))
4076 kind = lldb::eMemberFunctionKindConstructor;
4077 else if (llvm::isa<clang::CXXDestructorDecl>(method_decl))
4078 kind = lldb::eMemberFunctionKindDestructor;
4079 else
4080 kind = lldb::eMemberFunctionKindInstanceMethod;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004081 clang_type = CompilerType(getASTContext(),method_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004082 }
4083 }
4084 }
4085 }
4086 break;
4087
4088 case clang::Type::ObjCObjectPointer:
4089 if (GetCompleteType(type))
4090 {
4091 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4092 if (objc_class_type)
4093 {
4094 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4095 if (class_interface_decl)
4096 {
4097 auto method_iter = class_interface_decl->meth_begin();
4098 auto method_end = class_interface_decl->meth_end();
4099 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4100 {
4101 std::advance(method_iter, idx);
4102 method_decl = method_iter->getCanonicalDecl();
4103 if (method_decl)
4104 {
4105 name = method_decl->getSelector().getAsString();
4106 if (method_decl->isClassMethod())
4107 kind = lldb::eMemberFunctionKindStaticMethod;
4108 else
4109 kind = lldb::eMemberFunctionKindInstanceMethod;
4110 }
4111 }
4112 }
4113 }
4114 }
4115 break;
4116
4117 case clang::Type::ObjCObject:
4118 case clang::Type::ObjCInterface:
4119 if (GetCompleteType(type))
4120 {
4121 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4122 if (objc_class_type)
4123 {
4124 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4125 if (class_interface_decl)
4126 {
4127 auto method_iter = class_interface_decl->meth_begin();
4128 auto method_end = class_interface_decl->meth_end();
4129 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4130 {
4131 std::advance(method_iter, idx);
4132 method_decl = method_iter->getCanonicalDecl();
4133 if (method_decl)
4134 {
4135 name = method_decl->getSelector().getAsString();
4136 if (method_decl->isClassMethod())
4137 kind = lldb::eMemberFunctionKindStaticMethod;
4138 else
4139 kind = lldb::eMemberFunctionKindInstanceMethod;
4140 }
4141 }
4142 }
4143 }
4144 }
4145 break;
4146
4147 case clang::Type::Typedef:
4148 return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx);
4149
4150 case clang::Type::Elaborated:
4151 return GetMemberFunctionAtIndex(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx);
4152
4153 case clang::Type::Paren:
4154 return GetMemberFunctionAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx);
4155
4156 default:
4157 break;
4158 }
4159 }
4160
4161 if (kind == eMemberFunctionKindUnknown)
4162 return TypeMemberFunctionImpl();
4163 if (method_decl)
4164 return TypeMemberFunctionImpl(method_decl, name, kind);
4165 if (type)
4166 return TypeMemberFunctionImpl(clang_type, name, kind);
4167
4168 return TypeMemberFunctionImpl();
4169}
4170
Greg Claytona1e5dc82015-08-11 22:53:00 +00004171CompilerType
4172ClangASTContext::GetLValueReferenceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004173{
4174 if (type)
4175 {
4176 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
4177 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004178 return CompilerType(ast->getASTContext(), ast->getASTContext()->getLValueReferenceType(GetQualType(type)));
Greg Claytond8d4a572015-08-11 21:38:15 +00004179 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004180 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004181}
4182
Greg Claytona1e5dc82015-08-11 22:53:00 +00004183CompilerType
4184ClangASTContext::GetRValueReferenceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004185{
4186 if (type)
4187 {
4188 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
4189 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004190 return CompilerType(ast->getASTContext(), ast->getASTContext()->getRValueReferenceType(GetQualType(type)));
Greg Claytond8d4a572015-08-11 21:38:15 +00004191 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004192 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004193}
4194
Greg Claytona1e5dc82015-08-11 22:53:00 +00004195CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004196ClangASTContext::GetNonReferenceType (void* type)
4197{
4198 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004199 return CompilerType(getASTContext(), GetQualType(type).getNonReferenceType());
4200 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004201}
4202
Greg Claytona1e5dc82015-08-11 22:53:00 +00004203CompilerType
4204ClangASTContext::CreateTypedefType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00004205 const char *typedef_name,
4206 clang::DeclContext *decl_ctx)
4207{
4208 if (type && typedef_name && typedef_name[0])
4209 {
4210 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
4211 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004212 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004213 clang::ASTContext* clang_ast = ast->getASTContext();
4214 clang::QualType qual_type (GetQualType(type));
4215 if (decl_ctx == nullptr)
4216 decl_ctx = ast->getASTContext()->getTranslationUnitDecl();
4217 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4218 decl_ctx,
4219 clang::SourceLocation(),
4220 clang::SourceLocation(),
4221 &clang_ast->Idents.get(typedef_name),
4222 clang_ast->getTrivialTypeSourceInfo(qual_type));
4223
4224 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4225
4226 // Get a uniqued clang::QualType for the typedef decl type
Greg Claytona1e5dc82015-08-11 22:53:00 +00004227 return CompilerType (clang_ast, clang_ast->getTypedefType (decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00004228 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004229 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004230
4231}
4232
Greg Claytona1e5dc82015-08-11 22:53:00 +00004233CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004234ClangASTContext::GetPointeeType (void* type)
4235{
4236 if (type)
4237 {
4238 clang::QualType qual_type(GetQualType(type));
Greg Claytona1e5dc82015-08-11 22:53:00 +00004239 return CompilerType (getASTContext(), qual_type.getTypePtr()->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004240 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004241 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004242}
4243
Greg Claytona1e5dc82015-08-11 22:53:00 +00004244CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004245ClangASTContext::GetPointerType (void* type)
4246{
4247 if (type)
4248 {
4249 clang::QualType qual_type (GetQualType(type));
4250
4251 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4252 switch (type_class)
4253 {
4254 case clang::Type::ObjCObject:
4255 case clang::Type::ObjCInterface:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004256 return CompilerType(getASTContext(), getASTContext()->getObjCObjectPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004257
4258 default:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004259 return CompilerType(getASTContext(), getASTContext()->getPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004260 }
4261 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004262 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004263}
4264
Greg Claytona1e5dc82015-08-11 22:53:00 +00004265CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004266ClangASTContext::GetTypedefedType (void* type)
4267{
4268 if (type)
4269 {
4270 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4271 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004272 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004273 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004274 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004275}
4276
Greg Claytona1e5dc82015-08-11 22:53:00 +00004277CompilerType
4278ClangASTContext::RemoveFastQualifiers (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004279{
4280 if (type && type.GetTypeSystem()->AsClangASTContext())
4281 {
4282 clang::QualType qual_type(GetQualType(type));
4283 qual_type.getQualifiers().removeFastQualifiers();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004284 return CompilerType (type.GetTypeSystem(), qual_type.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004285 }
4286 return type;
4287}
4288
4289
4290//----------------------------------------------------------------------
4291// Create related types using the current type's AST
4292//----------------------------------------------------------------------
4293
Greg Claytona1e5dc82015-08-11 22:53:00 +00004294CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004295ClangASTContext::GetBasicTypeFromAST (void* type, lldb::BasicType basic_type)
4296{
4297 if (type)
4298 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytona1e5dc82015-08-11 22:53:00 +00004299 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004300}
4301//----------------------------------------------------------------------
4302// Exploring the type
4303//----------------------------------------------------------------------
4304
4305uint64_t
4306ClangASTContext::GetBitSize (void* type, ExecutionContextScope *exe_scope)
4307{
4308 if (GetCompleteType (type))
4309 {
4310 clang::QualType qual_type(GetCanonicalQualType(type));
4311 switch (qual_type->getTypeClass())
4312 {
4313 case clang::Type::ObjCInterface:
4314 case clang::Type::ObjCObject:
4315 {
4316 ExecutionContext exe_ctx (exe_scope);
4317 Process *process = exe_ctx.GetProcessPtr();
4318 if (process)
4319 {
4320 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4321 if (objc_runtime)
4322 {
4323 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004324 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00004325 return bit_size;
4326 }
4327 }
4328 else
4329 {
4330 static bool g_printed = false;
4331 if (!g_printed)
4332 {
4333 StreamString s;
4334 DumpTypeDescription(&s);
4335
4336 llvm::outs() << "warning: trying to determine the size of type ";
4337 llvm::outs() << s.GetString() << "\n";
4338 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
4339 llvm::outs() << "backtrace:\n";
4340 llvm::sys::PrintStackTrace(llvm::outs());
4341 llvm::outs() << "\n";
4342 g_printed = true;
4343 }
4344 }
4345 }
4346 // fallthrough
4347 default:
4348 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
4349 if (bit_size == 0)
4350 {
4351 if (qual_type->isIncompleteArrayType())
4352 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
4353 }
4354 if (qual_type->isObjCObjectOrInterfaceType())
4355 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
4356 return bit_size;
4357 }
4358 }
4359 return 0;
4360}
4361
4362size_t
4363ClangASTContext::GetTypeBitAlign (void* type)
4364{
4365 if (GetCompleteType(type))
4366 return getASTContext()->getTypeAlign(GetQualType(type));
4367 return 0;
4368}
4369
4370
4371lldb::Encoding
4372ClangASTContext::GetEncoding (void* type, uint64_t &count)
4373{
4374 if (!type)
4375 return lldb::eEncodingInvalid;
4376
4377 count = 1;
4378 clang::QualType qual_type(GetCanonicalQualType(type));
4379
4380 switch (qual_type->getTypeClass())
4381 {
4382 case clang::Type::UnaryTransform:
4383 break;
4384
4385 case clang::Type::FunctionNoProto:
4386 case clang::Type::FunctionProto:
4387 break;
4388
4389 case clang::Type::IncompleteArray:
4390 case clang::Type::VariableArray:
4391 break;
4392
4393 case clang::Type::ConstantArray:
4394 break;
4395
4396 case clang::Type::ExtVector:
4397 case clang::Type::Vector:
4398 // TODO: Set this to more than one???
4399 break;
4400
4401 case clang::Type::Builtin:
4402 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4403 {
4404 default: assert(0 && "Unknown builtin type!");
4405 case clang::BuiltinType::Void:
4406 break;
4407
4408 case clang::BuiltinType::Bool:
4409 case clang::BuiltinType::Char_S:
4410 case clang::BuiltinType::SChar:
4411 case clang::BuiltinType::WChar_S:
4412 case clang::BuiltinType::Char16:
4413 case clang::BuiltinType::Char32:
4414 case clang::BuiltinType::Short:
4415 case clang::BuiltinType::Int:
4416 case clang::BuiltinType::Long:
4417 case clang::BuiltinType::LongLong:
4418 case clang::BuiltinType::Int128: return lldb::eEncodingSint;
4419
4420 case clang::BuiltinType::Char_U:
4421 case clang::BuiltinType::UChar:
4422 case clang::BuiltinType::WChar_U:
4423 case clang::BuiltinType::UShort:
4424 case clang::BuiltinType::UInt:
4425 case clang::BuiltinType::ULong:
4426 case clang::BuiltinType::ULongLong:
4427 case clang::BuiltinType::UInt128: return lldb::eEncodingUint;
4428
4429 case clang::BuiltinType::Float:
4430 case clang::BuiltinType::Double:
4431 case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
4432
4433 case clang::BuiltinType::ObjCClass:
4434 case clang::BuiltinType::ObjCId:
4435 case clang::BuiltinType::ObjCSel: return lldb::eEncodingUint;
4436
4437 case clang::BuiltinType::NullPtr: return lldb::eEncodingUint;
4438
4439 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4440 case clang::BuiltinType::Kind::BoundMember:
4441 case clang::BuiltinType::Kind::BuiltinFn:
4442 case clang::BuiltinType::Kind::Dependent:
4443 case clang::BuiltinType::Kind::Half:
4444 case clang::BuiltinType::Kind::OCLEvent:
4445 case clang::BuiltinType::Kind::OCLImage1d:
4446 case clang::BuiltinType::Kind::OCLImage1dArray:
4447 case clang::BuiltinType::Kind::OCLImage1dBuffer:
4448 case clang::BuiltinType::Kind::OCLImage2d:
4449 case clang::BuiltinType::Kind::OCLImage2dArray:
4450 case clang::BuiltinType::Kind::OCLImage3d:
4451 case clang::BuiltinType::Kind::OCLSampler:
4452 case clang::BuiltinType::Kind::Overload:
4453 case clang::BuiltinType::Kind::PseudoObject:
4454 case clang::BuiltinType::Kind::UnknownAny:
4455 break;
4456 }
4457 break;
4458 // All pointer types are represented as unsigned integer encodings.
4459 // We may nee to add a eEncodingPointer if we ever need to know the
4460 // difference
4461 case clang::Type::ObjCObjectPointer:
4462 case clang::Type::BlockPointer:
4463 case clang::Type::Pointer:
4464 case clang::Type::LValueReference:
4465 case clang::Type::RValueReference:
4466 case clang::Type::MemberPointer: return lldb::eEncodingUint;
4467 case clang::Type::Complex:
4468 {
4469 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4470 if (qual_type->isComplexType())
4471 encoding = lldb::eEncodingIEEE754;
4472 else
4473 {
4474 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
4475 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004476 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004477 else
4478 encoding = lldb::eEncodingSint;
4479 }
4480 count = 2;
4481 return encoding;
4482 }
4483
4484 case clang::Type::ObjCInterface: break;
4485 case clang::Type::Record: break;
4486 case clang::Type::Enum: return lldb::eEncodingSint;
4487 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004488 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004489
4490 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004491 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004492
4493 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004494 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004495
4496 case clang::Type::DependentSizedArray:
4497 case clang::Type::DependentSizedExtVector:
4498 case clang::Type::UnresolvedUsing:
4499 case clang::Type::Attributed:
4500 case clang::Type::TemplateTypeParm:
4501 case clang::Type::SubstTemplateTypeParm:
4502 case clang::Type::SubstTemplateTypeParmPack:
4503 case clang::Type::Auto:
4504 case clang::Type::InjectedClassName:
4505 case clang::Type::DependentName:
4506 case clang::Type::DependentTemplateSpecialization:
4507 case clang::Type::PackExpansion:
4508 case clang::Type::ObjCObject:
4509
4510 case clang::Type::TypeOfExpr:
4511 case clang::Type::TypeOf:
4512 case clang::Type::Decltype:
4513 case clang::Type::TemplateSpecialization:
4514 case clang::Type::Atomic:
4515 case clang::Type::Adjusted:
4516 break;
4517
4518 // pointer type decayed from an array or function type.
4519 case clang::Type::Decayed:
4520 break;
4521 }
4522 count = 0;
4523 return lldb::eEncodingInvalid;
4524}
4525
4526lldb::Format
4527ClangASTContext::GetFormat (void* type)
4528{
4529 if (!type)
4530 return lldb::eFormatDefault;
4531
4532 clang::QualType qual_type(GetCanonicalQualType(type));
4533
4534 switch (qual_type->getTypeClass())
4535 {
4536 case clang::Type::UnaryTransform:
4537 break;
4538
4539 case clang::Type::FunctionNoProto:
4540 case clang::Type::FunctionProto:
4541 break;
4542
4543 case clang::Type::IncompleteArray:
4544 case clang::Type::VariableArray:
4545 break;
4546
4547 case clang::Type::ConstantArray:
4548 return lldb::eFormatVoid; // no value
4549
4550 case clang::Type::ExtVector:
4551 case clang::Type::Vector:
4552 break;
4553
4554 case clang::Type::Builtin:
4555 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4556 {
4557 //default: assert(0 && "Unknown builtin type!");
4558 case clang::BuiltinType::UnknownAny:
4559 case clang::BuiltinType::Void:
4560 case clang::BuiltinType::BoundMember:
4561 break;
4562
4563 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
4564 case clang::BuiltinType::Char_S:
4565 case clang::BuiltinType::SChar:
4566 case clang::BuiltinType::WChar_S:
4567 case clang::BuiltinType::Char_U:
4568 case clang::BuiltinType::UChar:
4569 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
4570 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
4571 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
4572 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
4573 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
4574 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
4575 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
4576 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
4577 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
4578 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
4579 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
4580 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
4581 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
4582 case clang::BuiltinType::Float: return lldb::eFormatFloat;
4583 case clang::BuiltinType::Double: return lldb::eFormatFloat;
4584 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
4585 case clang::BuiltinType::NullPtr:
4586 case clang::BuiltinType::Overload:
4587 case clang::BuiltinType::Dependent:
4588 case clang::BuiltinType::ObjCId:
4589 case clang::BuiltinType::ObjCClass:
4590 case clang::BuiltinType::ObjCSel:
4591 case clang::BuiltinType::Half:
4592 case clang::BuiltinType::ARCUnbridgedCast:
4593 case clang::BuiltinType::PseudoObject:
4594 case clang::BuiltinType::BuiltinFn:
4595 case clang::BuiltinType::OCLEvent:
4596 case clang::BuiltinType::OCLImage1d:
4597 case clang::BuiltinType::OCLImage1dArray:
4598 case clang::BuiltinType::OCLImage1dBuffer:
4599 case clang::BuiltinType::OCLImage2d:
4600 case clang::BuiltinType::OCLImage2dArray:
4601 case clang::BuiltinType::OCLImage3d:
4602 case clang::BuiltinType::OCLSampler:
4603 return lldb::eFormatHex;
4604 }
4605 break;
4606 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
4607 case clang::Type::BlockPointer: return lldb::eFormatHex;
4608 case clang::Type::Pointer: return lldb::eFormatHex;
4609 case clang::Type::LValueReference:
4610 case clang::Type::RValueReference: return lldb::eFormatHex;
4611 case clang::Type::MemberPointer: break;
4612 case clang::Type::Complex:
4613 {
4614 if (qual_type->isComplexType())
4615 return lldb::eFormatComplex;
4616 else
4617 return lldb::eFormatComplexInteger;
4618 }
4619 case clang::Type::ObjCInterface: break;
4620 case clang::Type::Record: break;
4621 case clang::Type::Enum: return lldb::eFormatEnum;
4622 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004623 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004624 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004625 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004626 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004627 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004628 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004629 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004630 case clang::Type::DependentSizedArray:
4631 case clang::Type::DependentSizedExtVector:
4632 case clang::Type::UnresolvedUsing:
4633 case clang::Type::Attributed:
4634 case clang::Type::TemplateTypeParm:
4635 case clang::Type::SubstTemplateTypeParm:
4636 case clang::Type::SubstTemplateTypeParmPack:
4637 case clang::Type::InjectedClassName:
4638 case clang::Type::DependentName:
4639 case clang::Type::DependentTemplateSpecialization:
4640 case clang::Type::PackExpansion:
4641 case clang::Type::ObjCObject:
4642
4643 case clang::Type::TypeOfExpr:
4644 case clang::Type::TypeOf:
4645 case clang::Type::Decltype:
4646 case clang::Type::TemplateSpecialization:
4647 case clang::Type::Atomic:
4648 case clang::Type::Adjusted:
4649 break;
4650
4651 // pointer type decayed from an array or function type.
4652 case clang::Type::Decayed:
4653 break;
4654 }
4655 // We don't know hot to display this type...
4656 return lldb::eFormatBytes;
4657}
4658
4659static bool
4660ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
4661{
4662 while (class_interface_decl)
4663 {
4664 if (class_interface_decl->ivar_size() > 0)
4665 return true;
4666
4667 if (check_superclass)
4668 class_interface_decl = class_interface_decl->getSuperClass();
4669 else
4670 break;
4671 }
4672 return false;
4673}
4674
4675uint32_t
4676ClangASTContext::GetNumChildren (void* type, bool omit_empty_base_classes)
4677{
4678 if (!type)
4679 return 0;
4680
4681 uint32_t num_children = 0;
4682 clang::QualType qual_type(GetQualType(type));
4683 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4684 switch (type_class)
4685 {
4686 case clang::Type::Builtin:
4687 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4688 {
4689 case clang::BuiltinType::ObjCId: // child is Class
4690 case clang::BuiltinType::ObjCClass: // child is Class
4691 num_children = 1;
4692 break;
4693
4694 default:
4695 break;
4696 }
4697 break;
4698
4699 case clang::Type::Complex: return 0;
4700
4701 case clang::Type::Record:
4702 if (GetCompleteQualType (getASTContext(), qual_type))
4703 {
4704 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4705 const clang::RecordDecl *record_decl = record_type->getDecl();
4706 assert(record_decl);
4707 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4708 if (cxx_record_decl)
4709 {
4710 if (omit_empty_base_classes)
4711 {
4712 // Check each base classes to see if it or any of its
4713 // base classes contain any fields. This can help
4714 // limit the noise in variable views by not having to
4715 // show base classes that contain no members.
4716 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4717 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4718 base_class != base_class_end;
4719 ++base_class)
4720 {
4721 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
4722
4723 // Skip empty base classes
4724 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
4725 continue;
4726
4727 num_children++;
4728 }
4729 }
4730 else
4731 {
4732 // Include all base classes
4733 num_children += cxx_record_decl->getNumBases();
4734 }
4735
4736 }
4737 clang::RecordDecl::field_iterator field, field_end;
4738 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
4739 ++num_children;
4740 }
4741 break;
4742
4743 case clang::Type::ObjCObject:
4744 case clang::Type::ObjCInterface:
4745 if (GetCompleteQualType (getASTContext(), qual_type))
4746 {
4747 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4748 assert (objc_class_type);
4749 if (objc_class_type)
4750 {
4751 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4752
4753 if (class_interface_decl)
4754 {
4755
4756 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4757 if (superclass_interface_decl)
4758 {
4759 if (omit_empty_base_classes)
4760 {
4761 if (ObjCDeclHasIVars (superclass_interface_decl, true))
4762 ++num_children;
4763 }
4764 else
4765 ++num_children;
4766 }
4767
4768 num_children += class_interface_decl->ivar_size();
4769 }
4770 }
4771 }
4772 break;
4773
4774 case clang::Type::ObjCObjectPointer:
4775 {
4776 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
4777 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004778 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004779 // If this type points to a simple type, then it has 1 child
4780 if (num_pointee_children == 0)
4781 num_children = 1;
4782 else
4783 num_children = num_pointee_children;
4784 }
4785 break;
4786
4787 case clang::Type::Vector:
4788 case clang::Type::ExtVector:
4789 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
4790 break;
4791
4792 case clang::Type::ConstantArray:
4793 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4794 break;
4795
4796 case clang::Type::Pointer:
4797 {
4798 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
4799 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00004800 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004801 if (num_pointee_children == 0)
4802 {
4803 // We have a pointer to a pointee type that claims it has no children.
4804 // We will want to look at
4805 num_children = GetNumPointeeChildren (pointee_type);
4806 }
4807 else
4808 num_children = num_pointee_children;
4809 }
4810 break;
4811
4812 case clang::Type::LValueReference:
4813 case clang::Type::RValueReference:
4814 {
4815 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
4816 clang::QualType pointee_type = reference_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004817 uint32_t num_pointee_children = CompilerType (getASTContext(), pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004818 // If this type points to a simple type, then it has 1 child
4819 if (num_pointee_children == 0)
4820 num_children = 1;
4821 else
4822 num_children = num_pointee_children;
4823 }
4824 break;
4825
4826
4827 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004828 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004829 break;
4830
4831 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004832 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004833 break;
4834
4835 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004836 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004837 break;
4838 default:
4839 break;
4840 }
4841 return num_children;
4842}
4843
4844lldb::BasicType
4845ClangASTContext::GetBasicTypeEnumeration (void* type)
4846{
4847 if (type)
4848 {
4849 clang::QualType qual_type(GetQualType(type));
4850 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4851 if (type_class == clang::Type::Builtin)
4852 {
4853 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4854 {
4855 case clang::BuiltinType::Void: return eBasicTypeVoid;
4856 case clang::BuiltinType::Bool: return eBasicTypeBool;
4857 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
4858 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
4859 case clang::BuiltinType::Char16: return eBasicTypeChar16;
4860 case clang::BuiltinType::Char32: return eBasicTypeChar32;
4861 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
4862 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
4863 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
4864 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
4865 case clang::BuiltinType::Short: return eBasicTypeShort;
4866 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
4867 case clang::BuiltinType::Int: return eBasicTypeInt;
4868 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
4869 case clang::BuiltinType::Long: return eBasicTypeLong;
4870 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
4871 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
4872 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
4873 case clang::BuiltinType::Int128: return eBasicTypeInt128;
4874 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
4875
4876 case clang::BuiltinType::Half: return eBasicTypeHalf;
4877 case clang::BuiltinType::Float: return eBasicTypeFloat;
4878 case clang::BuiltinType::Double: return eBasicTypeDouble;
4879 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
4880
4881 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
4882 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
4883 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
4884 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
4885 case clang::BuiltinType::Dependent:
4886 case clang::BuiltinType::Overload:
4887 case clang::BuiltinType::BoundMember:
4888 case clang::BuiltinType::PseudoObject:
4889 case clang::BuiltinType::UnknownAny:
4890 case clang::BuiltinType::BuiltinFn:
4891 case clang::BuiltinType::ARCUnbridgedCast:
4892 case clang::BuiltinType::OCLEvent:
4893 case clang::BuiltinType::OCLImage1d:
4894 case clang::BuiltinType::OCLImage1dArray:
4895 case clang::BuiltinType::OCLImage1dBuffer:
4896 case clang::BuiltinType::OCLImage2d:
4897 case clang::BuiltinType::OCLImage2dArray:
4898 case clang::BuiltinType::OCLImage3d:
4899 case clang::BuiltinType::OCLSampler:
4900 return eBasicTypeOther;
4901 }
4902 }
4903 }
4904 return eBasicTypeInvalid;
4905}
4906
4907
4908#pragma mark Aggregate Types
4909
4910uint32_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00004911ClangASTContext::GetNumDirectBaseClasses (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004912{
4913 if (!type)
4914 return 0;
4915 ClangASTContext *ast = type.GetTypeSystem()->AsClangASTContext();
4916 if (!ast)
4917 return 0;
4918
4919 uint32_t count = 0;
4920 clang::QualType qual_type(GetCanonicalQualType(type));
4921 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4922 switch (type_class)
4923 {
4924 case clang::Type::Record:
4925 if (ast->GetCompleteType(type.GetOpaqueQualType()))
4926 {
4927 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4928 if (cxx_record_decl)
4929 count = cxx_record_decl->getNumBases();
4930 }
4931 break;
4932
4933 case clang::Type::ObjCObjectPointer:
4934 count = GetNumDirectBaseClasses(ast->GetPointeeType(type.GetOpaqueQualType()));
4935 break;
4936
4937 case clang::Type::ObjCObject:
4938 if (ast->GetCompleteType(type.GetOpaqueQualType()))
4939 {
4940 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
4941 if (objc_class_type)
4942 {
4943 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4944
4945 if (class_interface_decl && class_interface_decl->getSuperClass())
4946 count = 1;
4947 }
4948 }
4949 break;
4950 case clang::Type::ObjCInterface:
4951 if (ast->GetCompleteType(type.GetOpaqueQualType()))
4952 {
4953 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
4954 if (objc_interface_type)
4955 {
4956 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
4957
4958 if (class_interface_decl && class_interface_decl->getSuperClass())
4959 count = 1;
4960 }
4961 }
4962 break;
4963
4964
4965 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004966 count = GetNumDirectBaseClasses(CompilerType (ast->getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()));
Greg Claytond8d4a572015-08-11 21:38:15 +00004967 break;
4968
4969 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004970 count = GetNumDirectBaseClasses(CompilerType (ast->getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()));
Greg Claytond8d4a572015-08-11 21:38:15 +00004971 break;
4972
4973 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004974 return GetNumDirectBaseClasses(CompilerType (ast->getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()));
Greg Claytond8d4a572015-08-11 21:38:15 +00004975
4976 default:
4977 break;
4978 }
4979 return count;
4980}
4981
4982uint32_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00004983ClangASTContext::GetNumVirtualBaseClasses (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004984{
4985 if (!type)
4986 return 0;
4987 ClangASTContext *ast = type.GetTypeSystem()->AsClangASTContext();
4988 if (!ast)
4989 return 0;
4990
4991 uint32_t count = 0;
4992 clang::QualType qual_type(GetCanonicalQualType(type));
4993 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4994 switch (type_class)
4995 {
4996 case clang::Type::Record:
4997 if (ast->GetCompleteType(type.GetOpaqueQualType()))
4998 {
4999 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5000 if (cxx_record_decl)
5001 count = cxx_record_decl->getNumVBases();
5002 }
5003 break;
5004
5005 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005006 count = GetNumVirtualBaseClasses(CompilerType (ast->getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()));
Greg Claytond8d4a572015-08-11 21:38:15 +00005007 break;
5008
5009 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005010 count = GetNumVirtualBaseClasses(CompilerType (ast->getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()));
Greg Claytond8d4a572015-08-11 21:38:15 +00005011 break;
5012
5013 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005014 count = GetNumVirtualBaseClasses(CompilerType (ast->getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()));
Greg Claytond8d4a572015-08-11 21:38:15 +00005015 break;
5016
5017 default:
5018 break;
5019 }
5020 return count;
5021}
5022
5023uint32_t
5024ClangASTContext::GetNumFields (void* type)
5025{
5026 if (!type)
5027 return 0;
5028
5029 uint32_t count = 0;
5030 clang::QualType qual_type(GetCanonicalQualType(type));
5031 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5032 switch (type_class)
5033 {
5034 case clang::Type::Record:
5035 if (GetCompleteType(type))
5036 {
5037 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
5038 if (record_type)
5039 {
5040 clang::RecordDecl *record_decl = record_type->getDecl();
5041 if (record_decl)
5042 {
5043 uint32_t field_idx = 0;
5044 clang::RecordDecl::field_iterator field, field_end;
5045 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5046 ++field_idx;
5047 count = field_idx;
5048 }
5049 }
5050 }
5051 break;
5052
5053 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005054 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005055 break;
5056
5057 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005058 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005059 break;
5060
5061 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005062 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005063 break;
5064
5065 case clang::Type::ObjCObjectPointer:
5066 if (GetCompleteType(type))
5067 {
5068 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5069 if (objc_class_type)
5070 {
5071 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
5072
5073 if (class_interface_decl)
5074 count = class_interface_decl->ivar_size();
5075 }
5076 }
5077 break;
5078
5079 case clang::Type::ObjCObject:
5080 case clang::Type::ObjCInterface:
5081 if (GetCompleteType(type))
5082 {
5083 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5084 if (objc_class_type)
5085 {
5086 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5087
5088 if (class_interface_decl)
5089 count = class_interface_decl->ivar_size();
5090 }
5091 }
5092 break;
5093
5094 default:
5095 break;
5096 }
5097 return count;
5098}
5099
Greg Claytona1e5dc82015-08-11 22:53:00 +00005100CompilerType
5101ClangASTContext::GetDirectBaseClassAtIndex (const CompilerType& type, size_t idx, uint32_t *bit_offset_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00005102{
5103 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005104 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005105 ClangASTContext *ast = type.GetTypeSystem()->AsClangASTContext();
5106 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005107 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005108
5109 clang::QualType qual_type(GetCanonicalQualType(type));
5110 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5111 switch (type_class)
5112 {
5113 case clang::Type::Record:
5114 if (ast->GetCompleteType(type.GetOpaqueQualType()))
5115 {
5116 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5117 if (cxx_record_decl)
5118 {
5119 uint32_t curr_idx = 0;
5120 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5121 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5122 base_class != base_class_end;
5123 ++base_class, ++curr_idx)
5124 {
5125 if (curr_idx == idx)
5126 {
5127 if (bit_offset_ptr)
5128 {
5129 const clang::ASTRecordLayout &record_layout = ast->getASTContext()->getASTRecordLayout(cxx_record_decl);
5130 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5131 if (base_class->isVirtual())
5132 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5133 else
5134 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5135 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005136 return CompilerType (ast, base_class->getType().getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00005137 }
5138 }
5139 }
5140 }
5141 break;
5142
5143 case clang::Type::ObjCObjectPointer:
5144 return GetDirectBaseClassAtIndex(ast->GetPointeeType(type.GetOpaqueQualType()), idx, bit_offset_ptr);
5145
5146 case clang::Type::ObjCObject:
5147 if (idx == 0 && ast->GetCompleteType(type.GetOpaqueQualType()))
5148 {
5149 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5150 if (objc_class_type)
5151 {
5152 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5153
5154 if (class_interface_decl)
5155 {
5156 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5157 if (superclass_interface_decl)
5158 {
5159 if (bit_offset_ptr)
5160 *bit_offset_ptr = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005161 return CompilerType (ast->getASTContext(), ast->getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00005162 }
5163 }
5164 }
5165 }
5166 break;
5167 case clang::Type::ObjCInterface:
5168 if (idx == 0 && ast->GetCompleteType(type.GetOpaqueQualType()))
5169 {
5170 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5171 if (objc_interface_type)
5172 {
5173 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5174
5175 if (class_interface_decl)
5176 {
5177 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5178 if (superclass_interface_decl)
5179 {
5180 if (bit_offset_ptr)
5181 *bit_offset_ptr = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005182 return CompilerType (ast->getASTContext(), ast->getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00005183 }
5184 }
5185 }
5186 }
5187 break;
5188
5189
5190 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005191 return GetDirectBaseClassAtIndex (CompilerType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), idx, bit_offset_ptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00005192
5193 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005194 return GetDirectBaseClassAtIndex (CompilerType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), idx, bit_offset_ptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00005195
5196 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005197 return GetDirectBaseClassAtIndex (CompilerType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), idx, bit_offset_ptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00005198
5199 default:
5200 break;
5201 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005202 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005203}
5204
Greg Claytona1e5dc82015-08-11 22:53:00 +00005205CompilerType
5206ClangASTContext::GetVirtualBaseClassAtIndex (const CompilerType& type, size_t idx, uint32_t *bit_offset_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00005207{
5208 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005209 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005210 ClangASTContext *ast = type.GetTypeSystem()->AsClangASTContext();
5211 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005212 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005213
5214 clang::QualType qual_type(GetCanonicalQualType(type));
5215 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5216 switch (type_class)
5217 {
5218 case clang::Type::Record:
5219 if (ast->GetCompleteType(type.GetOpaqueQualType()))
5220 {
5221 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5222 if (cxx_record_decl)
5223 {
5224 uint32_t curr_idx = 0;
5225 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5226 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
5227 base_class != base_class_end;
5228 ++base_class, ++curr_idx)
5229 {
5230 if (curr_idx == idx)
5231 {
5232 if (bit_offset_ptr)
5233 {
5234 const clang::ASTRecordLayout &record_layout = ast->getASTContext()->getASTRecordLayout(cxx_record_decl);
5235 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5236 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5237
5238 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005239 return CompilerType (ast, base_class->getType().getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00005240 }
5241 }
5242 }
5243 }
5244 break;
5245
5246 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005247 return GetVirtualBaseClassAtIndex (CompilerType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), idx, bit_offset_ptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00005248
5249 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005250 return GetVirtualBaseClassAtIndex (CompilerType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), idx, bit_offset_ptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00005251
5252 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005253 return GetVirtualBaseClassAtIndex (CompilerType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), idx, bit_offset_ptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00005254
5255 default:
5256 break;
5257 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005258 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005259}
5260
5261static clang_type_t
5262GetObjCFieldAtIndex (clang::ASTContext *ast,
5263 clang::ObjCInterfaceDecl *class_interface_decl,
5264 size_t idx,
5265 std::string& name,
5266 uint64_t *bit_offset_ptr,
5267 uint32_t *bitfield_bit_size_ptr,
5268 bool *is_bitfield_ptr)
5269{
5270 if (class_interface_decl)
5271 {
5272 if (idx < (class_interface_decl->ivar_size()))
5273 {
5274 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5275 uint32_t ivar_idx = 0;
5276
5277 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
5278 {
5279 if (ivar_idx == idx)
5280 {
5281 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5282
5283 clang::QualType ivar_qual_type(ivar_decl->getType());
5284
5285 name.assign(ivar_decl->getNameAsString());
5286
5287 if (bit_offset_ptr)
5288 {
5289 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
5290 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
5291 }
5292
5293 const bool is_bitfield = ivar_pos->isBitField();
5294
5295 if (bitfield_bit_size_ptr)
5296 {
5297 *bitfield_bit_size_ptr = 0;
5298
5299 if (is_bitfield && ast)
5300 {
5301 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
5302 llvm::APSInt bitfield_apsint;
5303 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
5304 {
5305 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5306 }
5307 }
5308 }
5309 if (is_bitfield_ptr)
5310 *is_bitfield_ptr = is_bitfield;
5311
5312 return ivar_qual_type.getAsOpaquePtr();
5313 }
5314 }
5315 }
5316 }
5317 return nullptr;
5318}
5319
Greg Claytona1e5dc82015-08-11 22:53:00 +00005320CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00005321ClangASTContext::GetFieldAtIndex (void* type, size_t idx,
5322 std::string& name,
5323 uint64_t *bit_offset_ptr,
5324 uint32_t *bitfield_bit_size_ptr,
5325 bool *is_bitfield_ptr)
5326{
5327 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005328 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005329
5330 clang::QualType qual_type(GetCanonicalQualType(type));
5331 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5332 switch (type_class)
5333 {
5334 case clang::Type::Record:
5335 if (GetCompleteType(type))
5336 {
5337 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5338 const clang::RecordDecl *record_decl = record_type->getDecl();
5339 uint32_t field_idx = 0;
5340 clang::RecordDecl::field_iterator field, field_end;
5341 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
5342 {
5343 if (idx == field_idx)
5344 {
5345 // Print the member type if requested
5346 // Print the member name and equal sign
5347 name.assign(field->getNameAsString());
5348
5349 // Figure out the type byte size (field_type_info.first) and
5350 // alignment (field_type_info.second) from the AST context.
5351 if (bit_offset_ptr)
5352 {
5353 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5354 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5355 }
5356
5357 const bool is_bitfield = field->isBitField();
5358
5359 if (bitfield_bit_size_ptr)
5360 {
5361 *bitfield_bit_size_ptr = 0;
5362
5363 if (is_bitfield)
5364 {
5365 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5366 llvm::APSInt bitfield_apsint;
5367 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5368 {
5369 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5370 }
5371 }
5372 }
5373 if (is_bitfield_ptr)
5374 *is_bitfield_ptr = is_bitfield;
5375
Greg Claytona1e5dc82015-08-11 22:53:00 +00005376 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005377 }
5378 }
5379 }
5380 break;
5381
5382 case clang::Type::ObjCObjectPointer:
5383 if (GetCompleteType(type))
5384 {
5385 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5386 if (objc_class_type)
5387 {
5388 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005389 return CompilerType (this, GetObjCFieldAtIndex(getASTContext(), class_interface_decl, idx, name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr));
Greg Claytond8d4a572015-08-11 21:38:15 +00005390 }
5391 }
5392 break;
5393
5394 case clang::Type::ObjCObject:
5395 case clang::Type::ObjCInterface:
5396 if (GetCompleteType(type))
5397 {
5398 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5399 assert (objc_class_type);
5400 if (objc_class_type)
5401 {
5402 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005403 return CompilerType (this, GetObjCFieldAtIndex(getASTContext(), class_interface_decl, idx, name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr));
Greg Claytond8d4a572015-08-11 21:38:15 +00005404 }
5405 }
5406 break;
5407
5408
5409 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005410 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005411 GetFieldAtIndex (idx,
5412 name,
5413 bit_offset_ptr,
5414 bitfield_bit_size_ptr,
5415 is_bitfield_ptr);
5416
5417 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005418 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005419 GetFieldAtIndex (idx,
5420 name,
5421 bit_offset_ptr,
5422 bitfield_bit_size_ptr,
5423 is_bitfield_ptr);
5424
5425 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005426 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005427 GetFieldAtIndex (idx,
5428 name,
5429 bit_offset_ptr,
5430 bitfield_bit_size_ptr,
5431 is_bitfield_ptr);
5432
5433 default:
5434 break;
5435 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005436 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005437}
5438
5439// If a pointer to a pointee type (the clang_type arg) says that it has no
5440// children, then we either need to trust it, or override it and return a
5441// different result. For example, an "int *" has one child that is an integer,
5442// but a function pointer doesn't have any children. Likewise if a Record type
5443// claims it has no children, then there really is nothing to show.
5444uint32_t
5445ClangASTContext::GetNumPointeeChildren (clang::QualType type)
5446{
5447 if (type.isNull())
5448 return 0;
5449
5450 clang::QualType qual_type(type.getCanonicalType());
5451 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5452 switch (type_class)
5453 {
5454 case clang::Type::Builtin:
5455 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5456 {
5457 case clang::BuiltinType::UnknownAny:
5458 case clang::BuiltinType::Void:
5459 case clang::BuiltinType::NullPtr:
5460 case clang::BuiltinType::OCLEvent:
5461 case clang::BuiltinType::OCLImage1d:
5462 case clang::BuiltinType::OCLImage1dArray:
5463 case clang::BuiltinType::OCLImage1dBuffer:
5464 case clang::BuiltinType::OCLImage2d:
5465 case clang::BuiltinType::OCLImage2dArray:
5466 case clang::BuiltinType::OCLImage3d:
5467 case clang::BuiltinType::OCLSampler:
5468 return 0;
5469 case clang::BuiltinType::Bool:
5470 case clang::BuiltinType::Char_U:
5471 case clang::BuiltinType::UChar:
5472 case clang::BuiltinType::WChar_U:
5473 case clang::BuiltinType::Char16:
5474 case clang::BuiltinType::Char32:
5475 case clang::BuiltinType::UShort:
5476 case clang::BuiltinType::UInt:
5477 case clang::BuiltinType::ULong:
5478 case clang::BuiltinType::ULongLong:
5479 case clang::BuiltinType::UInt128:
5480 case clang::BuiltinType::Char_S:
5481 case clang::BuiltinType::SChar:
5482 case clang::BuiltinType::WChar_S:
5483 case clang::BuiltinType::Short:
5484 case clang::BuiltinType::Int:
5485 case clang::BuiltinType::Long:
5486 case clang::BuiltinType::LongLong:
5487 case clang::BuiltinType::Int128:
5488 case clang::BuiltinType::Float:
5489 case clang::BuiltinType::Double:
5490 case clang::BuiltinType::LongDouble:
5491 case clang::BuiltinType::Dependent:
5492 case clang::BuiltinType::Overload:
5493 case clang::BuiltinType::ObjCId:
5494 case clang::BuiltinType::ObjCClass:
5495 case clang::BuiltinType::ObjCSel:
5496 case clang::BuiltinType::BoundMember:
5497 case clang::BuiltinType::Half:
5498 case clang::BuiltinType::ARCUnbridgedCast:
5499 case clang::BuiltinType::PseudoObject:
5500 case clang::BuiltinType::BuiltinFn:
5501 return 1;
5502 }
5503 break;
5504
5505 case clang::Type::Complex: return 1;
5506 case clang::Type::Pointer: return 1;
5507 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
5508 case clang::Type::LValueReference: return 1;
5509 case clang::Type::RValueReference: return 1;
5510 case clang::Type::MemberPointer: return 0;
5511 case clang::Type::ConstantArray: return 0;
5512 case clang::Type::IncompleteArray: return 0;
5513 case clang::Type::VariableArray: return 0;
5514 case clang::Type::DependentSizedArray: return 0;
5515 case clang::Type::DependentSizedExtVector: return 0;
5516 case clang::Type::Vector: return 0;
5517 case clang::Type::ExtVector: return 0;
5518 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
5519 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
5520 case clang::Type::UnresolvedUsing: return 0;
5521 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
5522 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
5523 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
5524 case clang::Type::TypeOfExpr: return 0;
5525 case clang::Type::TypeOf: return 0;
5526 case clang::Type::Decltype: return 0;
5527 case clang::Type::Record: return 0;
5528 case clang::Type::Enum: return 1;
5529 case clang::Type::TemplateTypeParm: return 1;
5530 case clang::Type::SubstTemplateTypeParm: return 1;
5531 case clang::Type::TemplateSpecialization: return 1;
5532 case clang::Type::InjectedClassName: return 0;
5533 case clang::Type::DependentName: return 1;
5534 case clang::Type::DependentTemplateSpecialization: return 1;
5535 case clang::Type::ObjCObject: return 0;
5536 case clang::Type::ObjCInterface: return 0;
5537 case clang::Type::ObjCObjectPointer: return 1;
5538 default:
5539 break;
5540 }
5541 return 0;
5542}
5543
5544
Greg Claytona1e5dc82015-08-11 22:53:00 +00005545CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00005546ClangASTContext::GetChildClangTypeAtIndex (void* type, ExecutionContext *exe_ctx,
5547 size_t idx,
5548 bool transparent_pointers,
5549 bool omit_empty_base_classes,
5550 bool ignore_array_bounds,
5551 std::string& child_name,
5552 uint32_t &child_byte_size,
5553 int32_t &child_byte_offset,
5554 uint32_t &child_bitfield_bit_size,
5555 uint32_t &child_bitfield_bit_offset,
5556 bool &child_is_base_class,
5557 bool &child_is_deref_of_parent,
5558 ValueObject *valobj)
5559{
5560 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005561 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005562
5563 clang::QualType parent_qual_type(GetCanonicalQualType(type));
5564 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
5565 child_bitfield_bit_size = 0;
5566 child_bitfield_bit_offset = 0;
5567 child_is_base_class = false;
5568
5569 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
5570 uint32_t bit_offset;
5571 switch (parent_type_class)
5572 {
5573 case clang::Type::Builtin:
5574 if (idx_is_valid)
5575 {
5576 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
5577 {
5578 case clang::BuiltinType::ObjCId:
5579 case clang::BuiltinType::ObjCClass:
5580 child_name = "isa";
5581 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005582 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00005583
5584 default:
5585 break;
5586 }
5587 }
5588 break;
5589
5590 case clang::Type::Record:
5591 if (idx_is_valid && GetCompleteType(type))
5592 {
5593 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
5594 const clang::RecordDecl *record_decl = record_type->getDecl();
5595 assert(record_decl);
5596 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5597 uint32_t child_idx = 0;
5598
5599 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5600 if (cxx_record_decl)
5601 {
5602 // We might have base classes to print out first
5603 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5604 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5605 base_class != base_class_end;
5606 ++base_class)
5607 {
5608 const clang::CXXRecordDecl *base_class_decl = nullptr;
5609
5610 // Skip empty base classes
5611 if (omit_empty_base_classes)
5612 {
5613 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5614 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5615 continue;
5616 }
5617
5618 if (idx == child_idx)
5619 {
5620 if (base_class_decl == nullptr)
5621 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5622
5623
5624 if (base_class->isVirtual())
5625 {
5626 bool handled = false;
5627 if (valobj)
5628 {
5629 Error err;
5630 AddressType addr_type = eAddressTypeInvalid;
5631 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
5632
5633 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
5634 {
5635
5636 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
5637 Process *process = exe_ctx.GetProcessPtr();
5638 if (process)
5639 {
5640 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
5641 if (vtable_ctx)
5642 {
5643 if (vtable_ctx->isMicrosoft())
5644 {
5645 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
5646
5647 if (vtable_ptr_addr)
5648 {
5649 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
5650
5651 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
5652 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
5653 {
5654 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
5655 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
5656 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
5657 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5658 if (base_offset != UINT32_MAX)
5659 {
5660 handled = true;
5661 bit_offset = base_offset * 8;
5662 }
5663 }
5664 }
5665 }
5666 else
5667 {
5668 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
5669 if (vtable_ptr_addr)
5670 {
5671 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
5672 if (vtable_ptr != LLDB_INVALID_ADDRESS)
5673 {
5674 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
5675 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
5676 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5677 if (base_offset != UINT32_MAX)
5678 {
5679 handled = true;
5680 bit_offset = base_offset * 8;
5681 }
5682 }
5683 }
5684 }
5685 }
5686 }
5687 }
5688
5689 }
5690 if (!handled)
5691 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5692 }
5693 else
5694 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5695
5696 // Base classes should be a multiple of 8 bits in size
5697 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005698 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005699 child_name = base_class_clang_type.GetTypeName().AsCString("");
5700 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5701
5702 // Base classes bit sizes should be a multiple of 8 bits in size
5703 assert (base_class_clang_type_bit_size % 8 == 0);
5704 child_byte_size = base_class_clang_type_bit_size / 8;
5705 child_is_base_class = true;
5706 return base_class_clang_type;
5707 }
5708 // We don't increment the child index in the for loop since we might
5709 // be skipping empty base classes
5710 ++child_idx;
5711 }
5712 }
5713 // Make sure index is in range...
5714 uint32_t field_idx = 0;
5715 clang::RecordDecl::field_iterator field, field_end;
5716 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
5717 {
5718 if (idx == child_idx)
5719 {
5720 // Print the member type if requested
5721 // Print the member name and equal sign
5722 child_name.assign(field->getNameAsString().c_str());
5723
5724 // Figure out the type byte size (field_type_info.first) and
5725 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00005726 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005727 assert(field_idx < record_layout.getFieldCount());
5728 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5729
5730 // Figure out the field offset within the current struct/union/class type
5731 bit_offset = record_layout.getFieldOffset (field_idx);
5732 child_byte_offset = bit_offset / 8;
5733 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
5734 child_bitfield_bit_offset = bit_offset % 8;
5735
5736 return field_clang_type;
5737 }
5738 }
5739 }
5740 break;
5741
5742 case clang::Type::ObjCObject:
5743 case clang::Type::ObjCInterface:
5744 if (idx_is_valid && GetCompleteType(type))
5745 {
5746 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
5747 assert (objc_class_type);
5748 if (objc_class_type)
5749 {
5750 uint32_t child_idx = 0;
5751 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5752
5753 if (class_interface_decl)
5754 {
5755
5756 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
5757 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5758 if (superclass_interface_decl)
5759 {
5760 if (omit_empty_base_classes)
5761 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005762 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00005763 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
5764 {
5765 if (idx == 0)
5766 {
5767 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5768
5769
5770 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
5771
5772 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5773
5774 child_byte_size = ivar_type_info.Width / 8;
5775 child_byte_offset = 0;
5776 child_is_base_class = true;
5777
Greg Claytona1e5dc82015-08-11 22:53:00 +00005778 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005779 }
5780
5781 ++child_idx;
5782 }
5783 }
5784 else
5785 ++child_idx;
5786 }
5787
5788 const uint32_t superclass_idx = child_idx;
5789
5790 if (idx < (child_idx + class_interface_decl->ivar_size()))
5791 {
5792 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5793
5794 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
5795 {
5796 if (child_idx == idx)
5797 {
5798 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5799
5800 clang::QualType ivar_qual_type(ivar_decl->getType());
5801
5802 child_name.assign(ivar_decl->getNameAsString().c_str());
5803
5804 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5805
5806 child_byte_size = ivar_type_info.Width / 8;
5807
5808 // Figure out the field offset within the current struct/union/class type
5809 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
5810 // that doesn't account for the space taken up by unbacked properties, or from
5811 // the changing size of base classes that are newer than this class.
5812 // So if we have a process around that we can ask about this object, do so.
5813 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
5814 Process *process = nullptr;
5815 if (exe_ctx)
5816 process = exe_ctx->GetProcessPtr();
5817 if (process)
5818 {
5819 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
5820 if (objc_runtime != nullptr)
5821 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005822 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005823 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
5824 }
5825 }
5826
5827 // Setting this to UINT32_MAX to make sure we don't compute it twice...
5828 bit_offset = UINT32_MAX;
5829
5830 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
5831 {
5832 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5833 child_byte_offset = bit_offset / 8;
5834 }
5835
5836 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
5837 // of a bitfield within its containing object. So regardless of where we get the byte
5838 // offset from, we still need to get the bit offset for bitfields from the layout.
5839
5840 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
5841 {
5842 if (bit_offset == UINT32_MAX)
5843 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5844
5845 child_bitfield_bit_offset = bit_offset % 8;
5846 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005847 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005848 }
5849 ++child_idx;
5850 }
5851 }
5852 }
5853 }
5854 }
5855 break;
5856
5857 case clang::Type::ObjCObjectPointer:
5858 if (idx_is_valid)
5859 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005860 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00005861
5862 if (transparent_pointers && pointee_clang_type.IsAggregateType())
5863 {
5864 child_is_deref_of_parent = false;
5865 bool tmp_child_is_deref_of_parent = false;
5866 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5867 idx,
5868 transparent_pointers,
5869 omit_empty_base_classes,
5870 ignore_array_bounds,
5871 child_name,
5872 child_byte_size,
5873 child_byte_offset,
5874 child_bitfield_bit_size,
5875 child_bitfield_bit_offset,
5876 child_is_base_class,
5877 tmp_child_is_deref_of_parent,
5878 valobj);
5879 }
5880 else
5881 {
5882 child_is_deref_of_parent = true;
5883 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5884 if (parent_name)
5885 {
5886 child_name.assign(1, '*');
5887 child_name += parent_name;
5888 }
5889
5890 // We have a pointer to an simple type
5891 if (idx == 0 && pointee_clang_type.GetCompleteType())
5892 {
5893 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5894 child_byte_offset = 0;
5895 return pointee_clang_type;
5896 }
5897 }
5898 }
5899 break;
5900
5901 case clang::Type::Vector:
5902 case clang::Type::ExtVector:
5903 if (idx_is_valid)
5904 {
5905 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
5906 if (array)
5907 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005908 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005909 if (element_type.GetCompleteType())
5910 {
5911 char element_name[64];
5912 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
5913 child_name.assign(element_name);
5914 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5915 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
5916 return element_type;
5917 }
5918 }
5919 }
5920 break;
5921
5922 case clang::Type::ConstantArray:
5923 case clang::Type::IncompleteArray:
5924 if (ignore_array_bounds || idx_is_valid)
5925 {
5926 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
5927 if (array)
5928 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005929 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005930 if (element_type.GetCompleteType())
5931 {
5932 char element_name[64];
5933 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
5934 child_name.assign(element_name);
5935 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5936 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
5937 return element_type;
5938 }
5939 }
5940 }
5941 break;
5942
5943
5944 case clang::Type::Pointer:
5945 if (idx_is_valid)
5946 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005947 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00005948
5949 // Don't dereference "void *" pointers
5950 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00005951 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005952
5953 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
5954 {
5955 child_is_deref_of_parent = false;
5956 bool tmp_child_is_deref_of_parent = false;
5957 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5958 idx,
5959 transparent_pointers,
5960 omit_empty_base_classes,
5961 ignore_array_bounds,
5962 child_name,
5963 child_byte_size,
5964 child_byte_offset,
5965 child_bitfield_bit_size,
5966 child_bitfield_bit_offset,
5967 child_is_base_class,
5968 tmp_child_is_deref_of_parent,
5969 valobj);
5970 }
5971 else
5972 {
5973 child_is_deref_of_parent = true;
5974
5975 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5976 if (parent_name)
5977 {
5978 child_name.assign(1, '*');
5979 child_name += parent_name;
5980 }
5981
5982 // We have a pointer to an simple type
5983 if (idx == 0)
5984 {
5985 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5986 child_byte_offset = 0;
5987 return pointee_clang_type;
5988 }
5989 }
5990 }
5991 break;
5992
5993 case clang::Type::LValueReference:
5994 case clang::Type::RValueReference:
5995 if (idx_is_valid)
5996 {
5997 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00005998 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005999 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6000 {
6001 child_is_deref_of_parent = false;
6002 bool tmp_child_is_deref_of_parent = false;
6003 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
6004 idx,
6005 transparent_pointers,
6006 omit_empty_base_classes,
6007 ignore_array_bounds,
6008 child_name,
6009 child_byte_size,
6010 child_byte_offset,
6011 child_bitfield_bit_size,
6012 child_bitfield_bit_offset,
6013 child_is_base_class,
6014 tmp_child_is_deref_of_parent,
6015 valobj);
6016 }
6017 else
6018 {
6019 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6020 if (parent_name)
6021 {
6022 child_name.assign(1, '&');
6023 child_name += parent_name;
6024 }
6025
6026 // We have a pointer to an simple type
6027 if (idx == 0)
6028 {
6029 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6030 child_byte_offset = 0;
6031 return pointee_clang_type;
6032 }
6033 }
6034 }
6035 break;
6036
6037 case clang::Type::Typedef:
6038 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006039 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006040 return typedefed_clang_type.GetChildClangTypeAtIndex (exe_ctx,
6041 idx,
6042 transparent_pointers,
6043 omit_empty_base_classes,
6044 ignore_array_bounds,
6045 child_name,
6046 child_byte_size,
6047 child_byte_offset,
6048 child_bitfield_bit_size,
6049 child_bitfield_bit_offset,
6050 child_is_base_class,
6051 child_is_deref_of_parent,
6052 valobj);
6053 }
6054 break;
6055
6056 case clang::Type::Elaborated:
6057 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006058 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006059 return elaborated_clang_type.GetChildClangTypeAtIndex (exe_ctx,
6060 idx,
6061 transparent_pointers,
6062 omit_empty_base_classes,
6063 ignore_array_bounds,
6064 child_name,
6065 child_byte_size,
6066 child_byte_offset,
6067 child_bitfield_bit_size,
6068 child_bitfield_bit_offset,
6069 child_is_base_class,
6070 child_is_deref_of_parent,
6071 valobj);
6072 }
6073
6074 case clang::Type::Paren:
6075 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006076 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00006077 return paren_clang_type.GetChildClangTypeAtIndex (exe_ctx,
6078 idx,
6079 transparent_pointers,
6080 omit_empty_base_classes,
6081 ignore_array_bounds,
6082 child_name,
6083 child_byte_size,
6084 child_byte_offset,
6085 child_bitfield_bit_size,
6086 child_bitfield_bit_offset,
6087 child_is_base_class,
6088 child_is_deref_of_parent,
6089 valobj);
6090 }
6091
6092
6093 default:
6094 break;
6095 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006096 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006097}
6098
6099static uint32_t
6100GetIndexForRecordBase
6101(
6102 const clang::RecordDecl *record_decl,
6103 const clang::CXXBaseSpecifier *base_spec,
6104 bool omit_empty_base_classes
6105 )
6106{
6107 uint32_t child_idx = 0;
6108
6109 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6110
6111 // const char *super_name = record_decl->getNameAsCString();
6112 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6113 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6114 //
6115 if (cxx_record_decl)
6116 {
6117 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6118 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6119 base_class != base_class_end;
6120 ++base_class)
6121 {
6122 if (omit_empty_base_classes)
6123 {
6124 if (BaseSpecifierIsEmpty (base_class))
6125 continue;
6126 }
6127
6128 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6129 // child_idx,
6130 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6131 //
6132 //
6133 if (base_class == base_spec)
6134 return child_idx;
6135 ++child_idx;
6136 }
6137 }
6138
6139 return UINT32_MAX;
6140}
6141
6142
6143static uint32_t
6144GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6145 clang::NamedDecl *canonical_decl,
6146 bool omit_empty_base_classes)
6147{
6148 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6149 omit_empty_base_classes);
6150
6151 clang::RecordDecl::field_iterator field, field_end;
6152 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6153 field != field_end;
6154 ++field, ++child_idx)
6155 {
6156 if (field->getCanonicalDecl() == canonical_decl)
6157 return child_idx;
6158 }
6159
6160 return UINT32_MAX;
6161}
6162
6163// Look for a child member (doesn't include base classes, but it does include
6164// their members) in the type hierarchy. Returns an index path into "clang_type"
6165// on how to reach the appropriate member.
6166//
6167// class A
6168// {
6169// public:
6170// int m_a;
6171// int m_b;
6172// };
6173//
6174// class B
6175// {
6176// };
6177//
6178// class C :
6179// public B,
6180// public A
6181// {
6182// };
6183//
6184// If we have a clang type that describes "class C", and we wanted to looked
6185// "m_b" in it:
6186//
6187// With omit_empty_base_classes == false we would get an integer array back with:
6188// { 1, 1 }
6189// The first index 1 is the child index for "class A" within class C
6190// The second index 1 is the child index for "m_b" within class A
6191//
6192// With omit_empty_base_classes == true we would get an integer array back with:
6193// { 0, 1 }
6194// 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)
6195// The second index 1 is the child index for "m_b" within class A
6196
6197size_t
6198ClangASTContext::GetIndexOfChildMemberWithName (void* type, const char *name,
6199 bool omit_empty_base_classes,
6200 std::vector<uint32_t>& child_indexes)
6201{
6202 if (type && name && name[0])
6203 {
6204 clang::QualType qual_type(GetCanonicalQualType(type));
6205 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6206 switch (type_class)
6207 {
6208 case clang::Type::Record:
6209 if (GetCompleteType(type))
6210 {
6211 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6212 const clang::RecordDecl *record_decl = record_type->getDecl();
6213
6214 assert(record_decl);
6215 uint32_t child_idx = 0;
6216
6217 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6218
6219 // Try and find a field that matches NAME
6220 clang::RecordDecl::field_iterator field, field_end;
6221 llvm::StringRef name_sref(name);
6222 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6223 field != field_end;
6224 ++field, ++child_idx)
6225 {
6226 llvm::StringRef field_name = field->getName();
6227 if (field_name.empty())
6228 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006229 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006230 child_indexes.push_back(child_idx);
6231 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
6232 return child_indexes.size();
6233 child_indexes.pop_back();
6234
6235 }
6236 else if (field_name.equals (name_sref))
6237 {
6238 // We have to add on the number of base classes to this index!
6239 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
6240 return child_indexes.size();
6241 }
6242 }
6243
6244 if (cxx_record_decl)
6245 {
6246 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6247
6248 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6249
6250 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6251 // Didn't find things easily, lets let clang do its thang...
6252 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
6253 clang::DeclarationName decl_name(&ident_ref);
6254
6255 clang::CXXBasePaths paths;
6256 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
6257 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
6258 },
6259 paths))
6260 {
6261 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
6262 for (path = paths.begin(); path != path_end; ++path)
6263 {
6264 const size_t num_path_elements = path->size();
6265 for (size_t e=0; e<num_path_elements; ++e)
6266 {
6267 clang::CXXBasePathElement elem = (*path)[e];
6268
6269 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
6270 if (child_idx == UINT32_MAX)
6271 {
6272 child_indexes.clear();
6273 return 0;
6274 }
6275 else
6276 {
6277 child_indexes.push_back (child_idx);
6278 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
6279 }
6280 }
6281 for (clang::NamedDecl *path_decl : path->Decls)
6282 {
6283 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
6284 if (child_idx == UINT32_MAX)
6285 {
6286 child_indexes.clear();
6287 return 0;
6288 }
6289 else
6290 {
6291 child_indexes.push_back (child_idx);
6292 }
6293 }
6294 }
6295 return child_indexes.size();
6296 }
6297 }
6298
6299 }
6300 break;
6301
6302 case clang::Type::ObjCObject:
6303 case clang::Type::ObjCInterface:
6304 if (GetCompleteType(type))
6305 {
6306 llvm::StringRef name_sref(name);
6307 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6308 assert (objc_class_type);
6309 if (objc_class_type)
6310 {
6311 uint32_t child_idx = 0;
6312 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6313
6314 if (class_interface_decl)
6315 {
6316 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6317 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6318
6319 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6320 {
6321 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6322
6323 if (ivar_decl->getName().equals (name_sref))
6324 {
6325 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6326 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6327 ++child_idx;
6328
6329 child_indexes.push_back (child_idx);
6330 return child_indexes.size();
6331 }
6332 }
6333
6334 if (superclass_interface_decl)
6335 {
6336 // The super class index is always zero for ObjC classes,
6337 // so we push it onto the child indexes in case we find
6338 // an ivar in our superclass...
6339 child_indexes.push_back (0);
6340
Greg Claytona1e5dc82015-08-11 22:53:00 +00006341 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006342 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
6343 omit_empty_base_classes,
6344 child_indexes))
6345 {
6346 // We did find an ivar in a superclass so just
6347 // return the results!
6348 return child_indexes.size();
6349 }
6350
6351 // We didn't find an ivar matching "name" in our
6352 // superclass, pop the superclass zero index that
6353 // we pushed on above.
6354 child_indexes.pop_back();
6355 }
6356 }
6357 }
6358 }
6359 break;
6360
6361 case clang::Type::ObjCObjectPointer:
6362 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006363 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006364 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
6365 omit_empty_base_classes,
6366 child_indexes);
6367 }
6368 break;
6369
6370
6371 case clang::Type::ConstantArray:
6372 {
6373 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6374 // const uint64_t element_count = array->getSize().getLimitedValue();
6375 //
6376 // if (idx < element_count)
6377 // {
6378 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6379 //
6380 // char element_name[32];
6381 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6382 //
6383 // child_name.assign(element_name);
6384 // assert(field_type_info.first % 8 == 0);
6385 // child_byte_size = field_type_info.first / 8;
6386 // child_byte_offset = idx * child_byte_size;
6387 // return array->getElementType().getAsOpaquePtr();
6388 // }
6389 }
6390 break;
6391
6392 // case clang::Type::MemberPointerType:
6393 // {
6394 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6395 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6396 //
6397 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6398 // {
6399 // return GetIndexOfChildWithName (ast,
6400 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6401 // name);
6402 // }
6403 // }
6404 // break;
6405 //
6406 case clang::Type::LValueReference:
6407 case clang::Type::RValueReference:
6408 {
6409 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6410 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006411 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006412
6413 if (pointee_clang_type.IsAggregateType ())
6414 {
6415 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6416 omit_empty_base_classes,
6417 child_indexes);
6418 }
6419 }
6420 break;
6421
6422 case clang::Type::Pointer:
6423 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006424 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006425
6426 if (pointee_clang_type.IsAggregateType ())
6427 {
6428 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6429 omit_empty_base_classes,
6430 child_indexes);
6431 }
6432 }
6433 break;
6434
6435 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006436 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006437 omit_empty_base_classes,
6438 child_indexes);
6439
6440 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006441 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006442 omit_empty_base_classes,
6443 child_indexes);
6444
6445 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006446 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006447 omit_empty_base_classes,
6448 child_indexes);
6449
6450 default:
6451 break;
6452 }
6453 }
6454 return 0;
6455}
6456
6457
6458// Get the index of the child of "clang_type" whose name matches. This function
6459// doesn't descend into the children, but only looks one level deep and name
6460// matches can include base class names.
6461
6462uint32_t
6463ClangASTContext::GetIndexOfChildWithName (void* type, const char *name, bool omit_empty_base_classes)
6464{
6465 if (type && name && name[0])
6466 {
6467 clang::QualType qual_type(GetCanonicalQualType(type));
6468
6469 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6470
6471 switch (type_class)
6472 {
6473 case clang::Type::Record:
6474 if (GetCompleteType(type))
6475 {
6476 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6477 const clang::RecordDecl *record_decl = record_type->getDecl();
6478
6479 assert(record_decl);
6480 uint32_t child_idx = 0;
6481
6482 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6483
6484 if (cxx_record_decl)
6485 {
6486 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6487 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6488 base_class != base_class_end;
6489 ++base_class)
6490 {
6491 // Skip empty base classes
6492 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6493 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
6494 continue;
6495
Greg Claytona1e5dc82015-08-11 22:53:00 +00006496 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006497 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
6498 if (base_class_type_name.compare (name) == 0)
6499 return child_idx;
6500 ++child_idx;
6501 }
6502 }
6503
6504 // Try and find a field that matches NAME
6505 clang::RecordDecl::field_iterator field, field_end;
6506 llvm::StringRef name_sref(name);
6507 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6508 field != field_end;
6509 ++field, ++child_idx)
6510 {
6511 if (field->getName().equals (name_sref))
6512 return child_idx;
6513 }
6514
6515 }
6516 break;
6517
6518 case clang::Type::ObjCObject:
6519 case clang::Type::ObjCInterface:
6520 if (GetCompleteType(type))
6521 {
6522 llvm::StringRef name_sref(name);
6523 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6524 assert (objc_class_type);
6525 if (objc_class_type)
6526 {
6527 uint32_t child_idx = 0;
6528 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6529
6530 if (class_interface_decl)
6531 {
6532 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6533 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6534
6535 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6536 {
6537 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6538
6539 if (ivar_decl->getName().equals (name_sref))
6540 {
6541 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6542 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6543 ++child_idx;
6544
6545 return child_idx;
6546 }
6547 }
6548
6549 if (superclass_interface_decl)
6550 {
6551 if (superclass_interface_decl->getName().equals (name_sref))
6552 return 0;
6553 }
6554 }
6555 }
6556 }
6557 break;
6558
6559 case clang::Type::ObjCObjectPointer:
6560 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006561 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006562 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6563 }
6564 break;
6565
6566 case clang::Type::ConstantArray:
6567 {
6568 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6569 // const uint64_t element_count = array->getSize().getLimitedValue();
6570 //
6571 // if (idx < element_count)
6572 // {
6573 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6574 //
6575 // char element_name[32];
6576 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6577 //
6578 // child_name.assign(element_name);
6579 // assert(field_type_info.first % 8 == 0);
6580 // child_byte_size = field_type_info.first / 8;
6581 // child_byte_offset = idx * child_byte_size;
6582 // return array->getElementType().getAsOpaquePtr();
6583 // }
6584 }
6585 break;
6586
6587 // case clang::Type::MemberPointerType:
6588 // {
6589 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6590 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6591 //
6592 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6593 // {
6594 // return GetIndexOfChildWithName (ast,
6595 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6596 // name);
6597 // }
6598 // }
6599 // break;
6600 //
6601 case clang::Type::LValueReference:
6602 case clang::Type::RValueReference:
6603 {
6604 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006605 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006606
6607 if (pointee_type.IsAggregateType ())
6608 {
6609 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6610 }
6611 }
6612 break;
6613
6614 case clang::Type::Pointer:
6615 {
6616 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006617 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006618
6619 if (pointee_type.IsAggregateType ())
6620 {
6621 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6622 }
6623 else
6624 {
6625 // if (parent_name)
6626 // {
6627 // child_name.assign(1, '*');
6628 // child_name += parent_name;
6629 // }
6630 //
6631 // // We have a pointer to an simple type
6632 // if (idx == 0)
6633 // {
6634 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
6635 // assert(clang_type_info.first % 8 == 0);
6636 // child_byte_size = clang_type_info.first / 8;
6637 // child_byte_offset = 0;
6638 // return pointee_type.getAsOpaquePtr();
6639 // }
6640 }
6641 }
6642 break;
6643
6644 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006645 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006646
6647 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006648 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006649
6650 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006651 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006652
6653 default:
6654 break;
6655 }
6656 }
6657 return UINT32_MAX;
6658}
6659
6660
6661size_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00006662ClangASTContext::GetNumTemplateArguments (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006663{
6664 if (!type)
6665 return 0;
6666 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
6667 if (ast)
6668 {
6669 clang::QualType qual_type (GetCanonicalQualType(type));
6670
6671 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6672 switch (type_class)
6673 {
6674 case clang::Type::Record:
6675 if (ast->GetCompleteType(type.GetOpaqueQualType()))
6676 {
6677 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6678 if (cxx_record_decl)
6679 {
6680 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6681 if (template_decl)
6682 return template_decl->getTemplateArgs().size();
6683 }
6684 }
6685 break;
6686
6687 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006688 return GetNumTemplateArguments(CompilerType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()));
Greg Claytond8d4a572015-08-11 21:38:15 +00006689
6690 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006691 return GetNumTemplateArguments(CompilerType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
Greg Claytond8d4a572015-08-11 21:38:15 +00006692
6693 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006694 return GetNumTemplateArguments(CompilerType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
Greg Claytond8d4a572015-08-11 21:38:15 +00006695
6696 default:
6697 break;
6698 }
6699 }
6700 return 0;
6701}
6702
Greg Claytona1e5dc82015-08-11 22:53:00 +00006703CompilerType
6704ClangASTContext::GetTemplateArgument (const CompilerType& type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00006705{
6706 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00006707 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006708 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
6709 if (ast)
6710 {
6711 clang::QualType qual_type (GetCanonicalQualType(type));
6712
6713 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6714 switch (type_class)
6715 {
6716 case clang::Type::Record:
6717 if (ast->GetCompleteType(type.GetOpaqueQualType()))
6718 {
6719 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6720 if (cxx_record_decl)
6721 {
6722 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6723 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
6724 {
6725 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
6726 switch (template_arg.getKind())
6727 {
6728 case clang::TemplateArgument::Null:
6729 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006730 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006731
6732 case clang::TemplateArgument::Type:
6733 kind = eTemplateArgumentKindType;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006734 return CompilerType(ast, template_arg.getAsType().getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00006735
6736 case clang::TemplateArgument::Declaration:
6737 kind = eTemplateArgumentKindDeclaration;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006738 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006739
6740 case clang::TemplateArgument::Integral:
6741 kind = eTemplateArgumentKindIntegral;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006742 return CompilerType(ast, template_arg.getIntegralType().getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00006743
6744 case clang::TemplateArgument::Template:
6745 kind = eTemplateArgumentKindTemplate;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006746 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006747
6748 case clang::TemplateArgument::TemplateExpansion:
6749 kind = eTemplateArgumentKindTemplateExpansion;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006750 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006751
6752 case clang::TemplateArgument::Expression:
6753 kind = eTemplateArgumentKindExpression;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006754 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006755
6756 case clang::TemplateArgument::Pack:
6757 kind = eTemplateArgumentKindPack;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006758 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006759
6760 default:
6761 assert (!"Unhandled clang::TemplateArgument::ArgKind");
6762 break;
6763 }
6764 }
6765 }
6766 }
6767 break;
6768
6769 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006770 return GetTemplateArgument(CompilerType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), arg_idx, kind);
Greg Claytond8d4a572015-08-11 21:38:15 +00006771
6772 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006773 return GetTemplateArgument(CompilerType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), arg_idx, kind);
Greg Claytond8d4a572015-08-11 21:38:15 +00006774
6775 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006776 return GetTemplateArgument(CompilerType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), arg_idx, kind);
Greg Claytond8d4a572015-08-11 21:38:15 +00006777
6778 default:
6779 break;
6780 }
6781 }
6782 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006783 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00006784}
6785
6786static bool
6787IsOperator (const char *name, clang::OverloadedOperatorKind &op_kind)
6788{
6789 if (name == nullptr || name[0] == '\0')
6790 return false;
6791
6792#define OPERATOR_PREFIX "operator"
6793#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
6794
6795 const char *post_op_name = nullptr;
6796
6797 bool no_space = true;
6798
6799 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
6800 return false;
6801
6802 post_op_name = name + OPERATOR_PREFIX_LENGTH;
6803
6804 if (post_op_name[0] == ' ')
6805 {
6806 post_op_name++;
6807 no_space = false;
6808 }
6809
6810#undef OPERATOR_PREFIX
6811#undef OPERATOR_PREFIX_LENGTH
6812
6813 // This is an operator, set the overloaded operator kind to invalid
6814 // in case this is a conversion operator...
6815 op_kind = clang::NUM_OVERLOADED_OPERATORS;
6816
6817 switch (post_op_name[0])
6818 {
6819 default:
6820 if (no_space)
6821 return false;
6822 break;
6823 case 'n':
6824 if (no_space)
6825 return false;
6826 if (strcmp (post_op_name, "new") == 0)
6827 op_kind = clang::OO_New;
6828 else if (strcmp (post_op_name, "new[]") == 0)
6829 op_kind = clang::OO_Array_New;
6830 break;
6831
6832 case 'd':
6833 if (no_space)
6834 return false;
6835 if (strcmp (post_op_name, "delete") == 0)
6836 op_kind = clang::OO_Delete;
6837 else if (strcmp (post_op_name, "delete[]") == 0)
6838 op_kind = clang::OO_Array_Delete;
6839 break;
6840
6841 case '+':
6842 if (post_op_name[1] == '\0')
6843 op_kind = clang::OO_Plus;
6844 else if (post_op_name[2] == '\0')
6845 {
6846 if (post_op_name[1] == '=')
6847 op_kind = clang::OO_PlusEqual;
6848 else if (post_op_name[1] == '+')
6849 op_kind = clang::OO_PlusPlus;
6850 }
6851 break;
6852
6853 case '-':
6854 if (post_op_name[1] == '\0')
6855 op_kind = clang::OO_Minus;
6856 else if (post_op_name[2] == '\0')
6857 {
6858 switch (post_op_name[1])
6859 {
6860 case '=': op_kind = clang::OO_MinusEqual; break;
6861 case '-': op_kind = clang::OO_MinusMinus; break;
6862 case '>': op_kind = clang::OO_Arrow; break;
6863 }
6864 }
6865 else if (post_op_name[3] == '\0')
6866 {
6867 if (post_op_name[2] == '*')
6868 op_kind = clang::OO_ArrowStar; break;
6869 }
6870 break;
6871
6872 case '*':
6873 if (post_op_name[1] == '\0')
6874 op_kind = clang::OO_Star;
6875 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6876 op_kind = clang::OO_StarEqual;
6877 break;
6878
6879 case '/':
6880 if (post_op_name[1] == '\0')
6881 op_kind = clang::OO_Slash;
6882 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6883 op_kind = clang::OO_SlashEqual;
6884 break;
6885
6886 case '%':
6887 if (post_op_name[1] == '\0')
6888 op_kind = clang::OO_Percent;
6889 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6890 op_kind = clang::OO_PercentEqual;
6891 break;
6892
6893
6894 case '^':
6895 if (post_op_name[1] == '\0')
6896 op_kind = clang::OO_Caret;
6897 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6898 op_kind = clang::OO_CaretEqual;
6899 break;
6900
6901 case '&':
6902 if (post_op_name[1] == '\0')
6903 op_kind = clang::OO_Amp;
6904 else if (post_op_name[2] == '\0')
6905 {
6906 switch (post_op_name[1])
6907 {
6908 case '=': op_kind = clang::OO_AmpEqual; break;
6909 case '&': op_kind = clang::OO_AmpAmp; break;
6910 }
6911 }
6912 break;
6913
6914 case '|':
6915 if (post_op_name[1] == '\0')
6916 op_kind = clang::OO_Pipe;
6917 else if (post_op_name[2] == '\0')
6918 {
6919 switch (post_op_name[1])
6920 {
6921 case '=': op_kind = clang::OO_PipeEqual; break;
6922 case '|': op_kind = clang::OO_PipePipe; break;
6923 }
6924 }
6925 break;
6926
6927 case '~':
6928 if (post_op_name[1] == '\0')
6929 op_kind = clang::OO_Tilde;
6930 break;
6931
6932 case '!':
6933 if (post_op_name[1] == '\0')
6934 op_kind = clang::OO_Exclaim;
6935 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6936 op_kind = clang::OO_ExclaimEqual;
6937 break;
6938
6939 case '=':
6940 if (post_op_name[1] == '\0')
6941 op_kind = clang::OO_Equal;
6942 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6943 op_kind = clang::OO_EqualEqual;
6944 break;
6945
6946 case '<':
6947 if (post_op_name[1] == '\0')
6948 op_kind = clang::OO_Less;
6949 else if (post_op_name[2] == '\0')
6950 {
6951 switch (post_op_name[1])
6952 {
6953 case '<': op_kind = clang::OO_LessLess; break;
6954 case '=': op_kind = clang::OO_LessEqual; break;
6955 }
6956 }
6957 else if (post_op_name[3] == '\0')
6958 {
6959 if (post_op_name[2] == '=')
6960 op_kind = clang::OO_LessLessEqual;
6961 }
6962 break;
6963
6964 case '>':
6965 if (post_op_name[1] == '\0')
6966 op_kind = clang::OO_Greater;
6967 else if (post_op_name[2] == '\0')
6968 {
6969 switch (post_op_name[1])
6970 {
6971 case '>': op_kind = clang::OO_GreaterGreater; break;
6972 case '=': op_kind = clang::OO_GreaterEqual; break;
6973 }
6974 }
6975 else if (post_op_name[1] == '>' &&
6976 post_op_name[2] == '=' &&
6977 post_op_name[3] == '\0')
6978 {
6979 op_kind = clang::OO_GreaterGreaterEqual;
6980 }
6981 break;
6982
6983 case ',':
6984 if (post_op_name[1] == '\0')
6985 op_kind = clang::OO_Comma;
6986 break;
6987
6988 case '(':
6989 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
6990 op_kind = clang::OO_Call;
6991 break;
6992
6993 case '[':
6994 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
6995 op_kind = clang::OO_Subscript;
6996 break;
6997 }
6998
6999 return true;
7000}
7001
7002clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007003ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007004{
7005 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
7006 if (enutype)
7007 return enutype->getDecl();
7008 return NULL;
7009}
7010
7011clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007012ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007013{
7014 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(GetCanonicalQualType(type));
7015 if (record_type)
7016 return record_type->getDecl();
7017 return nullptr;
7018}
7019
7020clang::CXXRecordDecl *
7021ClangASTContext::GetAsCXXRecordDecl (void* type)
7022{
7023 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
7024}
7025
7026clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007027ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007028{
7029 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(GetCanonicalQualType(type));
7030 if (objc_class_type)
7031 return objc_class_type->getInterface();
7032 return nullptr;
7033}
7034
7035clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007036ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
7037 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007038 AccessType access,
7039 uint32_t bitfield_bit_size)
7040{
7041 if (!type.IsValid() || !field_clang_type.IsValid())
7042 return nullptr;
7043 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
7044 if (!ast)
7045 return nullptr;
7046 clang::ASTContext* clang_ast = ast->getASTContext();
7047
7048 clang::FieldDecl *field = nullptr;
7049
7050 clang::Expr *bit_width = nullptr;
7051 if (bitfield_bit_size != 0)
7052 {
7053 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
7054 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
7055 }
7056
7057 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7058 if (record_decl)
7059 {
7060 field = clang::FieldDecl::Create (*clang_ast,
7061 record_decl,
7062 clang::SourceLocation(),
7063 clang::SourceLocation(),
7064 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7065 GetQualType(field_clang_type), // Field type
7066 nullptr, // TInfo *
7067 bit_width, // BitWidth
7068 false, // Mutable
7069 clang::ICIS_NoInit); // HasInit
7070
7071 if (!name)
7072 {
7073 // Determine whether this field corresponds to an anonymous
7074 // struct or union.
7075 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
7076 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
7077 if (!Rec->getDeclName()) {
7078 Rec->setAnonymousStructOrUnion(true);
7079 field->setImplicit();
7080
7081 }
7082 }
7083 }
7084
7085 if (field)
7086 {
7087 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7088
7089 record_decl->addDecl(field);
7090
7091#ifdef LLDB_CONFIGURATION_DEBUG
7092 VerifyDecl(field);
7093#endif
7094 }
7095 }
7096 else
7097 {
7098 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7099
7100 if (class_interface_decl)
7101 {
7102 const bool is_synthesized = false;
7103
7104 field_clang_type.GetCompleteType();
7105
7106 field = clang::ObjCIvarDecl::Create (*clang_ast,
7107 class_interface_decl,
7108 clang::SourceLocation(),
7109 clang::SourceLocation(),
7110 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7111 GetQualType(field_clang_type), // Field type
7112 nullptr, // TypeSourceInfo *
7113 ConvertAccessTypeToObjCIvarAccessControl (access),
7114 bit_width,
7115 is_synthesized);
7116
7117 if (field)
7118 {
7119 class_interface_decl->addDecl(field);
7120
7121#ifdef LLDB_CONFIGURATION_DEBUG
7122 VerifyDecl(field);
7123#endif
7124 }
7125 }
7126 }
7127 return field;
7128}
7129
7130void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007131ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007132{
7133 ClangASTContext* ast = nullptr;
7134 if (type)
7135 ast = type.GetTypeSystem()->AsClangASTContext();
7136 if (!ast)
7137 return;
7138
7139 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7140
7141 if (!record_decl)
7142 return;
7143
7144 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7145
7146 IndirectFieldVector indirect_fields;
7147 clang::RecordDecl::field_iterator field_pos;
7148 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7149 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7150 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7151 {
7152 if (field_pos->isAnonymousStructOrUnion())
7153 {
7154 clang::QualType field_qual_type = field_pos->getType();
7155
7156 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7157
7158 if (!field_record_type)
7159 continue;
7160
7161 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7162
7163 if (!field_record_decl)
7164 continue;
7165
7166 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7167 di != de;
7168 ++di)
7169 {
7170 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7171 {
7172 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7173 chain[0] = *field_pos;
7174 chain[1] = nested_field_decl;
7175 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7176 record_decl,
7177 clang::SourceLocation(),
7178 nested_field_decl->getIdentifier(),
7179 nested_field_decl->getType(),
7180 chain,
7181 2);
7182
7183 indirect_field->setImplicit();
7184
7185 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7186 nested_field_decl->getAccess()));
7187
7188 indirect_fields.push_back(indirect_field);
7189 }
7190 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7191 {
7192 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
7193 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7194 chain[0] = *field_pos;
7195
7196 int chain_index = 1;
7197 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7198 nce = nested_indirect_field_decl->chain_end();
7199 nci < nce;
7200 ++nci)
7201 {
7202 chain[chain_index] = *nci;
7203 chain_index++;
7204 }
7205
7206 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7207 record_decl,
7208 clang::SourceLocation(),
7209 nested_indirect_field_decl->getIdentifier(),
7210 nested_indirect_field_decl->getType(),
7211 chain,
7212 nested_chain_size + 1);
7213
7214 indirect_field->setImplicit();
7215
7216 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7217 nested_indirect_field_decl->getAccess()));
7218
7219 indirect_fields.push_back(indirect_field);
7220 }
7221 }
7222 }
7223 }
7224
7225 // Check the last field to see if it has an incomplete array type as its
7226 // last member and if it does, the tell the record decl about it
7227 if (last_field_pos != field_end_pos)
7228 {
7229 if (last_field_pos->getType()->isIncompleteArrayType())
7230 record_decl->hasFlexibleArrayMember();
7231 }
7232
7233 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7234 ifi < ife;
7235 ++ifi)
7236 {
7237 record_decl->addDecl(*ifi);
7238 }
7239}
7240
7241void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007242ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007243{
7244 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
7245
7246 if (!record_decl)
7247 return;
7248
7249 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*type.GetTypeSystem()->AsClangASTContext()->getASTContext()));
7250}
7251
7252clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007253ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7254 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007255 AccessType access)
7256{
7257 clang::VarDecl *var_decl = nullptr;
7258
7259 if (!type.IsValid() || !var_type.IsValid())
7260 return nullptr;
7261 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
7262 if (!ast)
7263 return nullptr;
7264
7265 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7266 if (record_decl)
7267 {
7268 var_decl = clang::VarDecl::Create (*ast->getASTContext(), // ASTContext &
7269 record_decl, // DeclContext *
7270 clang::SourceLocation(), // clang::SourceLocation StartLoc
7271 clang::SourceLocation(), // clang::SourceLocation IdLoc
7272 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7273 GetQualType(var_type), // Variable clang::QualType
7274 nullptr, // TypeSourceInfo *
7275 clang::SC_Static); // StorageClass
7276 if (var_decl)
7277 {
7278 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7279 record_decl->addDecl(var_decl);
7280
7281#ifdef LLDB_CONFIGURATION_DEBUG
7282 VerifyDecl(var_decl);
7283#endif
7284 }
7285 }
7286 return var_decl;
7287}
7288
7289
7290clang::CXXMethodDecl *
7291ClangASTContext::AddMethodToCXXRecordType (void* type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007292 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007293 lldb::AccessType access,
7294 bool is_virtual,
7295 bool is_static,
7296 bool is_inline,
7297 bool is_explicit,
7298 bool is_attr_used,
7299 bool is_artificial)
7300{
7301 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7302 return nullptr;
7303
7304 clang::QualType record_qual_type(GetCanonicalQualType(type));
7305
7306 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7307
7308 if (cxx_record_decl == nullptr)
7309 return nullptr;
7310
7311 clang::QualType method_qual_type (GetQualType(method_clang_type));
7312
7313 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7314
7315 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7316
7317 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7318
7319 if (function_type == nullptr)
7320 return nullptr;
7321
7322 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7323
7324 if (!method_function_prototype)
7325 return nullptr;
7326
7327 unsigned int num_params = method_function_prototype->getNumParams();
7328
7329 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7330 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7331
7332 if (is_artificial)
7333 return nullptr; // skip everything artificial
7334
7335 if (name[0] == '~')
7336 {
7337 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7338 cxx_record_decl,
7339 clang::SourceLocation(),
7340 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7341 method_qual_type,
7342 nullptr,
7343 is_inline,
7344 is_artificial);
7345 cxx_method_decl = cxx_dtor_decl;
7346 }
7347 else if (decl_name == cxx_record_decl->getDeclName())
7348 {
7349 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
7350 cxx_record_decl,
7351 clang::SourceLocation(),
7352 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7353 method_qual_type,
7354 nullptr, // TypeSourceInfo *
7355 is_explicit,
7356 is_inline,
7357 is_artificial,
7358 false /*is_constexpr*/);
7359 cxx_method_decl = cxx_ctor_decl;
7360 }
7361 else
7362 {
7363 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7364 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7365
7366 if (IsOperator (name, op_kind))
7367 {
7368 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
7369 {
7370 // Check the number of operator parameters. Sometimes we have
7371 // seen bad DWARF that doesn't correctly describe operators and
7372 // if we try to create a method and add it to the class, clang
7373 // will assert and crash, so we need to make sure things are
7374 // acceptable.
7375 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
7376 return nullptr;
7377 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7378 cxx_record_decl,
7379 clang::SourceLocation(),
7380 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
7381 method_qual_type,
7382 nullptr, // TypeSourceInfo *
7383 SC,
7384 is_inline,
7385 false /*is_constexpr*/,
7386 clang::SourceLocation());
7387 }
7388 else if (num_params == 0)
7389 {
7390 // Conversion operators don't take params...
7391 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
7392 cxx_record_decl,
7393 clang::SourceLocation(),
7394 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
7395 method_qual_type,
7396 nullptr, // TypeSourceInfo *
7397 is_inline,
7398 is_explicit,
7399 false /*is_constexpr*/,
7400 clang::SourceLocation());
7401 }
7402 }
7403
7404 if (cxx_method_decl == nullptr)
7405 {
7406 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7407 cxx_record_decl,
7408 clang::SourceLocation(),
7409 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
7410 method_qual_type,
7411 nullptr, // TypeSourceInfo *
7412 SC,
7413 is_inline,
7414 false /*is_constexpr*/,
7415 clang::SourceLocation());
7416 }
7417 }
7418
7419 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
7420
7421 cxx_method_decl->setAccess (access_specifier);
7422 cxx_method_decl->setVirtualAsWritten (is_virtual);
7423
7424 if (is_attr_used)
7425 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
7426
7427 // Populate the method decl with parameter decls
7428
7429 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7430
7431 for (unsigned param_index = 0;
7432 param_index < num_params;
7433 ++param_index)
7434 {
7435 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
7436 cxx_method_decl,
7437 clang::SourceLocation(),
7438 clang::SourceLocation(),
7439 nullptr, // anonymous
7440 method_function_prototype->getParamType(param_index),
7441 nullptr,
7442 clang::SC_None,
7443 nullptr));
7444 }
7445
7446 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
7447
7448 cxx_record_decl->addDecl (cxx_method_decl);
7449
7450 // Sometimes the debug info will mention a constructor (default/copy/move),
7451 // destructor, or assignment operator (copy/move) but there won't be any
7452 // version of this in the code. So we check if the function was artificially
7453 // generated and if it is trivial and this lets the compiler/backend know
7454 // that it can inline the IR for these when it needs to and we can avoid a
7455 // "missing function" error when running expressions.
7456
7457 if (is_artificial)
7458 {
7459 if (cxx_ctor_decl &&
7460 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
7461 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
7462 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
7463 {
7464 cxx_ctor_decl->setDefaulted();
7465 cxx_ctor_decl->setTrivial(true);
7466 }
7467 else if (cxx_dtor_decl)
7468 {
7469 if (cxx_record_decl->hasTrivialDestructor())
7470 {
7471 cxx_dtor_decl->setDefaulted();
7472 cxx_dtor_decl->setTrivial(true);
7473 }
7474 }
7475 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
7476 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
7477 {
7478 cxx_method_decl->setDefaulted();
7479 cxx_method_decl->setTrivial(true);
7480 }
7481 }
7482
7483#ifdef LLDB_CONFIGURATION_DEBUG
7484 VerifyDecl(cxx_method_decl);
7485#endif
7486
7487 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
7488 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
7489 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
7490 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
7491 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
7492 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
7493 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
7494 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
7495 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
7496 return cxx_method_decl;
7497}
7498
7499
7500#pragma mark C++ Base Classes
7501
7502clang::CXXBaseSpecifier *
7503ClangASTContext::CreateBaseClassSpecifier (void* type, AccessType access, bool is_virtual, bool base_of_class)
7504{
7505 if (type)
7506 return new clang::CXXBaseSpecifier (clang::SourceRange(),
7507 is_virtual,
7508 base_of_class,
7509 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
7510 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
7511 clang::SourceLocation());
7512 return nullptr;
7513}
7514
7515void
7516ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
7517{
7518 for (unsigned i=0; i<num_base_classes; ++i)
7519 {
7520 delete base_classes[i];
7521 base_classes[i] = nullptr;
7522 }
7523}
7524
7525bool
7526ClangASTContext::SetBaseClassesForClassType (void* type, clang::CXXBaseSpecifier const * const *base_classes,
7527 unsigned num_base_classes)
7528{
7529 if (type)
7530 {
7531 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
7532 if (cxx_record_decl)
7533 {
7534 cxx_record_decl->setBases(base_classes, num_base_classes);
7535 return true;
7536 }
7537 }
7538 return false;
7539}
7540
7541bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007542ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007543{
7544 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
7545 if (!ast)
7546 return false;
7547 clang::ASTContext* clang_ast = ast->getASTContext();
7548
7549 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
7550 {
7551 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7552 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
7553 if (class_interface_decl && super_interface_decl)
7554 {
7555 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
7556 return true;
7557 }
7558 }
7559 return false;
7560}
7561
7562bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007563ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007564 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007565 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007566 clang::ObjCIvarDecl *ivar_decl,
7567 const char *property_setter_name,
7568 const char *property_getter_name,
7569 uint32_t property_attributes,
7570 ClangASTMetadata *metadata)
7571{
7572 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
7573 return false;
7574 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
7575 if (!ast)
7576 return false;
7577 clang::ASTContext* clang_ast = ast->getASTContext();
7578
7579 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7580
7581 if (class_interface_decl)
7582 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007583 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00007584
7585 if (property_clang_type.IsValid())
7586 property_clang_type_to_access = property_clang_type;
7587 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007588 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007589
7590 if (class_interface_decl && property_clang_type_to_access.IsValid())
7591 {
7592 clang::TypeSourceInfo *prop_type_source;
7593 if (ivar_decl)
7594 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
7595 else
7596 prop_type_source = clang_ast->getTrivialTypeSourceInfo (GetQualType(property_clang_type));
7597
7598 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create (*clang_ast,
7599 class_interface_decl,
7600 clang::SourceLocation(), // Source Location
7601 &clang_ast->Idents.get(property_name),
7602 clang::SourceLocation(), //Source Location for AT
7603 clang::SourceLocation(), //Source location for (
7604 ivar_decl ? ivar_decl->getType() : ClangASTContext::GetQualType(property_clang_type),
7605 prop_type_source);
7606
7607 if (property_decl)
7608 {
7609 if (metadata)
7610 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
7611
7612 class_interface_decl->addDecl (property_decl);
7613
7614 clang::Selector setter_sel, getter_sel;
7615
7616 if (property_setter_name != nullptr)
7617 {
7618 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
7619 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
7620 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7621 }
7622 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
7623 {
7624 std::string setter_sel_string("set");
7625 setter_sel_string.push_back(::toupper(property_name[0]));
7626 setter_sel_string.append(&property_name[1]);
7627 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
7628 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7629 }
7630 property_decl->setSetterName(setter_sel);
7631 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
7632
7633 if (property_getter_name != nullptr)
7634 {
7635 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
7636 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7637 }
7638 else
7639 {
7640 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
7641 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7642 }
7643 property_decl->setGetterName(getter_sel);
7644 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
7645
7646 if (ivar_decl)
7647 property_decl->setPropertyIvarDecl (ivar_decl);
7648
7649 if (property_attributes & DW_APPLE_PROPERTY_readonly)
7650 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
7651 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
7652 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
7653 if (property_attributes & DW_APPLE_PROPERTY_assign)
7654 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
7655 if (property_attributes & DW_APPLE_PROPERTY_retain)
7656 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
7657 if (property_attributes & DW_APPLE_PROPERTY_copy)
7658 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
7659 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
7660 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
7661
7662 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
7663 {
7664 const bool isInstance = true;
7665 const bool isVariadic = false;
7666 const bool isSynthesized = false;
7667 const bool isImplicitlyDeclared = true;
7668 const bool isDefined = false;
7669 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7670 const bool HasRelatedResultType = false;
7671
7672 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create (*clang_ast,
7673 clang::SourceLocation(),
7674 clang::SourceLocation(),
7675 getter_sel,
7676 GetQualType(property_clang_type_to_access),
7677 nullptr,
7678 class_interface_decl,
7679 isInstance,
7680 isVariadic,
7681 isSynthesized,
7682 isImplicitlyDeclared,
7683 isDefined,
7684 impControl,
7685 HasRelatedResultType);
7686
7687 if (getter && metadata)
7688 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
7689
7690 if (getter)
7691 {
7692 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
7693
7694 class_interface_decl->addDecl(getter);
7695 }
7696 }
7697
7698 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
7699 {
7700 clang::QualType result_type = clang_ast->VoidTy;
7701
7702 const bool isInstance = true;
7703 const bool isVariadic = false;
7704 const bool isSynthesized = false;
7705 const bool isImplicitlyDeclared = true;
7706 const bool isDefined = false;
7707 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7708 const bool HasRelatedResultType = false;
7709
7710 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
7711 clang::SourceLocation(),
7712 clang::SourceLocation(),
7713 setter_sel,
7714 result_type,
7715 nullptr,
7716 class_interface_decl,
7717 isInstance,
7718 isVariadic,
7719 isSynthesized,
7720 isImplicitlyDeclared,
7721 isDefined,
7722 impControl,
7723 HasRelatedResultType);
7724
7725 if (setter && metadata)
7726 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
7727
7728 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
7729
7730 params.push_back (clang::ParmVarDecl::Create (*clang_ast,
7731 setter,
7732 clang::SourceLocation(),
7733 clang::SourceLocation(),
7734 nullptr, // anonymous
7735 GetQualType(property_clang_type_to_access),
7736 nullptr,
7737 clang::SC_Auto,
7738 nullptr));
7739
7740 if (setter)
7741 {
7742 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7743
7744 class_interface_decl->addDecl(setter);
7745 }
7746 }
7747
7748 return true;
7749 }
7750 }
7751 }
7752 return false;
7753}
7754
7755bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007756ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00007757{
7758 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7759 if (class_interface_decl)
7760 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
7761 return false;
7762}
7763
7764
7765clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007766ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007767 const char *name, // the full symbol name as seen in the symbol table (void* type, "-[NString stringWithCString:]")
Greg Claytona1e5dc82015-08-11 22:53:00 +00007768 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007769 lldb::AccessType access,
7770 bool is_artificial)
7771{
7772 if (!type || !method_clang_type.IsValid())
7773 return nullptr;
7774
7775 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
7776
7777 if (class_interface_decl == nullptr)
7778 return nullptr;
7779 clang::ASTContext* ast = type.GetTypeSystem()->AsClangASTContext()->getASTContext();
7780
7781 const char *selector_start = ::strchr (name, ' ');
7782 if (selector_start == nullptr)
7783 return nullptr;
7784
7785 selector_start++;
7786 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
7787
7788 size_t len = 0;
7789 const char *start;
7790 //printf ("name = '%s'\n", name);
7791
7792 unsigned num_selectors_with_args = 0;
7793 for (start = selector_start;
7794 start && *start != '\0' && *start != ']';
7795 start += len)
7796 {
7797 len = ::strcspn(start, ":]");
7798 bool has_arg = (start[len] == ':');
7799 if (has_arg)
7800 ++num_selectors_with_args;
7801 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
7802 if (has_arg)
7803 len += 1;
7804 }
7805
7806
7807 if (selector_idents.size() == 0)
7808 return nullptr;
7809
7810 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
7811 selector_idents.data());
7812
7813 clang::QualType method_qual_type (GetQualType(method_clang_type));
7814
7815 // Populate the method decl with parameter decls
7816 const clang::Type *method_type(method_qual_type.getTypePtr());
7817
7818 if (method_type == nullptr)
7819 return nullptr;
7820
7821 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
7822
7823 if (!method_function_prototype)
7824 return nullptr;
7825
7826
7827 bool is_variadic = false;
7828 bool is_synthesized = false;
7829 bool is_defined = false;
7830 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
7831
7832 const unsigned num_args = method_function_prototype->getNumParams();
7833
7834 if (num_args != num_selectors_with_args)
7835 return nullptr; // some debug information is corrupt. We are not going to deal with it.
7836
7837 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create (*ast,
7838 clang::SourceLocation(), // beginLoc,
7839 clang::SourceLocation(), // endLoc,
7840 method_selector,
7841 method_function_prototype->getReturnType(),
7842 nullptr, // TypeSourceInfo *ResultTInfo,
7843 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(GetQualType(type)),
7844 name[0] == '-',
7845 is_variadic,
7846 is_synthesized,
7847 true, // is_implicitly_declared; we force this to true because we don't have source locations
7848 is_defined,
7849 imp_control,
7850 false /*has_related_result_type*/);
7851
7852
7853 if (objc_method_decl == nullptr)
7854 return nullptr;
7855
7856 if (num_args > 0)
7857 {
7858 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7859
7860 for (unsigned param_index = 0; param_index < num_args; ++param_index)
7861 {
7862 params.push_back (clang::ParmVarDecl::Create (*ast,
7863 objc_method_decl,
7864 clang::SourceLocation(),
7865 clang::SourceLocation(),
7866 nullptr, // anonymous
7867 method_function_prototype->getParamType(param_index),
7868 nullptr,
7869 clang::SC_Auto,
7870 nullptr));
7871 }
7872
7873 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7874 }
7875
7876 class_interface_decl->addDecl (objc_method_decl);
7877
7878#ifdef LLDB_CONFIGURATION_DEBUG
7879 VerifyDecl(objc_method_decl);
7880#endif
7881
7882 return objc_method_decl;
7883}
7884
7885bool
7886ClangASTContext::SetHasExternalStorage (void* type, bool has_extern)
7887{
7888 if (!type)
7889 return false;
7890
7891 clang::QualType qual_type (GetCanonicalQualType(type));
7892
7893 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7894 switch (type_class)
7895 {
7896 case clang::Type::Record:
7897 {
7898 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7899 if (cxx_record_decl)
7900 {
7901 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
7902 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
7903 return true;
7904 }
7905 }
7906 break;
7907
7908 case clang::Type::Enum:
7909 {
7910 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
7911 if (enum_decl)
7912 {
7913 enum_decl->setHasExternalLexicalStorage (has_extern);
7914 enum_decl->setHasExternalVisibleStorage (has_extern);
7915 return true;
7916 }
7917 }
7918 break;
7919
7920 case clang::Type::ObjCObject:
7921 case clang::Type::ObjCInterface:
7922 {
7923 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
7924 assert (objc_class_type);
7925 if (objc_class_type)
7926 {
7927 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
7928
7929 if (class_interface_decl)
7930 {
7931 class_interface_decl->setHasExternalLexicalStorage (has_extern);
7932 class_interface_decl->setHasExternalVisibleStorage (has_extern);
7933 return true;
7934 }
7935 }
7936 }
7937 break;
7938
7939 case clang::Type::Typedef:
7940 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
7941
7942 case clang::Type::Elaborated:
7943 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
7944
7945 case clang::Type::Paren:
7946 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
7947
7948 default:
7949 break;
7950 }
7951 return false;
7952}
7953
7954
7955#pragma mark TagDecl
7956
7957bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007958ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007959{
7960 if (type)
7961 {
7962
7963 clang::QualType qual_type (GetQualType(type));
7964 const clang::Type *t = qual_type.getTypePtr();
7965 if (t)
7966 {
7967 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(t);
7968 if (tag_type)
7969 {
7970 clang::TagDecl *tag_decl = tag_type->getDecl();
7971 if (tag_decl)
7972 {
7973 tag_decl->startDefinition();
7974 return true;
7975 }
7976 }
7977
7978 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(t);
7979 if (object_type)
7980 {
7981 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
7982 if (interface_decl)
7983 {
7984 interface_decl->startDefinition();
7985 return true;
7986 }
7987 }
7988 }
7989 }
7990 return false;
7991}
7992
7993bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007994ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007995{
7996 if (type)
7997 {
7998 clang::QualType qual_type (GetQualType(type));
7999 if (qual_type.isNull())
8000 return false;
8001 clang::ASTContext* ast = type.GetTypeSystem()->AsClangASTContext()->getASTContext();
8002
8003 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8004
8005 if (cxx_record_decl)
8006 {
8007 cxx_record_decl->completeDefinition();
8008
8009 return true;
8010 }
8011
8012 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(qual_type.getTypePtr());
8013
8014 if (enutype)
8015 {
8016 clang::EnumDecl *enum_decl = enutype->getDecl();
8017
8018 if (enum_decl)
8019 {
8020 /// TODO This really needs to be fixed.
8021
8022 unsigned NumPositiveBits = 1;
8023 unsigned NumNegativeBits = 0;
8024
8025 clang::QualType promotion_qual_type;
8026 // If the enum integer type is less than an integer in bit width,
8027 // then we must promote it to an integer size.
8028 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
8029 {
8030 if (enum_decl->getIntegerType()->isSignedIntegerType())
8031 promotion_qual_type = ast->IntTy;
8032 else
8033 promotion_qual_type = ast->UnsignedIntTy;
8034 }
8035 else
8036 promotion_qual_type = enum_decl->getIntegerType();
8037
8038 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
8039 return true;
8040 }
8041 }
8042 }
8043 return false;
8044}
8045
8046
8047
8048
8049
8050
8051
8052bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008053ClangASTContext::AddEnumerationValueToEnumerationType (void* type, const CompilerType &enumerator_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008054 const Declaration &decl,
8055 const char *name,
8056 int64_t enum_value,
8057 uint32_t enum_value_bit_size)
8058{
8059 if (type && enumerator_clang_type.IsValid() && name && name[0])
8060 {
8061 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8062
8063 bool is_signed = false;
8064 enumerator_clang_type.IsIntegerType (is_signed);
8065 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8066 if (clang_type)
8067 {
8068 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8069
8070 if (enutype)
8071 {
8072 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
8073 enum_llvm_apsint = enum_value;
8074 clang::EnumConstantDecl *enumerator_decl =
8075 clang::EnumConstantDecl::Create (*getASTContext(),
8076 enutype->getDecl(),
8077 clang::SourceLocation(),
8078 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
8079 GetQualType(enumerator_clang_type),
8080 nullptr,
8081 enum_llvm_apsint);
8082
8083 if (enumerator_decl)
8084 {
8085 enutype->getDecl()->addDecl(enumerator_decl);
8086
8087#ifdef LLDB_CONFIGURATION_DEBUG
8088 VerifyDecl(enumerator_decl);
8089#endif
8090
8091 return true;
8092 }
8093 }
8094 }
8095 }
8096 return false;
8097}
8098
8099
Greg Claytona1e5dc82015-08-11 22:53:00 +00008100CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00008101ClangASTContext::GetEnumerationIntegerType (void* type)
8102{
8103 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8104 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8105 if (clang_type)
8106 {
8107 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8108 if (enutype)
8109 {
8110 clang::EnumDecl *enum_decl = enutype->getDecl();
8111 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008112 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008113 }
8114 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008115 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008116}
8117
Greg Claytona1e5dc82015-08-11 22:53:00 +00008118CompilerType
8119ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008120{
8121 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8122 {
8123 ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
8124 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008125 return CompilerType();
8126 return CompilerType (ast->getASTContext(),
Greg Claytond8d4a572015-08-11 21:38:15 +00008127 ast->getASTContext()->getMemberPointerType (GetQualType(pointee_type),
8128 GetQualType(type).getTypePtr()));
8129 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008130 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008131}
8132
8133
8134size_t
8135ClangASTContext::ConvertStringToFloatValue (void* type, const char *s, uint8_t *dst, size_t dst_size)
8136{
8137 if (type)
8138 {
8139 clang::QualType qual_type (GetCanonicalQualType(type));
8140 uint32_t count = 0;
8141 bool is_complex = false;
8142 if (IsFloatingPointType (type, count, is_complex))
8143 {
8144 // TODO: handle complex and vector types
8145 if (count != 1)
8146 return false;
8147
8148 llvm::StringRef s_sref(s);
8149 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8150
8151 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8152 const uint64_t byte_size = bit_size / 8;
8153 if (dst_size >= byte_size)
8154 {
8155 if (bit_size == sizeof(float)*8)
8156 {
8157 float float32 = ap_float.convertToFloat();
8158 ::memcpy (dst, &float32, byte_size);
8159 return byte_size;
8160 }
8161 else if (bit_size >= 64)
8162 {
8163 llvm::APInt ap_int(ap_float.bitcastToAPInt());
8164 ::memcpy (dst, ap_int.getRawData(), byte_size);
8165 return byte_size;
8166 }
8167 }
8168 }
8169 }
8170 return 0;
8171}
8172
8173
8174
8175//----------------------------------------------------------------------
8176// Dumping types
8177//----------------------------------------------------------------------
8178#define DEPTH_INCREMENT 2
8179
8180void
8181ClangASTContext::DumpValue (void* type, ExecutionContext *exe_ctx,
8182 Stream *s,
8183 lldb::Format format,
8184 const lldb_private::DataExtractor &data,
8185 lldb::offset_t data_byte_offset,
8186 size_t data_byte_size,
8187 uint32_t bitfield_bit_size,
8188 uint32_t bitfield_bit_offset,
8189 bool show_types,
8190 bool show_summary,
8191 bool verbose,
8192 uint32_t depth)
8193{
8194 if (!type)
8195 return;
8196
8197 clang::QualType qual_type(GetQualType(type));
8198 switch (qual_type->getTypeClass())
8199 {
8200 case clang::Type::Record:
8201 if (GetCompleteType(type))
8202 {
8203 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8204 const clang::RecordDecl *record_decl = record_type->getDecl();
8205 assert(record_decl);
8206 uint32_t field_bit_offset = 0;
8207 uint32_t field_byte_offset = 0;
8208 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8209 uint32_t child_idx = 0;
8210
8211 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8212 if (cxx_record_decl)
8213 {
8214 // We might have base classes to print out first
8215 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8216 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8217 base_class != base_class_end;
8218 ++base_class)
8219 {
8220 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8221
8222 // Skip empty base classes
8223 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8224 continue;
8225
8226 if (base_class->isVirtual())
8227 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8228 else
8229 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8230 field_byte_offset = field_bit_offset / 8;
8231 assert (field_bit_offset % 8 == 0);
8232 if (child_idx == 0)
8233 s->PutChar('{');
8234 else
8235 s->PutChar(',');
8236
8237 clang::QualType base_class_qual_type = base_class->getType();
8238 std::string base_class_type_name(base_class_qual_type.getAsString());
8239
8240 // Indent and print the base class type name
8241 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8242
8243 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8244
8245 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008246 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008247 base_clang_type.DumpValue (exe_ctx,
8248 s, // Stream to dump to
8249 base_clang_type.GetFormat(), // The format with which to display the member
8250 data, // Data buffer containing all bytes for this type
8251 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8252 base_class_type_info.Width / 8, // Size of this type in bytes
8253 0, // Bitfield bit size
8254 0, // Bitfield bit offset
8255 show_types, // Boolean indicating if we should show the variable types
8256 show_summary, // Boolean indicating if we should show a summary for the current type
8257 verbose, // Verbose output?
8258 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8259
8260 ++child_idx;
8261 }
8262 }
8263 uint32_t field_idx = 0;
8264 clang::RecordDecl::field_iterator field, field_end;
8265 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8266 {
8267 // Print the starting squiggly bracket (if this is the
8268 // first member) or comma (for member 2 and beyond) for
8269 // the struct/union/class member.
8270 if (child_idx == 0)
8271 s->PutChar('{');
8272 else
8273 s->PutChar(',');
8274
8275 // Indent
8276 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8277
8278 clang::QualType field_type = field->getType();
8279 // Print the member type if requested
8280 // Figure out the type byte size (field_type_info.first) and
8281 // alignment (field_type_info.second) from the AST context.
8282 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8283 assert(field_idx < record_layout.getFieldCount());
8284 // Figure out the field offset within the current struct/union/class type
8285 field_bit_offset = record_layout.getFieldOffset (field_idx);
8286 field_byte_offset = field_bit_offset / 8;
8287 uint32_t field_bitfield_bit_size = 0;
8288 uint32_t field_bitfield_bit_offset = 0;
8289 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8290 field_bitfield_bit_offset = field_bit_offset % 8;
8291
8292 if (show_types)
8293 {
8294 std::string field_type_name(field_type.getAsString());
8295 if (field_bitfield_bit_size > 0)
8296 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
8297 else
8298 s->Printf("(%s) ", field_type_name.c_str());
8299 }
8300 // Print the member name and equal sign
8301 s->Printf("%s = ", field->getNameAsString().c_str());
8302
8303
8304 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008305 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008306 field_clang_type.DumpValue (exe_ctx,
8307 s, // Stream to dump to
8308 field_clang_type.GetFormat(), // The format with which to display the member
8309 data, // Data buffer containing all bytes for this type
8310 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8311 field_type_info.Width / 8, // Size of this type in bytes
8312 field_bitfield_bit_size, // Bitfield bit size
8313 field_bitfield_bit_offset, // Bitfield bit offset
8314 show_types, // Boolean indicating if we should show the variable types
8315 show_summary, // Boolean indicating if we should show a summary for the current type
8316 verbose, // Verbose output?
8317 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8318 }
8319
8320 // Indent the trailing squiggly bracket
8321 if (child_idx > 0)
8322 s->Printf("\n%*s}", depth, "");
8323 }
8324 return;
8325
8326 case clang::Type::Enum:
8327 if (GetCompleteType(type))
8328 {
8329 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8330 const clang::EnumDecl *enum_decl = enutype->getDecl();
8331 assert(enum_decl);
8332 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8333 lldb::offset_t offset = data_byte_offset;
8334 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
8335 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8336 {
8337 if (enum_pos->getInitVal() == enum_value)
8338 {
8339 s->Printf("%s", enum_pos->getNameAsString().c_str());
8340 return;
8341 }
8342 }
8343 // If we have gotten here we didn't get find the enumerator in the
8344 // enum decl, so just print the integer.
8345 s->Printf("%" PRIi64, enum_value);
8346 }
8347 return;
8348
8349 case clang::Type::ConstantArray:
8350 {
8351 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
8352 bool is_array_of_characters = false;
8353 clang::QualType element_qual_type = array->getElementType();
8354
8355 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
8356 if (canonical_type)
8357 is_array_of_characters = canonical_type->isCharType();
8358
8359 const uint64_t element_count = array->getSize().getLimitedValue();
8360
8361 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
8362
8363 uint32_t element_idx = 0;
8364 uint32_t element_offset = 0;
8365 uint64_t element_byte_size = field_type_info.Width / 8;
8366 uint32_t element_stride = element_byte_size;
8367
8368 if (is_array_of_characters)
8369 {
8370 s->PutChar('"');
8371 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8372 s->PutChar('"');
8373 return;
8374 }
8375 else
8376 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008377 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008378 lldb::Format element_format = element_clang_type.GetFormat();
8379
8380 for (element_idx = 0; element_idx < element_count; ++element_idx)
8381 {
8382 // Print the starting squiggly bracket (if this is the
8383 // first member) or comman (for member 2 and beyong) for
8384 // the struct/union/class member.
8385 if (element_idx == 0)
8386 s->PutChar('{');
8387 else
8388 s->PutChar(',');
8389
8390 // Indent and print the index
8391 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
8392
8393 // Figure out the field offset within the current struct/union/class type
8394 element_offset = element_idx * element_stride;
8395
8396 // Dump the value of the member
8397 element_clang_type.DumpValue (exe_ctx,
8398 s, // Stream to dump to
8399 element_format, // The format with which to display the element
8400 data, // Data buffer containing all bytes for this type
8401 data_byte_offset + element_offset,// Offset into "data" where to grab value from
8402 element_byte_size, // Size of this type in bytes
8403 0, // Bitfield bit size
8404 0, // Bitfield bit offset
8405 show_types, // Boolean indicating if we should show the variable types
8406 show_summary, // Boolean indicating if we should show a summary for the current type
8407 verbose, // Verbose output?
8408 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8409 }
8410
8411 // Indent the trailing squiggly bracket
8412 if (element_idx > 0)
8413 s->Printf("\n%*s}", depth, "");
8414 }
8415 }
8416 return;
8417
8418 case clang::Type::Typedef:
8419 {
8420 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
8421
Greg Claytona1e5dc82015-08-11 22:53:00 +00008422 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008423 lldb::Format typedef_format = typedef_clang_type.GetFormat();
8424 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8425 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8426
8427 return typedef_clang_type.DumpValue (exe_ctx,
8428 s, // Stream to dump to
8429 typedef_format, // The format with which to display the element
8430 data, // Data buffer containing all bytes for this type
8431 data_byte_offset, // Offset into "data" where to grab value from
8432 typedef_byte_size, // Size of this type in bytes
8433 bitfield_bit_size, // Bitfield bit size
8434 bitfield_bit_offset,// Bitfield bit offset
8435 show_types, // Boolean indicating if we should show the variable types
8436 show_summary, // Boolean indicating if we should show a summary for the current type
8437 verbose, // Verbose output?
8438 depth); // Scope depth for any types that have children
8439 }
8440 break;
8441
8442 case clang::Type::Elaborated:
8443 {
8444 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008445 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008446 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
8447 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
8448 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
8449
8450 return elaborated_clang_type.DumpValue (exe_ctx,
8451 s, // Stream to dump to
8452 elaborated_format, // The format with which to display the element
8453 data, // Data buffer containing all bytes for this type
8454 data_byte_offset, // Offset into "data" where to grab value from
8455 elaborated_byte_size, // Size of this type in bytes
8456 bitfield_bit_size, // Bitfield bit size
8457 bitfield_bit_offset,// Bitfield bit offset
8458 show_types, // Boolean indicating if we should show the variable types
8459 show_summary, // Boolean indicating if we should show a summary for the current type
8460 verbose, // Verbose output?
8461 depth); // Scope depth for any types that have children
8462 }
8463 break;
8464
8465 case clang::Type::Paren:
8466 {
8467 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008468 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008469
8470 lldb::Format desugar_format = desugar_clang_type.GetFormat();
8471 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
8472 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
8473
8474 return desugar_clang_type.DumpValue (exe_ctx,
8475 s, // Stream to dump to
8476 desugar_format, // The format with which to display the element
8477 data, // Data buffer containing all bytes for this type
8478 data_byte_offset, // Offset into "data" where to grab value from
8479 desugar_byte_size, // Size of this type in bytes
8480 bitfield_bit_size, // Bitfield bit size
8481 bitfield_bit_offset,// Bitfield bit offset
8482 show_types, // Boolean indicating if we should show the variable types
8483 show_summary, // Boolean indicating if we should show a summary for the current type
8484 verbose, // Verbose output?
8485 depth); // Scope depth for any types that have children
8486 }
8487 break;
8488
8489 default:
8490 // We are down to a scalar type that we just need to display.
8491 data.Dump(s,
8492 data_byte_offset,
8493 format,
8494 data_byte_size,
8495 1,
8496 UINT32_MAX,
8497 LLDB_INVALID_ADDRESS,
8498 bitfield_bit_size,
8499 bitfield_bit_offset);
8500
8501 if (show_summary)
8502 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
8503 break;
8504 }
8505}
8506
8507
8508
8509
8510bool
8511ClangASTContext::DumpTypeValue (void* type, Stream *s,
8512 lldb::Format format,
8513 const lldb_private::DataExtractor &data,
8514 lldb::offset_t byte_offset,
8515 size_t byte_size,
8516 uint32_t bitfield_bit_size,
8517 uint32_t bitfield_bit_offset,
8518 ExecutionContextScope *exe_scope)
8519{
8520 if (!type)
8521 return false;
8522 if (IsAggregateType(type))
8523 {
8524 return false;
8525 }
8526 else
8527 {
8528 clang::QualType qual_type(GetQualType(type));
8529
8530 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8531 switch (type_class)
8532 {
8533 case clang::Type::Typedef:
8534 {
8535 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008536 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008537 if (format == eFormatDefault)
8538 format = typedef_clang_type.GetFormat();
8539 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8540 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8541
8542 return typedef_clang_type.DumpTypeValue (s,
8543 format, // The format with which to display the element
8544 data, // Data buffer containing all bytes for this type
8545 byte_offset, // Offset into "data" where to grab value from
8546 typedef_byte_size, // Size of this type in bytes
8547 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
8548 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
8549 exe_scope);
8550 }
8551 break;
8552
8553 case clang::Type::Enum:
8554 // If our format is enum or default, show the enumeration value as
8555 // its enumeration string value, else just display it as requested.
8556 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
8557 {
8558 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8559 const clang::EnumDecl *enum_decl = enutype->getDecl();
8560 assert(enum_decl);
8561 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8562 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
8563 lldb::offset_t offset = byte_offset;
8564 if (is_signed)
8565 {
8566 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8567 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8568 {
8569 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
8570 {
8571 s->PutCString (enum_pos->getNameAsString().c_str());
8572 return true;
8573 }
8574 }
8575 // If we have gotten here we didn't get find the enumerator in the
8576 // enum decl, so just print the integer.
8577 s->Printf("%" PRIi64, enum_svalue);
8578 }
8579 else
8580 {
8581 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8582 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8583 {
8584 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
8585 {
8586 s->PutCString (enum_pos->getNameAsString().c_str());
8587 return true;
8588 }
8589 }
8590 // If we have gotten here we didn't get find the enumerator in the
8591 // enum decl, so just print the integer.
8592 s->Printf("%" PRIu64, enum_uvalue);
8593 }
8594 return true;
8595 }
8596 // format was not enum, just fall through and dump the value as requested....
8597
8598 default:
8599 // We are down to a scalar type that we just need to display.
8600 {
8601 uint32_t item_count = 1;
8602 // A few formats, we might need to modify our size and count for depending
8603 // on how we are trying to display the value...
8604 switch (format)
8605 {
8606 default:
8607 case eFormatBoolean:
8608 case eFormatBinary:
8609 case eFormatComplex:
8610 case eFormatCString: // NULL terminated C strings
8611 case eFormatDecimal:
8612 case eFormatEnum:
8613 case eFormatHex:
8614 case eFormatHexUppercase:
8615 case eFormatFloat:
8616 case eFormatOctal:
8617 case eFormatOSType:
8618 case eFormatUnsigned:
8619 case eFormatPointer:
8620 case eFormatVectorOfChar:
8621 case eFormatVectorOfSInt8:
8622 case eFormatVectorOfUInt8:
8623 case eFormatVectorOfSInt16:
8624 case eFormatVectorOfUInt16:
8625 case eFormatVectorOfSInt32:
8626 case eFormatVectorOfUInt32:
8627 case eFormatVectorOfSInt64:
8628 case eFormatVectorOfUInt64:
8629 case eFormatVectorOfFloat32:
8630 case eFormatVectorOfFloat64:
8631 case eFormatVectorOfUInt128:
8632 break;
8633
8634 case eFormatChar:
8635 case eFormatCharPrintable:
8636 case eFormatCharArray:
8637 case eFormatBytes:
8638 case eFormatBytesWithASCII:
8639 item_count = byte_size;
8640 byte_size = 1;
8641 break;
8642
8643 case eFormatUnicode16:
8644 item_count = byte_size / 2;
8645 byte_size = 2;
8646 break;
8647
8648 case eFormatUnicode32:
8649 item_count = byte_size / 4;
8650 byte_size = 4;
8651 break;
8652 }
8653 return data.Dump (s,
8654 byte_offset,
8655 format,
8656 byte_size,
8657 item_count,
8658 UINT32_MAX,
8659 LLDB_INVALID_ADDRESS,
8660 bitfield_bit_size,
8661 bitfield_bit_offset,
8662 exe_scope);
8663 }
8664 break;
8665 }
8666 }
8667 return 0;
8668}
8669
8670
8671
8672void
8673ClangASTContext::DumpSummary (void* type, ExecutionContext *exe_ctx,
8674 Stream *s,
8675 const lldb_private::DataExtractor &data,
8676 lldb::offset_t data_byte_offset,
8677 size_t data_byte_size)
8678{
8679 uint32_t length = 0;
8680 if (IsCStringType (type, length))
8681 {
8682 if (exe_ctx)
8683 {
8684 Process *process = exe_ctx->GetProcessPtr();
8685 if (process)
8686 {
8687 lldb::offset_t offset = data_byte_offset;
8688 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
8689 std::vector<uint8_t> buf;
8690 if (length > 0)
8691 buf.resize (length);
8692 else
8693 buf.resize (256);
8694
8695 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
8696 buf.back() = '\0';
8697 size_t bytes_read;
8698 size_t total_cstr_len = 0;
8699 Error error;
8700 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
8701 {
8702 const size_t len = strlen((const char *)&buf.front());
8703 if (len == 0)
8704 break;
8705 if (total_cstr_len == 0)
8706 s->PutCString (" \"");
8707 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8708 total_cstr_len += len;
8709 if (len < buf.size())
8710 break;
8711 pointer_address += total_cstr_len;
8712 }
8713 if (total_cstr_len > 0)
8714 s->PutChar ('"');
8715 }
8716 }
8717 }
8718}
8719
8720void
8721ClangASTContext::DumpTypeDescription (void* type)
8722{
8723 StreamFile s (stdout, false);
8724 DumpTypeDescription (&s);
8725 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
8726 if (metadata)
8727 {
8728 metadata->Dump (&s);
8729 }
8730}
8731
8732void
8733ClangASTContext::DumpTypeDescription (void* type, Stream *s)
8734{
8735 if (type)
8736 {
8737 clang::QualType qual_type(GetQualType(type));
8738
8739 llvm::SmallVector<char, 1024> buf;
8740 llvm::raw_svector_ostream llvm_ostrm (buf);
8741
8742 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8743 switch (type_class)
8744 {
8745 case clang::Type::ObjCObject:
8746 case clang::Type::ObjCInterface:
8747 {
8748 GetCompleteType(type);
8749
8750 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8751 assert (objc_class_type);
8752 if (objc_class_type)
8753 {
8754 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8755 if (class_interface_decl)
8756 {
8757 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
8758 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
8759 }
8760 }
8761 }
8762 break;
8763
8764 case clang::Type::Typedef:
8765 {
8766 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
8767 if (typedef_type)
8768 {
8769 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
8770 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
8771 if (!clang_typedef_name.empty())
8772 {
8773 s->PutCString ("typedef ");
8774 s->PutCString (clang_typedef_name.c_str());
8775 }
8776 }
8777 }
8778 break;
8779
8780 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008781 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008782 return;
8783
8784 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008785 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008786 return;
8787
8788 case clang::Type::Record:
8789 {
8790 GetCompleteType(type);
8791
8792 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8793 const clang::RecordDecl *record_decl = record_type->getDecl();
8794 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8795
8796 if (cxx_record_decl)
8797 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8798 else
8799 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8800 }
8801 break;
8802
8803 default:
8804 {
8805 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
8806 if (tag_type)
8807 {
8808 clang::TagDecl *tag_decl = tag_type->getDecl();
8809 if (tag_decl)
8810 tag_decl->print(llvm_ostrm, 0);
8811 }
8812 else
8813 {
8814 std::string clang_type_name(qual_type.getAsString());
8815 if (!clang_type_name.empty())
8816 s->PutCString (clang_type_name.c_str());
8817 }
8818 }
8819 }
8820
8821 llvm_ostrm.flush();
8822 if (buf.size() > 0)
8823 {
8824 s->Write (buf.data(), buf.size());
8825 }
8826 }
8827}