blob: cb570824ba32fbcfc572c58bad5821810a346341 [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"
Greg Clayton73b472d2010-10-27 03:32:59 +000065#include "lldb/Core/Flags.h"
Sean Callananfb8b7092010-10-28 18:19:36 +000066#include "lldb/Core/Log.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000067#include "lldb/Core/RegularExpression.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000068#include "lldb/Core/StreamFile.h"
Enrico Granata2267ad42014-09-16 17:28:40 +000069#include "lldb/Core/ThreadSafeDenseMap.h"
Greg Clayton57ee3062013-07-11 22:46:58 +000070#include "lldb/Core/UniqueCStringMap.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000071#include "lldb/Expression/ASTDumper.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000072#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6dc8d582015-08-18 22:32:36 +000073#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000074#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Greg Clayton261ac3f2015-08-28 01:01:03 +000075#include "lldb/Symbol/SymbolFile.h"
Sean Callanan5e9e1992011-10-26 01:06:27 +000076#include "lldb/Symbol/VerifyDecl.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000077#include "lldb/Target/ExecutionContext.h"
78#include "lldb/Target/Process.h"
79#include "lldb/Target/ObjCLanguageRuntime.h"
80
Greg Clayton261ac3f2015-08-28 01:01:03 +000081#include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h"
82
Eli Friedman932197d2010-06-13 19:06:42 +000083#include <stdio.h>
84
Greg Clayton1341baf2013-07-11 23:36:31 +000085#include <mutex>
86
Greg Claytonc86103d2010-08-05 01:57:25 +000087using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000088using namespace lldb_private;
89using namespace llvm;
90using namespace clang;
91
Enrico Granata2267ad42014-09-16 17:28:40 +000092typedef lldb_private::ThreadSafeDenseMap<clang::ASTContext *, ClangASTContext*> ClangASTMap;
Enrico Granata5d84a692014-08-19 21:46:37 +000093
94static ClangASTMap &
95GetASTMap()
96{
Enrico Granata2267ad42014-09-16 17:28:40 +000097 static ClangASTMap *g_map_ptr = nullptr;
98 static std::once_flag g_once_flag;
99 std::call_once(g_once_flag, []() {
100 g_map_ptr = new ClangASTMap(); // leaked on purpose to avoid spins
101 });
102 return *g_map_ptr;
Enrico Granata5d84a692014-08-19 21:46:37 +0000103}
104
105
Greg Clayton57ee3062013-07-11 22:46:58 +0000106clang::AccessSpecifier
107ClangASTContext::ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000108{
109 switch (access)
110 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000111 default: break;
112 case eAccessNone: return AS_none;
113 case eAccessPublic: return AS_public;
114 case eAccessPrivate: return AS_private;
115 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000116 }
117 return AS_none;
118}
119
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000120static void
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000121ParseLangArgs (LangOptions &Opts, InputKind IK, const char* triple)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000122{
123 // FIXME: Cleanup per-file based stuff.
124
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000125 // Set some properties which depend solely on the input kind; it would be nice
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000126 // to move these to the language standard, and have the driver resolve the
127 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000128 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000129 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000130 } else if (IK == IK_ObjC ||
131 IK == IK_ObjCXX ||
132 IK == IK_PreprocessedObjC ||
133 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000134 Opts.ObjC1 = Opts.ObjC2 = 1;
135 }
136
137 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
138
139 if (LangStd == LangStandard::lang_unspecified) {
140 // Based on the base language, pick one.
141 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000142 case IK_None:
143 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000144 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000145 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000146 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000147 LangStd = LangStandard::lang_opencl;
148 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000149 case IK_CUDA:
Artem Belevich52210ae2015-03-19 18:12:26 +0000150 case IK_PreprocessedCuda:
Sean Callananfb0b7582011-03-15 00:17:19 +0000151 LangStd = LangStandard::lang_cuda;
152 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000153 case IK_Asm:
154 case IK_C:
155 case IK_PreprocessedC:
156 case IK_ObjC:
157 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000158 LangStd = LangStandard::lang_gnu99;
159 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000160 case IK_CXX:
161 case IK_PreprocessedCXX:
162 case IK_ObjCXX:
163 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000164 LangStd = LangStandard::lang_gnucxx98;
165 break;
166 }
167 }
168
169 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
Filipe Cabecinhase818ca22012-11-12 21:26:32 +0000170 Opts.LineComment = Std.hasLineComments();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000171 Opts.C99 = Std.isC99();
172 Opts.CPlusPlus = Std.isCPlusPlus();
Chandler Carruth38336a12013-01-02 12:55:00 +0000173 Opts.CPlusPlus11 = Std.isCPlusPlus11();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000174 Opts.Digraphs = Std.hasDigraphs();
175 Opts.GNUMode = Std.isGNUMode();
176 Opts.GNUInline = !Std.isC99();
177 Opts.HexFloats = Std.hasHexFloats();
178 Opts.ImplicitInt = Std.hasImplicitInt();
Enrico Granatac921e342013-01-10 02:37:22 +0000179
180 Opts.WChar = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000181
182 // OpenCL has some additional defaults.
183 if (LangStd == LangStandard::lang_opencl) {
184 Opts.OpenCL = 1;
185 Opts.AltiVec = 1;
186 Opts.CXXOperatorNames = 1;
187 Opts.LaxVectorConversions = 1;
188 }
189
190 // OpenCL and C++ both have bool, true, false keywords.
191 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
192
193// if (Opts.CPlusPlus)
194// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
195//
196// if (Args.hasArg(OPT_fobjc_gc_only))
197// Opts.setGCMode(LangOptions::GCOnly);
198// else if (Args.hasArg(OPT_fobjc_gc))
199// Opts.setGCMode(LangOptions::HybridGC);
200//
201// if (Args.hasArg(OPT_print_ivar_layout))
202// Opts.ObjCGCBitmapPrint = 1;
203//
204// if (Args.hasArg(OPT_faltivec))
205// Opts.AltiVec = 1;
206//
207// if (Args.hasArg(OPT_pthread))
208// Opts.POSIXThreads = 1;
209//
210// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
211// "default");
212// if (Vis == "default")
Sean Callanan37f76e52013-02-19 19:16:37 +0000213 Opts.setValueVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000214// else if (Vis == "hidden")
215// Opts.setVisibilityMode(LangOptions::Hidden);
216// else if (Vis == "protected")
217// Opts.setVisibilityMode(LangOptions::Protected);
218// else
219// Diags.Report(diag::err_drv_invalid_value)
220// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
221
222// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
223
224 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
225 // is specified, or -std is set to a conforming mode.
226 Opts.Trigraphs = !Opts.GNUMode;
227// if (Args.hasArg(OPT_trigraphs))
228// Opts.Trigraphs = 1;
229//
230// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
231// OPT_fno_dollars_in_identifiers,
232// !Opts.AsmPreprocessor);
233// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
234// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
235// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
236// if (Args.hasArg(OPT_fno_lax_vector_conversions))
237// Opts.LaxVectorConversions = 0;
238// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
239// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
240// Opts.Blocks = Args.hasArg(OPT_fblocks);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000241 Opts.CharIsSigned = ArchSpec(triple).CharIsSignedByDefault();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000242// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
243// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
244// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
245// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
246// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
247// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
248// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
249// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
250// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
251// Diags);
252// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
253// Opts.ObjCConstantStringClass = getLastArgValue(Args,
254// OPT_fconstant_string_class);
255// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
256// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
257// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
258// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
259// Opts.Static = Args.hasArg(OPT_static_define);
260 Opts.OptimizeSize = 0;
261
262 // FIXME: Eliminate this dependency.
263// unsigned Opt =
264// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
265// Opts.Optimize = Opt != 0;
266 unsigned Opt = 0;
267
268 // This is the __NO_INLINE__ define, which just depends on things like the
269 // optimization level and -fno-inline, not actually whether the backend has
270 // inlining enabled.
271 //
272 // FIXME: This is affected by other options (-fno-inline).
Sean Callanan3d654b32012-09-24 22:25:51 +0000273 Opts.NoInlineDefine = !Opt;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000274
275// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
276// switch (SSP) {
277// default:
278// Diags.Report(diag::err_drv_invalid_value)
279// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
280// break;
281// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
282// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
283// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
284// }
285}
286
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000287
Greg Claytonf73034f2015-09-08 18:15:05 +0000288ClangASTContext::ClangASTContext (const char *target_triple) :
289 TypeSystem (TypeSystem::eKindClang),
Greg Clayton6dc8d582015-08-18 22:32:36 +0000290 m_target_triple (),
291 m_ast_ap (),
292 m_language_options_ap (),
293 m_source_manager_ap (),
294 m_diagnostics_engine_ap (),
295 m_target_options_rp (),
296 m_target_info_ap (),
297 m_identifier_table_ap (),
298 m_selector_table_ap (),
299 m_builtins_ap (),
Ed Masted4612ad2014-04-20 13:17:36 +0000300 m_callback_tag_decl (nullptr),
301 m_callback_objc_decl (nullptr),
302 m_callback_baton (nullptr),
Greg Claytond8d4a572015-08-11 21:38:15 +0000303 m_pointer_byte_size (0),
Greg Clayton261ac3f2015-08-28 01:01:03 +0000304 m_ast_owned (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000305{
306 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000307 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000308}
309
310//----------------------------------------------------------------------
311// Destructor
312//----------------------------------------------------------------------
313ClangASTContext::~ClangASTContext()
314{
Enrico Granata5d84a692014-08-19 21:46:37 +0000315 if (m_ast_ap.get())
316 {
Enrico Granata2267ad42014-09-16 17:28:40 +0000317 GetASTMap().Erase(m_ast_ap.get());
Greg Claytond8d4a572015-08-11 21:38:15 +0000318 if (!m_ast_owned)
319 m_ast_ap.release();
Enrico Granata5d84a692014-08-19 21:46:37 +0000320 }
321
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000322 m_builtins_ap.reset();
323 m_selector_table_ap.reset();
324 m_identifier_table_ap.reset();
325 m_target_info_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000326 m_target_options_rp.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000327 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000328 m_source_manager_ap.reset();
329 m_language_options_ap.reset();
Greg Clayton6beaaa62011-01-17 03:46:26 +0000330 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000331}
332
333
334void
335ClangASTContext::Clear()
336{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000337 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000338 m_language_options_ap.reset();
339 m_source_manager_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000340 m_diagnostics_engine_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000341 m_target_options_rp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000342 m_target_info_ap.reset();
343 m_identifier_table_ap.reset();
344 m_selector_table_ap.reset();
345 m_builtins_ap.reset();
Greg Clayton57ee3062013-07-11 22:46:58 +0000346 m_pointer_byte_size = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000347}
348
349const char *
350ClangASTContext::GetTargetTriple ()
351{
352 return m_target_triple.c_str();
353}
354
355void
356ClangASTContext::SetTargetTriple (const char *target_triple)
357{
358 Clear();
359 m_target_triple.assign(target_triple);
360}
361
Greg Clayton514487e2011-02-15 21:59:32 +0000362void
363ClangASTContext::SetArchitecture (const ArchSpec &arch)
364{
Greg Clayton880cbb02011-07-30 01:26:02 +0000365 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000366}
367
Greg Clayton6beaaa62011-01-17 03:46:26 +0000368bool
369ClangASTContext::HasExternalSource ()
370{
371 ASTContext *ast = getASTContext();
372 if (ast)
Ed Masted4612ad2014-04-20 13:17:36 +0000373 return ast->getExternalSource () != nullptr;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000374 return false;
375}
376
377void
Todd Fiala955fe6f2014-02-27 17:18:23 +0000378ClangASTContext::SetExternalSource (llvm::IntrusiveRefCntPtr<ExternalASTSource> &ast_source_ap)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000379{
380 ASTContext *ast = getASTContext();
381 if (ast)
382 {
383 ast->setExternalSource (ast_source_ap);
384 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
385 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
386 }
387}
388
389void
390ClangASTContext::RemoveExternalSource ()
391{
392 ASTContext *ast = getASTContext();
393
394 if (ast)
395 {
Todd Fiala955fe6f2014-02-27 17:18:23 +0000396 llvm::IntrusiveRefCntPtr<ExternalASTSource> empty_ast_source_ap;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000397 ast->setExternalSource (empty_ast_source_ap);
398 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
399 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
400 }
401}
402
Greg Claytond8d4a572015-08-11 21:38:15 +0000403void
404ClangASTContext::setASTContext(clang::ASTContext *ast_ctx)
405{
406 if (!m_ast_owned) {
407 m_ast_ap.release();
408 }
409 m_ast_owned = false;
410 m_ast_ap.reset(ast_ctx);
411 GetASTMap().Insert(ast_ctx, this);
412}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000413
414ASTContext *
415ClangASTContext::getASTContext()
416{
Ed Masted4612ad2014-04-20 13:17:36 +0000417 if (m_ast_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000418 {
Greg Claytond8d4a572015-08-11 21:38:15 +0000419 m_ast_owned = true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000420 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
421 *getSourceManager(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000422 *getIdentifierTable(),
423 *getSelectorTable(),
Alp Tokercf55e882014-05-03 15:05:45 +0000424 *getBuiltinContext()));
Sean Callanan6d61b632015-04-09 17:42:48 +0000425
426 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Greg Clayton28eb7bf2015-05-07 00:07:44 +0000427
428 // This can be NULL if we don't know anything about the architecture or if the
429 // target for an architecture isn't enabled in the llvm/clang that we built
430 TargetInfo *target_info = getTargetInfo();
431 if (target_info)
432 m_ast_ap->InitBuiltinTypes(*target_info);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000433
Greg Clayton6beaaa62011-01-17 03:46:26 +0000434 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
435 {
436 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
437 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
438 }
439
Enrico Granata2267ad42014-09-16 17:28:40 +0000440 GetASTMap().Insert(m_ast_ap.get(), this);
Greg Clayton6dc8d582015-08-18 22:32:36 +0000441
442 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> ast_source_ap (new ClangExternalASTSourceCallbacks (ClangASTContext::CompleteTagDecl,
443 ClangASTContext::CompleteObjCInterfaceDecl,
444 nullptr,
445 ClangASTContext::LayoutRecordType,
446 this));
447 SetExternalSource (ast_source_ap);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000448 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000449 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000450}
451
Enrico Granata5d84a692014-08-19 21:46:37 +0000452ClangASTContext*
453ClangASTContext::GetASTContext (clang::ASTContext* ast)
454{
Enrico Granata2267ad42014-09-16 17:28:40 +0000455 ClangASTContext *clang_ast = GetASTMap().Lookup(ast);
Enrico Granata5d84a692014-08-19 21:46:37 +0000456 return clang_ast;
457}
458
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000459Builtin::Context *
460ClangASTContext::getBuiltinContext()
461{
Ed Masted4612ad2014-04-20 13:17:36 +0000462 if (m_builtins_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000463 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000464 return m_builtins_ap.get();
465}
466
467IdentifierTable *
468ClangASTContext::getIdentifierTable()
469{
Ed Masted4612ad2014-04-20 13:17:36 +0000470 if (m_identifier_table_ap.get() == nullptr)
471 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), nullptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000472 return m_identifier_table_ap.get();
473}
474
475LangOptions *
476ClangASTContext::getLanguageOptions()
477{
Ed Masted4612ad2014-04-20 13:17:36 +0000478 if (m_language_options_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000479 {
480 m_language_options_ap.reset(new LangOptions());
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000481 ParseLangArgs(*m_language_options_ap, IK_ObjCXX, GetTargetTriple());
Greg Clayton94e5d782010-06-13 17:34:29 +0000482// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000483 }
484 return m_language_options_ap.get();
485}
486
487SelectorTable *
488ClangASTContext::getSelectorTable()
489{
Ed Masted4612ad2014-04-20 13:17:36 +0000490 if (m_selector_table_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000491 m_selector_table_ap.reset (new SelectorTable());
492 return m_selector_table_ap.get();
493}
494
Sean Callanan79439e82010-11-18 02:56:27 +0000495clang::FileManager *
496ClangASTContext::getFileManager()
497{
Ed Masted4612ad2014-04-20 13:17:36 +0000498 if (m_file_manager_ap.get() == nullptr)
Greg Clayton38a61402010-12-02 23:20:03 +0000499 {
500 clang::FileSystemOptions file_system_options;
501 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
502 }
Sean Callanan79439e82010-11-18 02:56:27 +0000503 return m_file_manager_ap.get();
504}
505
Greg Claytone1a916a2010-07-21 22:12:05 +0000506clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000507ClangASTContext::getSourceManager()
508{
Ed Masted4612ad2014-04-20 13:17:36 +0000509 if (m_source_manager_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000510 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000511 return m_source_manager_ap.get();
512}
513
Sean Callanan880e6802011-10-07 23:18:13 +0000514clang::DiagnosticsEngine *
515ClangASTContext::getDiagnosticsEngine()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000516{
Ed Masted4612ad2014-04-20 13:17:36 +0000517 if (m_diagnostics_engine_ap.get() == nullptr)
Greg Claytona651b532010-11-19 21:46:54 +0000518 {
519 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callananec8f1ef2012-10-25 01:00:25 +0000520 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
Greg Claytona651b532010-11-19 21:46:54 +0000521 }
Sean Callanan880e6802011-10-07 23:18:13 +0000522 return m_diagnostics_engine_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000523}
524
Sean Callanan880e6802011-10-07 23:18:13 +0000525class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000526{
527public:
Sean Callanan880e6802011-10-07 23:18:13 +0000528 NullDiagnosticConsumer ()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000529 {
530 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
531 }
532
Sean Callanan880e6802011-10-07 23:18:13 +0000533 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000534 {
535 if (m_log)
536 {
Sean Callanan5b26f272012-02-04 08:49:35 +0000537 llvm::SmallVector<char, 32> diag_str(10);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000538 info.FormatDiagnostic(diag_str);
539 diag_str.push_back('\0');
540 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
541 }
542 }
Sean Callanan880e6802011-10-07 23:18:13 +0000543
544 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
545 {
546 return new NullDiagnosticConsumer ();
547 }
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000548private:
Greg Clayton5160ce52013-03-27 23:08:40 +0000549 Log * m_log;
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000550};
551
Sean Callanan880e6802011-10-07 23:18:13 +0000552DiagnosticConsumer *
553ClangASTContext::getDiagnosticConsumer()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000554{
Ed Masted4612ad2014-04-20 13:17:36 +0000555 if (m_diagnostic_consumer_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000556 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000557
Sean Callanan880e6802011-10-07 23:18:13 +0000558 return m_diagnostic_consumer_ap.get();
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000559}
560
Jason Molenda45938b92014-07-08 23:46:39 +0000561std::shared_ptr<TargetOptions> &
562ClangASTContext::getTargetOptions() {
Alp Tokeredc902f2014-07-05 03:06:05 +0000563 if (m_target_options_rp.get() == nullptr && !m_target_triple.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000564 {
Alp Toker5f838642014-07-06 05:36:57 +0000565 m_target_options_rp = std::make_shared<TargetOptions>();
Alp Tokeredc902f2014-07-05 03:06:05 +0000566 if (m_target_options_rp.get() != nullptr)
Sean Callananc5069ad2012-10-17 22:11:14 +0000567 m_target_options_rp->Triple = m_target_triple;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000568 }
Alp Toker5f838642014-07-06 05:36:57 +0000569 return m_target_options_rp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000570}
571
572
573TargetInfo *
574ClangASTContext::getTargetInfo()
575{
Greg Clayton70512312012-05-08 01:45:38 +0000576 // target_triple should be something like "x86_64-apple-macosx"
Ed Masted4612ad2014-04-20 13:17:36 +0000577 if (m_target_info_ap.get() == nullptr && !m_target_triple.empty())
Greg Clayton38d880a2012-11-16 21:35:22 +0000578 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), getTargetOptions()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000579 return m_target_info_ap.get();
580}
581
582#pragma mark Basic Types
583
584static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000585QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000586{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000587 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000588 if (qual_type_bit_size == bit_size)
589 return true;
590 return false;
591}
Greg Claytona1e5dc82015-08-11 22:53:00 +0000592CompilerType
Greg Claytonc86103d2010-08-05 01:57:25 +0000593ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000594{
Greg Clayton57ee3062013-07-11 22:46:58 +0000595 return ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (getASTContext(), encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000596}
597
Greg Claytona1e5dc82015-08-11 22:53:00 +0000598CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +0000599ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000600{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000601 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +0000602 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000603 switch (encoding)
604 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000605 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000606 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000607 return CompilerType (ast, ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000608 break;
609
Greg Claytonc86103d2010-08-05 01:57:25 +0000610 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000611 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000612 return CompilerType (ast, ast->UnsignedCharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000613 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000614 return CompilerType (ast, ast->UnsignedShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000615 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000616 return CompilerType (ast, ast->UnsignedIntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000617 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000618 return CompilerType (ast, ast->UnsignedLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000619 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000620 return CompilerType (ast, ast->UnsignedLongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000621 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000622 return CompilerType (ast, ast->UnsignedInt128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000623 break;
624
Greg Claytonc86103d2010-08-05 01:57:25 +0000625 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000626 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000627 return CompilerType (ast, ast->CharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000628 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000629 return CompilerType (ast, ast->ShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000630 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000631 return CompilerType (ast, ast->IntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000632 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000633 return CompilerType (ast, ast->LongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000634 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000635 return CompilerType (ast, ast->LongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000636 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000637 return CompilerType (ast, ast->Int128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000638 break;
639
Greg Claytonc86103d2010-08-05 01:57:25 +0000640 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000641 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000642 return CompilerType (ast, ast->FloatTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000643 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000644 return CompilerType (ast, ast->DoubleTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000645 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000646 return CompilerType (ast, ast->LongDoubleTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000647 break;
648
Greg Claytonc86103d2010-08-05 01:57:25 +0000649 case eEncodingVector:
Johnny Chenc79c93a2012-03-07 01:12:24 +0000650 // Sanity check that bit_size is a multiple of 8's.
651 if (bit_size && !(bit_size & 0x7u))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000652 return CompilerType (ast, ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8));
Johnny Chenc79c93a2012-03-07 01:12:24 +0000653 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000654 }
655
Greg Claytona1e5dc82015-08-11 22:53:00 +0000656 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000657}
658
Greg Clayton57ee3062013-07-11 22:46:58 +0000659
660
661lldb::BasicType
662ClangASTContext::GetBasicTypeEnumeration (const ConstString &name)
663{
664 if (name)
665 {
666 typedef UniqueCStringMap<lldb::BasicType> TypeNameToBasicTypeMap;
667 static TypeNameToBasicTypeMap g_type_map;
668 static std::once_flag g_once_flag;
669 std::call_once(g_once_flag, [](){
670 // "void"
671 g_type_map.Append(ConstString("void").GetCString(), eBasicTypeVoid);
672
673 // "char"
674 g_type_map.Append(ConstString("char").GetCString(), eBasicTypeChar);
675 g_type_map.Append(ConstString("signed char").GetCString(), eBasicTypeSignedChar);
676 g_type_map.Append(ConstString("unsigned char").GetCString(), eBasicTypeUnsignedChar);
677 g_type_map.Append(ConstString("wchar_t").GetCString(), eBasicTypeWChar);
678 g_type_map.Append(ConstString("signed wchar_t").GetCString(), eBasicTypeSignedWChar);
679 g_type_map.Append(ConstString("unsigned wchar_t").GetCString(), eBasicTypeUnsignedWChar);
680 // "short"
681 g_type_map.Append(ConstString("short").GetCString(), eBasicTypeShort);
682 g_type_map.Append(ConstString("short int").GetCString(), eBasicTypeShort);
683 g_type_map.Append(ConstString("unsigned short").GetCString(), eBasicTypeUnsignedShort);
684 g_type_map.Append(ConstString("unsigned short int").GetCString(), eBasicTypeUnsignedShort);
685
686 // "int"
687 g_type_map.Append(ConstString("int").GetCString(), eBasicTypeInt);
688 g_type_map.Append(ConstString("signed int").GetCString(), eBasicTypeInt);
689 g_type_map.Append(ConstString("unsigned int").GetCString(), eBasicTypeUnsignedInt);
690 g_type_map.Append(ConstString("unsigned").GetCString(), eBasicTypeUnsignedInt);
691
692 // "long"
693 g_type_map.Append(ConstString("long").GetCString(), eBasicTypeLong);
694 g_type_map.Append(ConstString("long int").GetCString(), eBasicTypeLong);
695 g_type_map.Append(ConstString("unsigned long").GetCString(), eBasicTypeUnsignedLong);
696 g_type_map.Append(ConstString("unsigned long int").GetCString(), eBasicTypeUnsignedLong);
697
698 // "long long"
699 g_type_map.Append(ConstString("long long").GetCString(), eBasicTypeLongLong);
700 g_type_map.Append(ConstString("long long int").GetCString(), eBasicTypeLongLong);
701 g_type_map.Append(ConstString("unsigned long long").GetCString(), eBasicTypeUnsignedLongLong);
702 g_type_map.Append(ConstString("unsigned long long int").GetCString(), eBasicTypeUnsignedLongLong);
703
704 // "int128"
705 g_type_map.Append(ConstString("__int128_t").GetCString(), eBasicTypeInt128);
706 g_type_map.Append(ConstString("__uint128_t").GetCString(), eBasicTypeUnsignedInt128);
707
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000708 // Miscellaneous
Greg Clayton57ee3062013-07-11 22:46:58 +0000709 g_type_map.Append(ConstString("bool").GetCString(), eBasicTypeBool);
710 g_type_map.Append(ConstString("float").GetCString(), eBasicTypeFloat);
711 g_type_map.Append(ConstString("double").GetCString(), eBasicTypeDouble);
712 g_type_map.Append(ConstString("long double").GetCString(), eBasicTypeLongDouble);
713 g_type_map.Append(ConstString("id").GetCString(), eBasicTypeObjCID);
714 g_type_map.Append(ConstString("SEL").GetCString(), eBasicTypeObjCSel);
715 g_type_map.Append(ConstString("nullptr").GetCString(), eBasicTypeNullPtr);
716 g_type_map.Sort();
717 });
718
719 return g_type_map.Find(name.GetCString(), eBasicTypeInvalid);
720 }
721 return eBasicTypeInvalid;
722}
723
Greg Claytona1e5dc82015-08-11 22:53:00 +0000724CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000725ClangASTContext::GetBasicType (ASTContext *ast, const ConstString &name)
726{
727 if (ast)
728 {
729 lldb::BasicType basic_type = ClangASTContext::GetBasicTypeEnumeration (name);
730 return ClangASTContext::GetBasicType (ast, basic_type);
731 }
Greg Claytona1e5dc82015-08-11 22:53:00 +0000732 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +0000733}
734
735uint32_t
736ClangASTContext::GetPointerByteSize ()
737{
738 if (m_pointer_byte_size == 0)
Enrico Granata1cd5e922015-01-28 00:07:51 +0000739 m_pointer_byte_size = GetBasicType(lldb::eBasicTypeVoid).GetPointerType().GetByteSize(nullptr);
Greg Clayton57ee3062013-07-11 22:46:58 +0000740 return m_pointer_byte_size;
741}
742
Greg Claytona1e5dc82015-08-11 22:53:00 +0000743CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000744ClangASTContext::GetBasicType (lldb::BasicType basic_type)
745{
746 return GetBasicType (getASTContext(), basic_type);
747}
748
Greg Claytona1e5dc82015-08-11 22:53:00 +0000749CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000750ClangASTContext::GetBasicType (ASTContext *ast, lldb::BasicType basic_type)
751{
752 if (ast)
753 {
Ed Masted4612ad2014-04-20 13:17:36 +0000754 clang_type_t clang_type = nullptr;
Greg Clayton57ee3062013-07-11 22:46:58 +0000755
756 switch (basic_type)
757 {
758 case eBasicTypeInvalid:
759 case eBasicTypeOther:
760 break;
761 case eBasicTypeVoid:
762 clang_type = ast->VoidTy.getAsOpaquePtr();
763 break;
764 case eBasicTypeChar:
765 clang_type = ast->CharTy.getAsOpaquePtr();
766 break;
767 case eBasicTypeSignedChar:
768 clang_type = ast->SignedCharTy.getAsOpaquePtr();
769 break;
770 case eBasicTypeUnsignedChar:
771 clang_type = ast->UnsignedCharTy.getAsOpaquePtr();
772 break;
773 case eBasicTypeWChar:
774 clang_type = ast->getWCharType().getAsOpaquePtr();
775 break;
776 case eBasicTypeSignedWChar:
777 clang_type = ast->getSignedWCharType().getAsOpaquePtr();
778 break;
779 case eBasicTypeUnsignedWChar:
780 clang_type = ast->getUnsignedWCharType().getAsOpaquePtr();
781 break;
782 case eBasicTypeChar16:
783 clang_type = ast->Char16Ty.getAsOpaquePtr();
784 break;
785 case eBasicTypeChar32:
786 clang_type = ast->Char32Ty.getAsOpaquePtr();
787 break;
788 case eBasicTypeShort:
789 clang_type = ast->ShortTy.getAsOpaquePtr();
790 break;
791 case eBasicTypeUnsignedShort:
792 clang_type = ast->UnsignedShortTy.getAsOpaquePtr();
793 break;
794 case eBasicTypeInt:
795 clang_type = ast->IntTy.getAsOpaquePtr();
796 break;
797 case eBasicTypeUnsignedInt:
798 clang_type = ast->UnsignedIntTy.getAsOpaquePtr();
799 break;
800 case eBasicTypeLong:
801 clang_type = ast->LongTy.getAsOpaquePtr();
802 break;
803 case eBasicTypeUnsignedLong:
804 clang_type = ast->UnsignedLongTy.getAsOpaquePtr();
805 break;
806 case eBasicTypeLongLong:
807 clang_type = ast->LongLongTy.getAsOpaquePtr();
808 break;
809 case eBasicTypeUnsignedLongLong:
810 clang_type = ast->UnsignedLongLongTy.getAsOpaquePtr();
811 break;
812 case eBasicTypeInt128:
813 clang_type = ast->Int128Ty.getAsOpaquePtr();
814 break;
815 case eBasicTypeUnsignedInt128:
816 clang_type = ast->UnsignedInt128Ty.getAsOpaquePtr();
817 break;
818 case eBasicTypeBool:
819 clang_type = ast->BoolTy.getAsOpaquePtr();
820 break;
821 case eBasicTypeHalf:
822 clang_type = ast->HalfTy.getAsOpaquePtr();
823 break;
824 case eBasicTypeFloat:
825 clang_type = ast->FloatTy.getAsOpaquePtr();
826 break;
827 case eBasicTypeDouble:
828 clang_type = ast->DoubleTy.getAsOpaquePtr();
829 break;
830 case eBasicTypeLongDouble:
831 clang_type = ast->LongDoubleTy.getAsOpaquePtr();
832 break;
833 case eBasicTypeFloatComplex:
834 clang_type = ast->FloatComplexTy.getAsOpaquePtr();
835 break;
836 case eBasicTypeDoubleComplex:
837 clang_type = ast->DoubleComplexTy.getAsOpaquePtr();
838 break;
839 case eBasicTypeLongDoubleComplex:
840 clang_type = ast->LongDoubleComplexTy.getAsOpaquePtr();
841 break;
842 case eBasicTypeObjCID:
843 clang_type = ast->getObjCIdType().getAsOpaquePtr();
844 break;
845 case eBasicTypeObjCClass:
846 clang_type = ast->getObjCClassType().getAsOpaquePtr();
847 break;
848 case eBasicTypeObjCSel:
849 clang_type = ast->getObjCSelType().getAsOpaquePtr();
850 break;
851 case eBasicTypeNullPtr:
852 clang_type = ast->NullPtrTy.getAsOpaquePtr();
853 break;
854 }
855
856 if (clang_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +0000857 return CompilerType (GetASTContext(ast), clang_type);
Greg Clayton57ee3062013-07-11 22:46:58 +0000858 }
Greg Claytona1e5dc82015-08-11 22:53:00 +0000859 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +0000860}
861
862
Greg Claytona1e5dc82015-08-11 22:53:00 +0000863CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000864ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
865{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000866 ASTContext *ast = getASTContext();
Sean Callanan38d4df52012-04-03 01:10:10 +0000867
868#define streq(a,b) strcmp(a,b) == 0
Ed Masted4612ad2014-04-20 13:17:36 +0000869 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000870 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000871 {
872 switch (dw_ate)
873 {
Sean Callanan38d4df52012-04-03 01:10:10 +0000874 default:
875 break;
Greg Clayton605684e2011-10-28 23:06:08 +0000876
Sean Callanan38d4df52012-04-03 01:10:10 +0000877 case DW_ATE_address:
878 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000879 return CompilerType (ast, ast->VoidPtrTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000880 break;
881
882 case DW_ATE_boolean:
883 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000884 return CompilerType (ast, ast->BoolTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000885 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000886 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000887 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000888 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000889 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000890 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000891 break;
892
893 case DW_ATE_lo_user:
894 // This has been seen to mean DW_AT_complex_integer
895 if (type_name)
Greg Clayton605684e2011-10-28 23:06:08 +0000896 {
Sean Callanan38d4df52012-04-03 01:10:10 +0000897 if (::strstr(type_name, "complex"))
898 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000899 CompilerType complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
900 return CompilerType (ast, ast->getComplexType (GetQualType(complex_int_clang_type)));
Sean Callanan38d4df52012-04-03 01:10:10 +0000901 }
Greg Clayton605684e2011-10-28 23:06:08 +0000902 }
Sean Callanan38d4df52012-04-03 01:10:10 +0000903 break;
904
905 case DW_ATE_complex_float:
906 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000907 return CompilerType (ast, ast->FloatComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000908 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000909 return CompilerType (ast, ast->DoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000910 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000911 return CompilerType (ast, ast->LongDoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000912 else
Greg Clayton605684e2011-10-28 23:06:08 +0000913 {
Greg Claytona1e5dc82015-08-11 22:53:00 +0000914 CompilerType complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
915 return CompilerType (ast, ast->getComplexType (GetQualType(complex_float_clang_type)));
Greg Clayton605684e2011-10-28 23:06:08 +0000916 }
Sean Callanan38d4df52012-04-03 01:10:10 +0000917 break;
918
919 case DW_ATE_float:
Greg Clayton8012cad2014-11-17 19:39:20 +0000920 if (streq(type_name, "float") && QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000921 return CompilerType (ast, ast->FloatTy);
Greg Clayton8012cad2014-11-17 19:39:20 +0000922 if (streq(type_name, "double") && QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000923 return CompilerType (ast, ast->DoubleTy);
Greg Clayton8012cad2014-11-17 19:39:20 +0000924 if (streq(type_name, "long double") && QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000925 return CompilerType (ast, ast->LongDoubleTy);
Bruce Mitchenere171da52015-07-22 00:16:02 +0000926 // Fall back to not requiring a name match
Sean Callanan38d4df52012-04-03 01:10:10 +0000927 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000928 return CompilerType (ast, ast->FloatTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000929 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000930 return CompilerType (ast, ast->DoubleTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000931 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000932 return CompilerType (ast, ast->LongDoubleTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000933 break;
934
935 case DW_ATE_signed:
936 if (type_name)
937 {
938 if (streq(type_name, "wchar_t") &&
Tamas Berghammer3c0d0052015-04-01 09:48:02 +0000939 QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy) &&
Greg Clayton28eb7bf2015-05-07 00:07:44 +0000940 (getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000941 return CompilerType (ast, ast->WCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000942 if (streq(type_name, "void") &&
943 QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000944 return CompilerType (ast, ast->VoidTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000945 if (strstr(type_name, "long long") &&
946 QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000947 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000948 if (strstr(type_name, "long") &&
949 QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000950 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000951 if (strstr(type_name, "short") &&
952 QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000953 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000954 if (strstr(type_name, "char"))
955 {
956 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000957 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000958 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000959 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000960 }
961 if (strstr(type_name, "int"))
962 {
963 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000964 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000965 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000966 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +0000967 }
968 }
969 // We weren't able to match up a type name, just search by size
970 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000971 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000972 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000973 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000974 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000975 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000976 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000977 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000978 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000979 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000980 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000981 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +0000982 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000983
Sean Callanan38d4df52012-04-03 01:10:10 +0000984 case DW_ATE_signed_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000985 if (ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
Sean Callanan38d4df52012-04-03 01:10:10 +0000986 {
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000987 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000988 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000989 }
Sean Callanan38d4df52012-04-03 01:10:10 +0000990 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000991 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +0000992 break;
993
994 case DW_ATE_unsigned:
995 if (type_name)
996 {
Tamas Berghammer3c0d0052015-04-01 09:48:02 +0000997 if (streq(type_name, "wchar_t"))
998 {
999 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
1000 {
Greg Clayton28eb7bf2015-05-07 00:07:44 +00001001 if (!(getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001002 return CompilerType (ast, ast->WCharTy);
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001003 }
1004 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001005 if (strstr(type_name, "long long"))
1006 {
1007 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001008 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001009 }
1010 else if (strstr(type_name, "long"))
1011 {
1012 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001013 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001014 }
1015 else if (strstr(type_name, "short"))
1016 {
1017 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001018 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001019 }
1020 else if (strstr(type_name, "char"))
1021 {
1022 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001023 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001024 }
1025 else if (strstr(type_name, "int"))
1026 {
1027 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001028 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001029 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001030 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001031 }
1032 }
1033 // We weren't able to match up a type name, just search by size
1034 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001035 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001036 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001037 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001038 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001039 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001040 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001041 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001042 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001043 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001044 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001045 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001046 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001047
Sean Callanan38d4df52012-04-03 01:10:10 +00001048 case DW_ATE_unsigned_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001049 if (!ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
1050 {
1051 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001052 return CompilerType (ast, ast->CharTy);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001053 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001054 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001055 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001056 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001057 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001058 break;
1059
1060 case DW_ATE_imaginary_float:
1061 break;
1062
1063 case DW_ATE_UTF:
1064 if (type_name)
1065 {
1066 if (streq(type_name, "char16_t"))
1067 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001068 return CompilerType (ast, ast->Char16Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001069 }
1070 else if (streq(type_name, "char32_t"))
1071 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001072 return CompilerType (ast, ast->Char32Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001073 }
1074 }
1075 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001076 }
1077 }
1078 // This assert should fire for anything that we don't catch above so we know
1079 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +00001080 if (type_name)
1081 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001082 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 +00001083 }
1084 else
1085 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001086 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 +00001087 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001088 return CompilerType ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001089}
1090
Greg Claytona1e5dc82015-08-11 22:53:00 +00001091CompilerType
Sean Callanan77502262011-05-12 23:54:16 +00001092ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
1093{
Greg Clayton57ee3062013-07-11 22:46:58 +00001094 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001095 return CompilerType (ast, ast->UnknownAnyTy);
1096 return CompilerType();
Sean Callanan77502262011-05-12 23:54:16 +00001097}
1098
Greg Claytona1e5dc82015-08-11 22:53:00 +00001099CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001100ClangASTContext::GetCStringType (bool is_const)
1101{
Greg Clayton57ee3062013-07-11 22:46:58 +00001102 ASTContext *ast = getASTContext();
1103 QualType char_type(ast->CharTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001104
1105 if (is_const)
1106 char_type.addConst();
1107
Greg Claytona1e5dc82015-08-11 22:53:00 +00001108 return CompilerType (ast, ast->getPointerType(char_type));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001109}
1110
Sean Callanan09ab4b72011-11-30 22:11:59 +00001111clang::DeclContext *
1112ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
1113{
1114 return ast->getTranslationUnitDecl();
1115}
1116
Greg Claytona1e5dc82015-08-11 22:53:00 +00001117CompilerType
Greg Clayton38a61402010-12-02 23:20:03 +00001118ClangASTContext::CopyType (ASTContext *dst_ast,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001119 CompilerType src)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001120{
Sean Callanan79439e82010-11-18 02:56:27 +00001121 FileSystemOptions file_system_options;
Greg Claytonf73034f2015-09-08 18:15:05 +00001122 ClangASTContext *src_ast = llvm::dyn_cast_or_null<ClangASTContext>(src.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00001123 if (src_ast == nullptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001124 return CompilerType();
Greg Clayton38a61402010-12-02 23:20:03 +00001125 FileManager file_manager (file_system_options);
1126 ASTImporter importer(*dst_ast, file_manager,
Greg Claytond8d4a572015-08-11 21:38:15 +00001127 *src_ast->getASTContext(), file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001128 false);
Sean Callanan0617fcb2010-11-09 22:37:10 +00001129
Greg Claytond8d4a572015-08-11 21:38:15 +00001130 QualType dst (importer.Import(GetQualType(src)));
Sean Callanan0617fcb2010-11-09 22:37:10 +00001131
Greg Claytona1e5dc82015-08-11 22:53:00 +00001132 return CompilerType (dst_ast, dst);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001133}
1134
Greg Clayton526e5af2010-11-13 03:52:47 +00001135
1136clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001137ClangASTContext::CopyDecl (ASTContext *dst_ast,
1138 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001139 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001140{
Sean Callanan79439e82010-11-18 02:56:27 +00001141 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001142 FileManager file_manager (file_system_options);
1143 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001144 *src_ast, file_manager,
1145 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001146
1147 return importer.Import(source_decl);
1148}
1149
Sean Callanan23a30272010-07-16 00:00:27 +00001150bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00001151ClangASTContext::AreTypesSame (CompilerType type1,
1152 CompilerType type2,
Greg Clayton84db9102012-03-26 23:03:23 +00001153 bool ignore_qualifiers)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001154{
Greg Claytonf73034f2015-09-08 18:15:05 +00001155 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type1.GetTypeSystem());
1156 if (!ast || ast != type2.GetTypeSystem())
Greg Clayton57ee3062013-07-11 22:46:58 +00001157 return false;
1158
1159 if (type1.GetOpaqueQualType() == type2.GetOpaqueQualType())
Greg Clayton55995eb2012-04-06 17:38:55 +00001160 return true;
1161
Greg Claytond8d4a572015-08-11 21:38:15 +00001162 QualType type1_qual = GetQualType(type1);
1163 QualType type2_qual = GetQualType(type2);
Sean Callanan5056ab02012-02-18 02:01:03 +00001164
1165 if (ignore_qualifiers)
1166 {
1167 type1_qual = type1_qual.getUnqualifiedType();
1168 type2_qual = type2_qual.getUnqualifiedType();
1169 }
1170
Greg Claytonf73034f2015-09-08 18:15:05 +00001171 return ast->getASTContext()->hasSameType (type1_qual, type2_qual);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001172}
1173
Greg Claytona1e5dc82015-08-11 22:53:00 +00001174CompilerType
Sean Callanan9998acd2014-12-05 01:21:59 +00001175ClangASTContext::GetTypeForDecl (clang::NamedDecl *decl)
1176{
1177 if (clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
1178 return GetTypeForDecl(interface_decl);
1179 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
1180 return GetTypeForDecl(tag_decl);
Greg Claytona1e5dc82015-08-11 22:53:00 +00001181 return CompilerType();
Sean Callanan9998acd2014-12-05 01:21:59 +00001182}
1183
Greg Clayton6beaaa62011-01-17 03:46:26 +00001184
Greg Claytona1e5dc82015-08-11 22:53:00 +00001185CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001186ClangASTContext::GetTypeForDecl (TagDecl *decl)
1187{
1188 // No need to call the getASTContext() accessor (which can create the AST
1189 // if it isn't created yet, because we can't have created a decl in this
1190 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001191 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001192 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001193 return CompilerType (ast, ast->getTagDeclType(decl));
1194 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001195}
1196
Greg Claytona1e5dc82015-08-11 22:53:00 +00001197CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001198ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1199{
1200 // No need to call the getASTContext() accessor (which can create the AST
1201 // if it isn't created yet, because we can't have created a decl in this
1202 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001203 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001204 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001205 return CompilerType (ast, ast->getObjCInterfaceType(decl));
1206 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001207}
1208
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001209#pragma mark Structure, Unions, Classes
1210
Greg Claytona1e5dc82015-08-11 22:53:00 +00001211CompilerType
Greg Claytonc4ffd662013-03-08 01:37:30 +00001212ClangASTContext::CreateRecordType (DeclContext *decl_ctx,
1213 AccessType access_type,
1214 const char *name,
1215 int kind,
1216 LanguageType language,
1217 ClangASTMetadata *metadata)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001218{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001219 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001220 assert (ast != nullptr);
Sean Callananad880762012-04-18 01:06:17 +00001221
Ed Masted4612ad2014-04-20 13:17:36 +00001222 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001223 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001224
Greg Clayton9e409562010-07-28 02:04:09 +00001225
Greg Claytone1be9962011-08-24 23:50:00 +00001226 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001227 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001228 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001229 bool isInternal = false;
Sean Callananad880762012-04-18 01:06:17 +00001230 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
Greg Clayton9e409562010-07-28 02:04:09 +00001231 }
1232
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001233 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1234 // we will need to update this code. I was told to currently always use
1235 // the CXXRecordDecl class since we often don't know from debug information
1236 // if something is struct or a class, so we default to always use the more
1237 // complete definition just in case.
Sean Callanan11e32d32014-02-18 00:31:38 +00001238
1239 bool is_anonymous = (!name) || (!name[0]);
1240
Greg Claytonf0705c82011-10-22 03:33:13 +00001241 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1242 (TagDecl::TagKind)kind,
1243 decl_ctx,
1244 SourceLocation(),
1245 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001246 is_anonymous ? nullptr : &ast->Idents.get(name));
Sean Callanan11e32d32014-02-18 00:31:38 +00001247
1248 if (is_anonymous)
1249 decl->setAnonymousStructOrUnion(true);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001250
Greg Claytonc4ffd662013-03-08 01:37:30 +00001251 if (decl)
Greg Clayton55561e92011-10-26 03:31:36 +00001252 {
Greg Claytonc4ffd662013-03-08 01:37:30 +00001253 if (metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001254 SetMetadata(ast, decl, *metadata);
Greg Claytonc4ffd662013-03-08 01:37:30 +00001255
Greg Clayton55561e92011-10-26 03:31:36 +00001256 if (access_type != eAccessNone)
1257 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Claytonc4ffd662013-03-08 01:37:30 +00001258
1259 if (decl_ctx)
1260 decl_ctx->addDecl (decl);
1261
Greg Claytona1e5dc82015-08-11 22:53:00 +00001262 return CompilerType(ast, ast->getTagDeclType(decl));
Greg Clayton55561e92011-10-26 03:31:36 +00001263 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001264 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001265}
1266
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001267static TemplateParameterList *
1268CreateTemplateParameterList (ASTContext *ast,
Sean Callanan3d654b32012-09-24 22:25:51 +00001269 const ClangASTContext::TemplateParameterInfos &template_param_infos,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001270 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1271{
1272 const bool parameter_pack = false;
1273 const bool is_typename = false;
1274 const unsigned depth = 0;
1275 const size_t num_template_params = template_param_infos.GetSize();
1276 for (size_t i=0; i<num_template_params; ++i)
1277 {
1278 const char *name = template_param_infos.names[i];
Greg Clayton283b2652013-04-23 22:38:02 +00001279
Ed Masted4612ad2014-04-20 13:17:36 +00001280 IdentifierInfo *identifier_info = nullptr;
Greg Clayton283b2652013-04-23 22:38:02 +00001281 if (name && name[0])
1282 identifier_info = &ast->Idents.get(name);
Sean Callanan3d654b32012-09-24 22:25:51 +00001283 if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001284 {
1285 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1286 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1287 SourceLocation(),
1288 SourceLocation(),
1289 depth,
1290 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001291 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001292 template_param_infos.args[i].getIntegralType(),
1293 parameter_pack,
Ed Masted4612ad2014-04-20 13:17:36 +00001294 nullptr));
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001295
1296 }
1297 else
1298 {
1299 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1300 ast->getTranslationUnitDecl(), // Is this the right decl context?
1301 SourceLocation(),
1302 SourceLocation(),
1303 depth,
1304 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001305 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001306 is_typename,
1307 parameter_pack));
1308 }
1309 }
1310
1311 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1312 SourceLocation(),
1313 SourceLocation(),
1314 &template_param_decls.front(),
1315 template_param_decls.size(),
1316 SourceLocation());
1317 return template_param_list;
1318}
1319
1320clang::FunctionTemplateDecl *
1321ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1322 clang::FunctionDecl *func_decl,
1323 const char *name,
1324 const TemplateParameterInfos &template_param_infos)
1325{
1326// /// \brief Create a function template node.
1327 ASTContext *ast = getASTContext();
1328
1329 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1330
1331 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1332 template_param_infos,
1333 template_param_decls);
1334 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1335 decl_ctx,
1336 func_decl->getLocation(),
1337 func_decl->getDeclName(),
1338 template_param_list,
1339 func_decl);
1340
1341 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1342 i < template_param_decl_count;
1343 ++i)
1344 {
1345 // TODO: verify which decl context we should put template_param_decls into..
1346 template_param_decls[i]->setDeclContext (func_decl);
1347 }
1348
1349 return func_tmpl_decl;
1350}
1351
1352void
1353ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1354 clang::FunctionTemplateDecl *func_tmpl_decl,
1355 const TemplateParameterInfos &infos)
1356{
1357 TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1358 infos.args.data(),
1359 infos.args.size());
1360
1361 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1362 &template_args,
Ed Masted4612ad2014-04-20 13:17:36 +00001363 nullptr);
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001364}
1365
1366
Greg Claytonf0705c82011-10-22 03:33:13 +00001367ClassTemplateDecl *
1368ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001369 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001370 const char *class_name,
1371 int kind,
1372 const TemplateParameterInfos &template_param_infos)
1373{
1374 ASTContext *ast = getASTContext();
1375
Ed Masted4612ad2014-04-20 13:17:36 +00001376 ClassTemplateDecl *class_template_decl = nullptr;
1377 if (decl_ctx == nullptr)
Greg Claytonf0705c82011-10-22 03:33:13 +00001378 decl_ctx = ast->getTranslationUnitDecl();
1379
1380 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1381 DeclarationName decl_name (&identifier_info);
1382
1383 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001384
1385 for (NamedDecl *decl : result)
Greg Claytonf0705c82011-10-22 03:33:13 +00001386 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001387 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
Greg Claytonf0705c82011-10-22 03:33:13 +00001388 if (class_template_decl)
1389 return class_template_decl;
1390 }
1391
1392 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf0705c82011-10-22 03:33:13 +00001393
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001394 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1395 template_param_infos,
1396 template_param_decls);
Greg Claytonf0705c82011-10-22 03:33:13 +00001397
1398 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1399 (TagDecl::TagKind)kind,
1400 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1401 SourceLocation(),
1402 SourceLocation(),
1403 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001404
1405 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1406 i < template_param_decl_count;
1407 ++i)
1408 {
1409 template_param_decls[i]->setDeclContext (template_cxx_decl);
1410 }
1411
Sean Callananb5c79622011-11-19 01:35:08 +00001412 // With templated classes, we say that a class is templated with
1413 // specializations, but that the bare class has no functions.
Sean Callananfa4fab72013-02-01 06:55:48 +00001414 //template_cxx_decl->startDefinition();
1415 //template_cxx_decl->completeDefinition();
Sean Callananb5c79622011-11-19 01:35:08 +00001416
Greg Claytonf0705c82011-10-22 03:33:13 +00001417 class_template_decl = ClassTemplateDecl::Create (*ast,
1418 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1419 SourceLocation(),
1420 decl_name,
1421 template_param_list,
1422 template_cxx_decl,
Ed Masted4612ad2014-04-20 13:17:36 +00001423 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001424
1425 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001426 {
Greg Clayton55561e92011-10-26 03:31:36 +00001427 if (access_type != eAccessNone)
1428 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan5b26f272012-02-04 08:49:35 +00001429
1430 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1431 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1432
Greg Claytonf0705c82011-10-22 03:33:13 +00001433 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001434
1435#ifdef LLDB_CONFIGURATION_DEBUG
1436 VerifyDecl(class_template_decl);
1437#endif
1438 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001439
1440 return class_template_decl;
1441}
1442
1443
1444ClassTemplateSpecializationDecl *
1445ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1446 ClassTemplateDecl *class_template_decl,
1447 int kind,
1448 const TemplateParameterInfos &template_param_infos)
1449{
1450 ASTContext *ast = getASTContext();
1451 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1452 (TagDecl::TagKind)kind,
1453 decl_ctx,
1454 SourceLocation(),
1455 SourceLocation(),
1456 class_template_decl,
1457 &template_param_infos.args.front(),
1458 template_param_infos.args.size(),
Ed Masted4612ad2014-04-20 13:17:36 +00001459 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001460
Sean Callananfa4fab72013-02-01 06:55:48 +00001461 class_template_specialization_decl->setSpecializationKind(TSK_ExplicitSpecialization);
1462
Greg Claytonf0705c82011-10-22 03:33:13 +00001463 return class_template_specialization_decl;
1464}
1465
Greg Claytona1e5dc82015-08-11 22:53:00 +00001466CompilerType
Greg Claytonf0705c82011-10-22 03:33:13 +00001467ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1468{
1469 if (class_template_specialization_decl)
1470 {
1471 ASTContext *ast = getASTContext();
1472 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001473 return CompilerType(ast, ast->getTagDeclType(class_template_specialization_decl));
Greg Claytonf0705c82011-10-22 03:33:13 +00001474 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001475 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001476}
1477
Greg Clayton090d0982011-06-19 03:43:27 +00001478static inline bool
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001479check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001480{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001481 // Special-case call since it can take any number of operands
1482 if(op_kind == OO_Call)
1483 return true;
1484
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001485 // The parameter count doesn't include "this"
Greg Clayton090d0982011-06-19 03:43:27 +00001486 if (num_params == 0)
1487 return unary;
1488 if (num_params == 1)
1489 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001490 else
Greg Clayton090d0982011-06-19 03:43:27 +00001491 return false;
1492}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001493
Greg Clayton090d0982011-06-19 03:43:27 +00001494bool
1495ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1496{
Sean Callanan5b26f272012-02-04 08:49:35 +00001497 switch (op_kind)
1498 {
1499 default:
1500 break;
1501 // C++ standard allows any number of arguments to new/delete
1502 case OO_New:
1503 case OO_Array_New:
1504 case OO_Delete:
1505 case OO_Array_Delete:
1506 return true;
1507 }
1508
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001509#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 +00001510 switch (op_kind)
1511 {
1512#include "clang/Basic/OperatorKinds.def"
1513 default: break;
1514 }
1515 return false;
1516}
1517
Greg Clayton57ee3062013-07-11 22:46:58 +00001518clang::AccessSpecifier
1519ClangASTContext::UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs)
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001520{
1521 clang::AccessSpecifier ret = lhs;
1522
1523 // Make the access equal to the stricter of the field and the nested field's access
1524 switch (ret)
1525 {
1526 case clang::AS_none:
1527 break;
1528 case clang::AS_private:
1529 break;
1530 case clang::AS_protected:
1531 if (rhs == AS_private)
1532 ret = AS_private;
1533 break;
1534 case clang::AS_public:
1535 ret = rhs;
1536 break;
1537 }
1538
1539 return ret;
1540}
1541
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001542bool
1543ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1544{
1545 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1546}
1547
1548bool
1549ClangASTContext::FieldIsBitfield
1550(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001551 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001552 FieldDecl* field,
1553 uint32_t& bitfield_bit_size
1554)
1555{
Ed Masted4612ad2014-04-20 13:17:36 +00001556 if (ast == nullptr || field == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001557 return false;
1558
1559 if (field->isBitField())
1560 {
1561 Expr* bit_width_expr = field->getBitWidth();
1562 if (bit_width_expr)
1563 {
1564 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001565 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001566 {
1567 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1568 return true;
1569 }
1570 }
1571 }
1572 return false;
1573}
1574
1575bool
1576ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1577{
Ed Masted4612ad2014-04-20 13:17:36 +00001578 if (record_decl == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001579 return false;
1580
1581 if (!record_decl->field_empty())
1582 return true;
1583
1584 // No fields, lets check this is a CXX record and check the base classes
1585 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1586 if (cxx_record_decl)
1587 {
1588 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1589 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1590 base_class != base_class_end;
1591 ++base_class)
1592 {
1593 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1594 if (RecordHasFields(base_class_decl))
1595 return true;
1596 }
1597 }
1598 return false;
1599}
1600
Greg Clayton8cf05932010-07-22 18:30:50 +00001601#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001602
Greg Claytona1e5dc82015-08-11 22:53:00 +00001603CompilerType
Sean Callananad880762012-04-18 01:06:17 +00001604ClangASTContext::CreateObjCClass
Greg Clayton8cf05932010-07-22 18:30:50 +00001605(
1606 const char *name,
1607 DeclContext *decl_ctx,
1608 bool isForwardDecl,
Sean Callananad880762012-04-18 01:06:17 +00001609 bool isInternal,
Jim Ingham379397632012-10-27 02:54:13 +00001610 ClangASTMetadata *metadata
Greg Clayton8cf05932010-07-22 18:30:50 +00001611)
1612{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001613 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001614 assert (ast != nullptr);
Greg Clayton8cf05932010-07-22 18:30:50 +00001615 assert (name && name[0]);
Ed Masted4612ad2014-04-20 13:17:36 +00001616 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001617 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00001618
Greg Clayton6beaaa62011-01-17 03:46:26 +00001619 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001620 decl_ctx,
1621 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001622 &ast->Idents.get(name),
Ed Masted4612ad2014-04-20 13:17:36 +00001623 nullptr,
Pavel Labath67add942015-07-07 10:11:16 +00001624 nullptr,
Greg Clayton8cf05932010-07-22 18:30:50 +00001625 SourceLocation(),
Sean Callanan5b26f272012-02-04 08:49:35 +00001626 /*isForwardDecl,*/
Greg Clayton8cf05932010-07-22 18:30:50 +00001627 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00001628
Jim Ingham379397632012-10-27 02:54:13 +00001629 if (decl && metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001630 SetMetadata(ast, decl, *metadata);
Sean Callananad880762012-04-18 01:06:17 +00001631
Greg Claytona1e5dc82015-08-11 22:53:00 +00001632 return CompilerType (ast, ast->getObjCInterfaceType(decl));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001633}
1634
1635static inline bool
1636BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
1637{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001638 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001639}
1640
Greg Clayton57ee3062013-07-11 22:46:58 +00001641uint32_t
1642ClangASTContext::GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001643{
1644 uint32_t num_bases = 0;
1645 if (cxx_record_decl)
1646 {
1647 if (omit_empty_base_classes)
1648 {
1649 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1650 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1651 base_class != base_class_end;
1652 ++base_class)
1653 {
1654 // Skip empty base classes
1655 if (omit_empty_base_classes)
1656 {
1657 if (BaseSpecifierIsEmpty (base_class))
1658 continue;
1659 }
1660 ++num_bases;
1661 }
1662 }
1663 else
1664 num_bases = cxx_record_decl->getNumBases();
1665 }
1666 return num_bases;
1667}
1668
1669
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001670#pragma mark Namespace Declarations
1671
1672NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00001673ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001674{
Ed Masted4612ad2014-04-20 13:17:36 +00001675 NamespaceDecl *namespace_decl = nullptr;
Greg Clayton9d3d6882011-10-31 23:51:19 +00001676 ASTContext *ast = getASTContext();
1677 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
Ed Masted4612ad2014-04-20 13:17:36 +00001678 if (decl_ctx == nullptr)
Greg Clayton9d3d6882011-10-31 23:51:19 +00001679 decl_ctx = translation_unit_decl;
1680
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001681 if (name)
1682 {
Greg Clayton030a2042011-10-14 21:34:45 +00001683 IdentifierInfo &identifier_info = ast->Idents.get(name);
1684 DeclarationName decl_name (&identifier_info);
1685 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001686 for (NamedDecl *decl : result)
Greg Clayton030a2042011-10-14 21:34:45 +00001687 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001688 namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
Greg Clayton030a2042011-10-14 21:34:45 +00001689 if (namespace_decl)
1690 return namespace_decl;
1691 }
1692
Sean Callanan5b26f272012-02-04 08:49:35 +00001693 namespace_decl = NamespaceDecl::Create(*ast,
1694 decl_ctx,
1695 false,
1696 SourceLocation(),
1697 SourceLocation(),
1698 &identifier_info,
Ed Masted4612ad2014-04-20 13:17:36 +00001699 nullptr);
Greg Clayton030a2042011-10-14 21:34:45 +00001700
Greg Clayton9d3d6882011-10-31 23:51:19 +00001701 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001702 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001703 else
1704 {
1705 if (decl_ctx == translation_unit_decl)
1706 {
1707 namespace_decl = translation_unit_decl->getAnonymousNamespace();
1708 if (namespace_decl)
1709 return namespace_decl;
1710
Sean Callanan5b26f272012-02-04 08:49:35 +00001711 namespace_decl = NamespaceDecl::Create(*ast,
1712 decl_ctx,
1713 false,
1714 SourceLocation(),
1715 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001716 nullptr,
1717 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001718 translation_unit_decl->setAnonymousNamespace (namespace_decl);
1719 translation_unit_decl->addDecl (namespace_decl);
1720 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
1721 }
1722 else
1723 {
1724 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
1725 if (parent_namespace_decl)
1726 {
1727 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
1728 if (namespace_decl)
1729 return namespace_decl;
Sean Callanan5b26f272012-02-04 08:49:35 +00001730 namespace_decl = NamespaceDecl::Create(*ast,
1731 decl_ctx,
1732 false,
1733 SourceLocation(),
1734 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001735 nullptr,
1736 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001737 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
1738 parent_namespace_decl->addDecl (namespace_decl);
1739 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
1740 }
1741 else
1742 {
1743 // BAD!!!
1744 }
1745 }
1746
1747
1748 if (namespace_decl)
1749 {
1750 // If we make it here, we are creating the anonymous namespace decl
1751 // for the first time, so we need to do the using directive magic
1752 // like SEMA does
1753 UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast,
1754 decl_ctx,
1755 SourceLocation(),
1756 SourceLocation(),
1757 NestedNameSpecifierLoc(),
1758 SourceLocation(),
1759 namespace_decl,
1760 decl_ctx);
1761 using_directive_decl->setImplicit();
1762 decl_ctx->addDecl(using_directive_decl);
1763 }
1764 }
1765#ifdef LLDB_CONFIGURATION_DEBUG
1766 VerifyDecl(namespace_decl);
1767#endif
Greg Clayton030a2042011-10-14 21:34:45 +00001768 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001769}
1770
1771
1772#pragma mark Function Types
1773
1774FunctionDecl *
Greg Clayton57ee3062013-07-11 22:46:58 +00001775ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx,
1776 const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001777 const CompilerType &function_clang_type,
Greg Clayton57ee3062013-07-11 22:46:58 +00001778 int storage,
1779 bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001780{
Ed Masted4612ad2014-04-20 13:17:36 +00001781 FunctionDecl *func_decl = nullptr;
Greg Clayton147e1fa2011-10-14 22:47:18 +00001782 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001783 if (decl_ctx == nullptr)
Greg Clayton147e1fa2011-10-14 22:47:18 +00001784 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001785
Greg Clayton0d551042013-06-28 21:08:47 +00001786
1787 const bool hasWrittenPrototype = true;
1788 const bool isConstexprSpecified = false;
1789
Greg Clayton147e1fa2011-10-14 22:47:18 +00001790 if (name && name[0])
1791 {
1792 func_decl = FunctionDecl::Create (*ast,
1793 decl_ctx,
1794 SourceLocation(),
1795 SourceLocation(),
1796 DeclarationName (&ast->Idents.get(name)),
Greg Claytond8d4a572015-08-11 21:38:15 +00001797 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001798 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001799 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00001800 is_inline,
1801 hasWrittenPrototype,
1802 isConstexprSpecified);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001803 }
Greg Clayton147e1fa2011-10-14 22:47:18 +00001804 else
1805 {
1806 func_decl = FunctionDecl::Create (*ast,
1807 decl_ctx,
1808 SourceLocation(),
1809 SourceLocation(),
1810 DeclarationName (),
Greg Claytond8d4a572015-08-11 21:38:15 +00001811 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001812 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001813 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00001814 is_inline,
1815 hasWrittenPrototype,
1816 isConstexprSpecified);
Greg Clayton147e1fa2011-10-14 22:47:18 +00001817 }
1818 if (func_decl)
1819 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001820
1821#ifdef LLDB_CONFIGURATION_DEBUG
1822 VerifyDecl(func_decl);
1823#endif
1824
Greg Clayton147e1fa2011-10-14 22:47:18 +00001825 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001826}
1827
Greg Claytona1e5dc82015-08-11 22:53:00 +00001828CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001829ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001830 const CompilerType& result_type,
1831 const CompilerType *args,
Sean Callananc81256a2010-09-16 20:40:25 +00001832 unsigned num_args,
1833 bool is_variadic,
1834 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001835{
Ed Masted4612ad2014-04-20 13:17:36 +00001836 assert (ast != nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001837 std::vector<QualType> qual_type_args;
1838 for (unsigned i=0; i<num_args; ++i)
Greg Claytond8d4a572015-08-11 21:38:15 +00001839 qual_type_args.push_back (GetQualType(args[i]));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001840
1841 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00001842 FunctionProtoType::ExtProtoInfo proto_info;
1843 proto_info.Variadic = is_variadic;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00001844 proto_info.ExceptionSpec = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00001845 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00001846 proto_info.RefQualifier = RQ_None;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00001847
Greg Claytona1e5dc82015-08-11 22:53:00 +00001848 return CompilerType (ast, ast->getFunctionType (GetQualType(result_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00001849 qual_type_args,
Greg Claytond8d4a572015-08-11 21:38:15 +00001850 proto_info));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001851}
1852
1853ParmVarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00001854ClangASTContext::CreateParameterDeclaration (const char *name, const CompilerType &param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001855{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001856 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001857 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001858 return ParmVarDecl::Create(*ast,
1859 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001860 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00001861 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001862 name && name[0] ? &ast->Idents.get(name) : nullptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00001863 GetQualType(param_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001864 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001865 (clang::StorageClass)storage,
Ed Masted4612ad2014-04-20 13:17:36 +00001866 nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001867}
1868
1869void
1870ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
1871{
1872 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00001873 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001874}
1875
1876
1877#pragma mark Array Types
1878
Greg Claytona1e5dc82015-08-11 22:53:00 +00001879CompilerType
1880ClangASTContext::CreateArrayType (const CompilerType &element_type,
Greg Clayton1c8ef472013-04-05 23:27:21 +00001881 size_t element_count,
1882 bool is_vector)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001883{
Greg Clayton57ee3062013-07-11 22:46:58 +00001884 if (element_type.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001885 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001886 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001887 assert (ast != nullptr);
Greg Clayton4ef877f2012-12-06 02:33:54 +00001888
Greg Clayton1c8ef472013-04-05 23:27:21 +00001889 if (is_vector)
1890 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001891 return CompilerType (ast, ast->getExtVectorType(GetQualType(element_type), element_count));
Greg Clayton4ef877f2012-12-06 02:33:54 +00001892 }
1893 else
1894 {
Greg Clayton1c8ef472013-04-05 23:27:21 +00001895
1896 llvm::APInt ap_element_count (64, element_count);
1897 if (element_count == 0)
1898 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001899 return CompilerType (ast, ast->getIncompleteArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00001900 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00001901 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00001902 }
1903 else
1904 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001905 return CompilerType (ast, ast->getConstantArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00001906 ap_element_count,
1907 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00001908 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00001909 }
Greg Clayton4ef877f2012-12-06 02:33:54 +00001910 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001911 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001912 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001913}
1914
Greg Claytona1e5dc82015-08-11 22:53:00 +00001915CompilerType
Enrico Granata76b08d52014-10-29 23:08:02 +00001916ClangASTContext::GetOrCreateStructForIdentifier (const ConstString &type_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001917 const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields,
Enrico Granataa449e862014-10-30 00:53:28 +00001918 bool packed)
Enrico Granata76b08d52014-10-29 23:08:02 +00001919{
Greg Claytona1e5dc82015-08-11 22:53:00 +00001920 CompilerType type;
Enrico Granata76b08d52014-10-29 23:08:02 +00001921 if ((type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
1922 return type;
1923 type = CreateRecordType(nullptr, lldb::eAccessPublic, type_name.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC);
Greg Claytond8d4a572015-08-11 21:38:15 +00001924 StartTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00001925 for (const auto& field : type_fields)
Greg Claytond8d4a572015-08-11 21:38:15 +00001926 AddFieldToRecordType(type, field.first, field.second, lldb::eAccessPublic, 0);
Enrico Granataa449e862014-10-30 00:53:28 +00001927 if (packed)
Greg Claytond8d4a572015-08-11 21:38:15 +00001928 SetIsPacked(type);
1929 CompleteTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00001930 return type;
1931}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001932
1933#pragma mark Enumeration Types
1934
Greg Claytona1e5dc82015-08-11 22:53:00 +00001935CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00001936ClangASTContext::CreateEnumerationType
Greg Claytonca512b32011-01-14 04:54:56 +00001937(
Greg Claytond8d4a572015-08-11 21:38:15 +00001938 const char *name,
1939 DeclContext *decl_ctx,
1940 const Declaration &decl,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001941 const CompilerType &integer_clang_type
Greg Claytond8d4a572015-08-11 21:38:15 +00001942 )
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001943{
1944 // TODO: Do something intelligent with the Declaration object passed in
1945 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00001946 ASTContext *ast = getASTContext();
Greg Claytond8d4a572015-08-11 21:38:15 +00001947
Greg Claytone02b8502010-10-12 04:29:14 +00001948 // TODO: ask about these...
Greg Claytond8d4a572015-08-11 21:38:15 +00001949 // const bool IsScoped = false;
1950 // const bool IsFixed = false;
1951
Greg Clayton6beaaa62011-01-17 03:46:26 +00001952 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00001953 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00001954 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00001955 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001956 name && name[0] ? &ast->Idents.get(name) : nullptr,
1957 nullptr,
Sean Callanan48114472010-12-13 01:26:27 +00001958 false, // IsScoped
1959 false, // IsScopedUsingClassTag
1960 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00001961
1962
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001963 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00001964 {
1965 // TODO: check if we should be setting the promotion type too?
Greg Claytond8d4a572015-08-11 21:38:15 +00001966 enum_decl->setIntegerType(GetQualType(integer_clang_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00001967
1968 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
1969
Greg Claytona1e5dc82015-08-11 22:53:00 +00001970 return CompilerType (ast, ast->getTagDeclType(enum_decl));
Greg Clayton83ff3892010-09-12 23:17:56 +00001971 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001972 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001973}
1974
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001975// Disable this for now since I can't seem to get a nicely formatted float
1976// out of the APFloat class without just getting the float, double or quad
1977// and then using a formatted print on it which defeats the purpose. We ideally
1978// would like to get perfect string values for any kind of float semantics
1979// so we can support remote targets. The code below also requires a patch to
1980// llvm::APInt.
1981//bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00001982//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 +00001983//{
1984// uint32_t count = 0;
1985// bool is_complex = false;
1986// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
1987// {
1988// unsigned num_bytes_per_float = byte_size / count;
1989// unsigned num_bits_per_float = num_bytes_per_float * 8;
1990//
1991// float_str.clear();
1992// uint32_t i;
1993// for (i=0; i<count; i++)
1994// {
1995// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
1996// bool is_ieee = false;
1997// APFloat ap_float(ap_int, is_ieee);
1998// char s[1024];
1999// unsigned int hex_digits = 0;
2000// bool upper_case = false;
2001//
2002// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
2003// {
2004// if (i > 0)
2005// float_str.append(", ");
2006// float_str.append(s);
2007// if (i == 1 && is_complex)
2008// float_str.append(1, 'i');
2009// }
2010// }
2011// return !float_str.empty();
2012// }
2013// return false;
2014//}
2015
Greg Claytona1e5dc82015-08-11 22:53:00 +00002016CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002017ClangASTContext::GetIntTypeFromBitSize (clang::ASTContext *ast,
2018 size_t bit_size, bool is_signed)
2019{
2020 if (ast)
2021 {
2022 if (is_signed)
2023 {
2024 if (bit_size == ast->getTypeSize(ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002025 return CompilerType(ast, ast->SignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002026
2027 if (bit_size == ast->getTypeSize(ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002028 return CompilerType(ast, ast->ShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002029
2030 if (bit_size == ast->getTypeSize(ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002031 return CompilerType(ast, ast->IntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002032
2033 if (bit_size == ast->getTypeSize(ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002034 return CompilerType(ast, ast->LongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002035
2036 if (bit_size == ast->getTypeSize(ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002037 return CompilerType(ast, ast->LongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002038
2039 if (bit_size == ast->getTypeSize(ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002040 return CompilerType(ast, ast->Int128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002041 }
2042 else
2043 {
2044 if (bit_size == ast->getTypeSize(ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002045 return CompilerType(ast, ast->UnsignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002046
2047 if (bit_size == ast->getTypeSize(ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002048 return CompilerType(ast, ast->UnsignedShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002049
2050 if (bit_size == ast->getTypeSize(ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002051 return CompilerType(ast, ast->UnsignedIntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002052
2053 if (bit_size == ast->getTypeSize(ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002054 return CompilerType(ast, ast->UnsignedLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002055
2056 if (bit_size == ast->getTypeSize(ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002057 return CompilerType(ast, ast->UnsignedLongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002058
2059 if (bit_size == ast->getTypeSize(ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002060 return CompilerType(ast, ast->UnsignedInt128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002061 }
2062 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002063 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002064}
2065
Greg Claytona1e5dc82015-08-11 22:53:00 +00002066CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002067ClangASTContext::GetPointerSizedIntType (clang::ASTContext *ast, bool is_signed)
2068{
2069 if (ast)
2070 return GetIntTypeFromBitSize(ast, ast->getTypeSize(ast->VoidPtrTy), is_signed);
Greg Claytona1e5dc82015-08-11 22:53:00 +00002071 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002072}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002073
Greg Claytona1e5dc82015-08-11 22:53:00 +00002074CompilerType
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002075ClangASTContext::GetFloatTypeFromBitSize (clang::ASTContext *ast,
2076 size_t bit_size)
2077{
2078 if (ast)
2079 {
2080 if (bit_size == ast->getTypeSize(ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002081 return CompilerType(ast, ast->FloatTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002082 else if (bit_size == ast->getTypeSize(ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002083 return CompilerType(ast, ast->DoubleTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002084 else if (bit_size == ast->getTypeSize(ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002085 return CompilerType(ast, ast->LongDoubleTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002086 else if (bit_size == ast->getTypeSize(ast->HalfTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002087 return CompilerType(ast, ast->HalfTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002088 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002089 return CompilerType();
Enrico Granata86027e92012-03-24 01:11:14 +00002090}
2091
2092bool
Greg Claytona2721472011-06-25 00:44:06 +00002093ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
2094 clang::Decl *decl)
2095{
2096 if (!decl)
2097 return false;
2098
2099 ExternalASTSource *ast_source = ast->getExternalSource();
2100
2101 if (!ast_source)
2102 return false;
2103
2104 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
2105 {
Greg Clayton219cf312012-03-30 00:51:13 +00002106 if (tag_decl->isCompleteDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002107 return true;
2108
2109 if (!tag_decl->hasExternalLexicalStorage())
2110 return false;
2111
2112 ast_source->CompleteType(tag_decl);
2113
2114 return !tag_decl->getTypeForDecl()->isIncompleteType();
2115 }
2116 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
2117 {
Sean Callanan5b26f272012-02-04 08:49:35 +00002118 if (objc_interface_decl->getDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002119 return true;
2120
2121 if (!objc_interface_decl->hasExternalLexicalStorage())
2122 return false;
2123
2124 ast_source->CompleteType(objc_interface_decl);
2125
Sean Callanan5b26f272012-02-04 08:49:35 +00002126 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytona2721472011-06-25 00:44:06 +00002127 }
2128 else
2129 {
2130 return false;
2131 }
2132}
2133
Sean Callanan60217122012-04-13 00:10:03 +00002134void
Greg Claytond0029442013-03-27 01:48:02 +00002135ClangASTContext::SetMetadataAsUserID (const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002136 user_id_t user_id)
2137{
2138 ClangASTMetadata meta_data;
2139 meta_data.SetUserID (user_id);
2140 SetMetadata (object, meta_data);
2141}
2142
2143void
Sean Callanan60217122012-04-13 00:10:03 +00002144ClangASTContext::SetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002145 const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002146 ClangASTMetadata &metadata)
Sean Callanan60217122012-04-13 00:10:03 +00002147{
2148 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002149 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002150
2151 if (external_source)
2152 external_source->SetMetadata(object, metadata);
2153}
2154
Jim Ingham379397632012-10-27 02:54:13 +00002155ClangASTMetadata *
Sean Callanan60217122012-04-13 00:10:03 +00002156ClangASTContext::GetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002157 const void *object)
Sean Callanan60217122012-04-13 00:10:03 +00002158{
2159 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002160 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002161
2162 if (external_source && external_source->HasMetadata(object))
2163 return external_source->GetMetadata(object);
2164 else
Ed Masted4612ad2014-04-20 13:17:36 +00002165 return nullptr;
Sean Callanan60217122012-04-13 00:10:03 +00002166}
2167
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002168clang::DeclContext *
2169ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
2170{
Sean Callanana87bee82011-08-19 06:19:25 +00002171 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002172}
2173
2174clang::DeclContext *
2175ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
2176{
Sean Callanana87bee82011-08-19 06:19:25 +00002177 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002178}
2179
Greg Claytond8d4a572015-08-11 21:38:15 +00002180bool
2181ClangASTContext::SetTagTypeKind (clang::QualType tag_qual_type, int kind) const
2182{
2183 const clang::Type *clang_type = tag_qual_type.getTypePtr();
2184 if (clang_type)
2185 {
2186 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(clang_type);
2187 if (tag_type)
2188 {
2189 clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(tag_type->getDecl());
2190 if (tag_decl)
2191 {
2192 tag_decl->setTagKind ((clang::TagDecl::TagKind)kind);
2193 return true;
2194 }
2195 }
2196 }
2197 return false;
2198}
2199
2200
2201bool
2202ClangASTContext::SetDefaultAccessForRecordFields (clang::RecordDecl* record_decl,
2203 int default_accessibility,
2204 int *assigned_accessibilities,
2205 size_t num_assigned_accessibilities)
2206{
2207 if (record_decl)
2208 {
2209 uint32_t field_idx;
2210 clang::RecordDecl::field_iterator field, field_end;
2211 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2212 field != field_end;
2213 ++field, ++field_idx)
2214 {
2215 // If no accessibility was assigned, assign the correct one
2216 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2217 field->setAccess ((clang::AccessSpecifier)default_accessibility);
2218 }
2219 return true;
2220 }
2221 return false;
2222}
2223
2224clang::DeclContext *
Greg Clayton99558cc42015-08-24 23:46:31 +00002225ClangASTContext::GetDeclContextForType (const CompilerType& type)
2226{
2227 return GetDeclContextForType(GetQualType(type));
2228}
2229
2230clang::DeclContext *
Greg Claytond8d4a572015-08-11 21:38:15 +00002231ClangASTContext::GetDeclContextForType (clang::QualType type)
2232{
2233 if (type.isNull())
2234 return nullptr;
2235
2236 clang::QualType qual_type = type.getCanonicalType();
2237 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2238 switch (type_class)
2239 {
Greg Claytond8d4a572015-08-11 21:38:15 +00002240 case clang::Type::ObjCInterface: return llvm::cast<clang::ObjCObjectType>(qual_type.getTypePtr())->getInterface();
2241 case clang::Type::ObjCObjectPointer: return GetDeclContextForType (llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
2242 case clang::Type::Record: return llvm::cast<clang::RecordType>(qual_type)->getDecl();
2243 case clang::Type::Enum: return llvm::cast<clang::EnumType>(qual_type)->getDecl();
2244 case clang::Type::Typedef: return GetDeclContextForType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
2245 case clang::Type::Elaborated: return GetDeclContextForType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
2246 case clang::Type::Paren: return GetDeclContextForType (llvm::cast<clang::ParenType>(qual_type)->desugar());
Greg Clayton99558cc42015-08-24 23:46:31 +00002247 default:
2248 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00002249 }
2250 // No DeclContext in this type...
2251 return nullptr;
2252}
2253
2254static bool
2255GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true)
2256{
2257 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2258 switch (type_class)
2259 {
2260 case clang::Type::ConstantArray:
2261 case clang::Type::IncompleteArray:
2262 case clang::Type::VariableArray:
2263 {
2264 const clang::ArrayType *array_type = llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
2265
2266 if (array_type)
2267 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
2268 }
2269 break;
2270
2271 case clang::Type::Record:
2272 case clang::Type::Enum:
2273 {
2274 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
2275 if (tag_type)
2276 {
2277 clang::TagDecl *tag_decl = tag_type->getDecl();
2278 if (tag_decl)
2279 {
2280 if (tag_decl->isCompleteDefinition())
2281 return true;
2282
2283 if (!allow_completion)
2284 return false;
2285
2286 if (tag_decl->hasExternalLexicalStorage())
2287 {
2288 if (ast)
2289 {
2290 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2291 if (external_ast_source)
2292 {
2293 external_ast_source->CompleteType(tag_decl);
2294 return !tag_type->isIncompleteType();
2295 }
2296 }
2297 }
2298 return false;
2299 }
2300 }
2301
2302 }
2303 break;
2304
2305 case clang::Type::ObjCObject:
2306 case clang::Type::ObjCInterface:
2307 {
2308 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
2309 if (objc_class_type)
2310 {
2311 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2312 // We currently can't complete objective C types through the newly added ASTContext
2313 // because it only supports TagDecl objects right now...
2314 if (class_interface_decl)
2315 {
2316 if (class_interface_decl->getDefinition())
2317 return true;
2318
2319 if (!allow_completion)
2320 return false;
2321
2322 if (class_interface_decl->hasExternalLexicalStorage())
2323 {
2324 if (ast)
2325 {
2326 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2327 if (external_ast_source)
2328 {
2329 external_ast_source->CompleteType (class_interface_decl);
2330 return !objc_class_type->isIncompleteType();
2331 }
2332 }
2333 }
2334 return false;
2335 }
2336 }
2337 }
2338 break;
2339
2340 case clang::Type::Typedef:
2341 return GetCompleteQualType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
2342
2343 case clang::Type::Elaborated:
2344 return GetCompleteQualType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType(), allow_completion);
2345
2346 case clang::Type::Paren:
2347 return GetCompleteQualType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar(), allow_completion);
2348
2349 default:
2350 break;
2351 }
2352
2353 return true;
2354}
2355
2356static clang::ObjCIvarDecl::AccessControl
2357ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
2358{
2359 switch (access)
2360 {
2361 case eAccessNone: return clang::ObjCIvarDecl::None;
2362 case eAccessPublic: return clang::ObjCIvarDecl::Public;
2363 case eAccessPrivate: return clang::ObjCIvarDecl::Private;
2364 case eAccessProtected: return clang::ObjCIvarDecl::Protected;
2365 case eAccessPackage: return clang::ObjCIvarDecl::Package;
2366 }
2367 return clang::ObjCIvarDecl::None;
2368}
2369
2370
2371//----------------------------------------------------------------------
2372// Tests
2373//----------------------------------------------------------------------
2374
2375bool
2376ClangASTContext::IsAggregateType (void* type)
2377{
2378 clang::QualType qual_type (GetCanonicalQualType(type));
2379
2380 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2381 switch (type_class)
2382 {
2383 case clang::Type::IncompleteArray:
2384 case clang::Type::VariableArray:
2385 case clang::Type::ConstantArray:
2386 case clang::Type::ExtVector:
2387 case clang::Type::Vector:
2388 case clang::Type::Record:
2389 case clang::Type::ObjCObject:
2390 case clang::Type::ObjCInterface:
2391 return true;
2392 case clang::Type::Elaborated:
2393 return IsAggregateType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2394 case clang::Type::Typedef:
2395 return IsAggregateType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2396 case clang::Type::Paren:
2397 return IsAggregateType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2398 default:
2399 break;
2400 }
2401 // The clang type does have a value
2402 return false;
2403}
2404
2405bool
2406ClangASTContext::IsArrayType (void* type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002407 CompilerType *element_type_ptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00002408 uint64_t *size,
2409 bool *is_incomplete)
2410{
2411 clang::QualType qual_type (GetCanonicalQualType(type));
2412
2413 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2414 switch (type_class)
2415 {
2416 default:
2417 break;
2418
2419 case clang::Type::ConstantArray:
2420 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002421 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::ConstantArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002422 if (size)
2423 *size = llvm::cast<clang::ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
2424 return true;
2425
2426 case clang::Type::IncompleteArray:
2427 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002428 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::IncompleteArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002429 if (size)
2430 *size = 0;
2431 if (is_incomplete)
2432 *is_incomplete = true;
2433 return true;
2434
2435 case clang::Type::VariableArray:
2436 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002437 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::VariableArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002438 if (size)
2439 *size = 0;
2440 return true;
2441
2442 case clang::Type::DependentSizedArray:
2443 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002444 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::DependentSizedArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002445 if (size)
2446 *size = 0;
2447 return true;
2448
2449 case clang::Type::Typedef:
2450 return IsArrayType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2451 element_type_ptr,
2452 size,
2453 is_incomplete);
2454 case clang::Type::Elaborated:
2455 return IsArrayType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2456 element_type_ptr,
2457 size,
2458 is_incomplete);
2459 case clang::Type::Paren:
2460 return IsArrayType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
2461 element_type_ptr,
2462 size,
2463 is_incomplete);
2464 }
2465 if (element_type_ptr)
2466 element_type_ptr->Clear();
2467 if (size)
2468 *size = 0;
2469 if (is_incomplete)
2470 *is_incomplete = false;
2471 return 0;
2472}
2473
2474bool
2475ClangASTContext::IsVectorType (void* type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002476 CompilerType *element_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00002477 uint64_t *size)
2478{
2479 clang::QualType qual_type (GetCanonicalQualType(type));
2480
2481 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2482 switch (type_class)
2483 {
2484 case clang::Type::Vector:
2485 {
2486 const clang::VectorType *vector_type = qual_type->getAs<clang::VectorType>();
2487 if (vector_type)
2488 {
2489 if (size)
2490 *size = vector_type->getNumElements();
2491 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002492 *element_type = CompilerType(getASTContext(), vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002493 }
2494 return true;
2495 }
2496 break;
2497 case clang::Type::ExtVector:
2498 {
2499 const clang::ExtVectorType *ext_vector_type = qual_type->getAs<clang::ExtVectorType>();
2500 if (ext_vector_type)
2501 {
2502 if (size)
2503 *size = ext_vector_type->getNumElements();
2504 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002505 *element_type = CompilerType(getASTContext(), ext_vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002506 }
2507 return true;
2508 }
2509 default:
2510 break;
2511 }
2512 return false;
2513}
2514
2515bool
2516ClangASTContext::IsRuntimeGeneratedType (void* type)
2517{
2518 clang::DeclContext* decl_ctx = ClangASTContext::GetASTContext(getASTContext())->GetDeclContextForType(GetQualType(type));
2519 if (!decl_ctx)
2520 return false;
2521
2522 if (!llvm::isa<clang::ObjCInterfaceDecl>(decl_ctx))
2523 return false;
2524
2525 clang::ObjCInterfaceDecl *result_iface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
2526
2527 ClangASTMetadata* ast_metadata = ClangASTContext::GetMetadata(getASTContext(), result_iface_decl);
2528 if (!ast_metadata)
2529 return false;
2530 return (ast_metadata->GetISAPtr() != 0);
2531}
2532
2533bool
2534ClangASTContext::IsCharType (void* type)
2535{
2536 return GetQualType(type).getUnqualifiedType()->isCharType();
2537}
2538
2539
2540bool
2541ClangASTContext::IsCompleteType (void* type)
2542{
2543 const bool allow_completion = false;
2544 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
2545}
2546
2547bool
2548ClangASTContext::IsConst(void* type)
2549{
2550 return GetQualType(type).isConstQualified();
2551}
2552
2553bool
2554ClangASTContext::IsCStringType (void* type, uint32_t &length)
2555{
Greg Claytona1e5dc82015-08-11 22:53:00 +00002556 CompilerType pointee_or_element_clang_type;
Greg Claytond8d4a572015-08-11 21:38:15 +00002557 length = 0;
2558 Flags type_flags (GetTypeInfo (type, &pointee_or_element_clang_type));
2559
2560 if (!pointee_or_element_clang_type.IsValid())
2561 return false;
2562
2563 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
2564 {
2565 if (pointee_or_element_clang_type.IsCharType())
2566 {
2567 if (type_flags.Test (eTypeIsArray))
2568 {
2569 // We know the size of the array and it could be a C string
2570 // since it is an array of characters
2571 length = llvm::cast<clang::ConstantArrayType>(GetCanonicalQualType(type).getTypePtr())->getSize().getLimitedValue();
2572 }
2573 return true;
2574
2575 }
2576 }
2577 return false;
2578}
2579
2580bool
2581ClangASTContext::IsFunctionType (void* type, bool *is_variadic_ptr)
2582{
2583 if (type)
2584 {
2585 clang::QualType qual_type (GetCanonicalQualType(type));
2586
2587 if (qual_type->isFunctionType())
2588 {
2589 if (is_variadic_ptr)
2590 {
2591 const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2592 if (function_proto_type)
2593 *is_variadic_ptr = function_proto_type->isVariadic();
2594 else
2595 *is_variadic_ptr = false;
2596 }
2597 return true;
2598 }
2599
2600 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2601 switch (type_class)
2602 {
2603 default:
2604 break;
2605 case clang::Type::Typedef:
2606 return IsFunctionType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), nullptr);
2607 case clang::Type::Elaborated:
2608 return IsFunctionType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), nullptr);
2609 case clang::Type::Paren:
2610 return IsFunctionType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), nullptr);
2611 case clang::Type::LValueReference:
2612 case clang::Type::RValueReference:
2613 {
2614 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2615 if (reference_type)
2616 return IsFunctionType(reference_type->getPointeeType().getAsOpaquePtr(), nullptr);
2617 }
2618 break;
2619 }
2620 }
2621 return false;
2622}
2623
2624// Used to detect "Homogeneous Floating-point Aggregates"
2625uint32_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00002626ClangASTContext::IsHomogeneousAggregate (void* type, CompilerType* base_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00002627{
2628 if (!type)
2629 return 0;
2630
2631 clang::QualType qual_type(GetCanonicalQualType(type));
2632 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2633 switch (type_class)
2634 {
2635 case clang::Type::Record:
2636 if (GetCompleteType (type))
2637 {
2638 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2639 if (cxx_record_decl)
2640 {
2641 if (cxx_record_decl->getNumBases() ||
2642 cxx_record_decl->isDynamicClass())
2643 return 0;
2644 }
2645 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
2646 if (record_type)
2647 {
2648 const clang::RecordDecl *record_decl = record_type->getDecl();
2649 if (record_decl)
2650 {
2651 // We are looking for a structure that contains only floating point types
2652 clang::RecordDecl::field_iterator field_pos, field_end = record_decl->field_end();
2653 uint32_t num_fields = 0;
2654 bool is_hva = false;
2655 bool is_hfa = false;
2656 clang::QualType base_qual_type;
2657 for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos)
2658 {
2659 clang::QualType field_qual_type = field_pos->getType();
2660 if (field_qual_type->isFloatingType())
2661 {
2662 if (field_qual_type->isComplexType())
2663 return 0;
2664 else
2665 {
2666 if (num_fields == 0)
2667 base_qual_type = field_qual_type;
2668 else
2669 {
2670 if (is_hva)
2671 return 0;
2672 is_hfa = true;
2673 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
2674 return 0;
2675 }
2676 }
2677 }
2678 else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType())
2679 {
2680 const clang::VectorType *array = field_qual_type.getTypePtr()->getAs<clang::VectorType>();
2681 if (array && array->getNumElements() <= 4)
2682 {
2683 if (num_fields == 0)
2684 base_qual_type = array->getElementType();
2685 else
2686 {
2687 if (is_hfa)
2688 return 0;
2689 is_hva = true;
2690 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
2691 return 0;
2692 }
2693 }
2694 else
2695 return 0;
2696 }
2697 else
2698 return 0;
2699 ++num_fields;
2700 }
2701 if (base_type_ptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002702 *base_type_ptr = CompilerType (getASTContext(), base_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00002703 return num_fields;
2704 }
2705 }
2706 }
2707 break;
2708
2709 case clang::Type::Typedef:
2710 return IsHomogeneousAggregate(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), base_type_ptr);
2711
2712 case clang::Type::Elaborated:
2713 return IsHomogeneousAggregate(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), base_type_ptr);
2714 default:
2715 break;
2716 }
2717 return 0;
2718}
2719
2720size_t
2721ClangASTContext::GetNumberOfFunctionArguments (void* type)
2722{
2723 if (type)
2724 {
2725 clang::QualType qual_type (GetCanonicalQualType(type));
2726 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2727 if (func)
2728 return func->getNumParams();
2729 }
2730 return 0;
2731}
2732
Greg Claytona1e5dc82015-08-11 22:53:00 +00002733CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00002734ClangASTContext::GetFunctionArgumentAtIndex (void* type, const size_t index)
2735{
2736 if (type)
2737 {
2738 clang::QualType qual_type (GetCanonicalQualType(type));
2739 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2740 if (func)
2741 {
2742 if (index < func->getNumParams())
Greg Claytona1e5dc82015-08-11 22:53:00 +00002743 return CompilerType(getASTContext(), func->getParamType(index));
Greg Claytond8d4a572015-08-11 21:38:15 +00002744 }
2745 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002746 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00002747}
2748
2749bool
2750ClangASTContext::IsFunctionPointerType (void* type)
2751{
2752 if (type)
2753 {
2754 clang::QualType qual_type (GetCanonicalQualType(type));
2755
2756 if (qual_type->isFunctionPointerType())
2757 return true;
2758
2759 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2760 switch (type_class)
2761 {
2762 default:
2763 break;
2764 case clang::Type::Typedef:
2765 return IsFunctionPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2766 case clang::Type::Elaborated:
2767 return IsFunctionPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2768 case clang::Type::Paren:
2769 return IsFunctionPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2770
2771 case clang::Type::LValueReference:
2772 case clang::Type::RValueReference:
2773 {
2774 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2775 if (reference_type)
2776 return IsFunctionPointerType(reference_type->getPointeeType().getAsOpaquePtr());
2777 }
2778 break;
2779 }
2780 }
2781 return false;
2782
2783}
2784
2785bool
2786ClangASTContext::IsIntegerType (void* type, bool &is_signed)
2787{
2788 if (!type)
2789 return false;
2790
2791 clang::QualType qual_type (GetCanonicalQualType(type));
2792 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
2793
2794 if (builtin_type)
2795 {
2796 if (builtin_type->isInteger())
2797 {
2798 is_signed = builtin_type->isSignedInteger();
2799 return true;
2800 }
2801 }
2802
2803 return false;
2804}
2805
2806bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00002807ClangASTContext::IsPointerType (void* type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002808{
2809 if (type)
2810 {
2811 clang::QualType qual_type (GetCanonicalQualType(type));
2812 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2813 switch (type_class)
2814 {
2815 case clang::Type::Builtin:
2816 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
2817 {
2818 default:
2819 break;
2820 case clang::BuiltinType::ObjCId:
2821 case clang::BuiltinType::ObjCClass:
2822 return true;
2823 }
2824 return false;
2825 case clang::Type::ObjCObjectPointer:
2826 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002827 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002828 return true;
2829 case clang::Type::BlockPointer:
2830 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002831 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002832 return true;
2833 case clang::Type::Pointer:
2834 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002835 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002836 return true;
2837 case clang::Type::MemberPointer:
2838 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002839 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002840 return true;
2841 case clang::Type::Typedef:
2842 return IsPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
2843 case clang::Type::Elaborated:
2844 return IsPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
2845 case clang::Type::Paren:
2846 return IsPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
2847 default:
2848 break;
2849 }
2850 }
2851 if (pointee_type)
2852 pointee_type->Clear();
2853 return false;
2854}
2855
2856
2857bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00002858ClangASTContext::IsPointerOrReferenceType (void* type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002859{
2860 if (type)
2861 {
2862 clang::QualType qual_type (GetCanonicalQualType(type));
2863 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2864 switch (type_class)
2865 {
2866 case clang::Type::Builtin:
2867 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
2868 {
2869 default:
2870 break;
2871 case clang::BuiltinType::ObjCId:
2872 case clang::BuiltinType::ObjCClass:
2873 return true;
2874 }
2875 return false;
2876 case clang::Type::ObjCObjectPointer:
2877 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002878 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002879 return true;
2880 case clang::Type::BlockPointer:
2881 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002882 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002883 return true;
2884 case clang::Type::Pointer:
2885 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002886 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002887 return true;
2888 case clang::Type::MemberPointer:
2889 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002890 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002891 return true;
2892 case clang::Type::LValueReference:
2893 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002894 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00002895 return true;
2896 case clang::Type::RValueReference:
2897 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002898 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00002899 return true;
2900 case clang::Type::Typedef:
2901 return IsPointerOrReferenceType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
2902 case clang::Type::Elaborated:
2903 return IsPointerOrReferenceType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
2904 case clang::Type::Paren:
2905 return IsPointerOrReferenceType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
2906 default:
2907 break;
2908 }
2909 }
2910 if (pointee_type)
2911 pointee_type->Clear();
2912 return false;
2913}
2914
2915
2916bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00002917ClangASTContext::IsReferenceType (void* type, CompilerType *pointee_type, bool* is_rvalue)
Greg Claytond8d4a572015-08-11 21:38:15 +00002918{
2919 if (type)
2920 {
2921 clang::QualType qual_type (GetCanonicalQualType(type));
2922 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2923
2924 switch (type_class)
2925 {
2926 case clang::Type::LValueReference:
2927 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002928 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00002929 if (is_rvalue)
2930 *is_rvalue = false;
2931 return true;
2932 case clang::Type::RValueReference:
2933 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002934 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00002935 if (is_rvalue)
2936 *is_rvalue = true;
2937 return true;
2938 case clang::Type::Typedef:
2939 return IsReferenceType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type, is_rvalue);
2940 case clang::Type::Elaborated:
2941 return IsReferenceType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type, is_rvalue);
2942 case clang::Type::Paren:
2943 return IsReferenceType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type, is_rvalue);
2944
2945 default:
2946 break;
2947 }
2948 }
2949 if (pointee_type)
2950 pointee_type->Clear();
2951 return false;
2952}
2953
2954bool
2955ClangASTContext::IsFloatingPointType (void* type, uint32_t &count, bool &is_complex)
2956{
2957 if (type)
2958 {
2959 clang::QualType qual_type (GetCanonicalQualType(type));
2960
2961 if (const clang::BuiltinType *BT = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal()))
2962 {
2963 clang::BuiltinType::Kind kind = BT->getKind();
2964 if (kind >= clang::BuiltinType::Float && kind <= clang::BuiltinType::LongDouble)
2965 {
2966 count = 1;
2967 is_complex = false;
2968 return true;
2969 }
2970 }
2971 else if (const clang::ComplexType *CT = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal()))
2972 {
2973 if (IsFloatingPointType (CT->getElementType().getAsOpaquePtr(), count, is_complex))
2974 {
2975 count = 2;
2976 is_complex = true;
2977 return true;
2978 }
2979 }
2980 else if (const clang::VectorType *VT = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal()))
2981 {
2982 if (IsFloatingPointType (VT->getElementType().getAsOpaquePtr(), count, is_complex))
2983 {
2984 count = VT->getNumElements();
2985 is_complex = false;
2986 return true;
2987 }
2988 }
2989 }
2990 count = 0;
2991 is_complex = false;
2992 return false;
2993}
2994
2995
2996bool
2997ClangASTContext::IsDefined(void* type)
2998{
2999 if (!type)
3000 return false;
3001
3002 clang::QualType qual_type(GetQualType(type));
3003 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
3004 if (tag_type)
3005 {
3006 clang::TagDecl *tag_decl = tag_type->getDecl();
3007 if (tag_decl)
3008 return tag_decl->isCompleteDefinition();
3009 return false;
3010 }
3011 else
3012 {
3013 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3014 if (objc_class_type)
3015 {
3016 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3017 if (class_interface_decl)
3018 return class_interface_decl->getDefinition() != nullptr;
3019 return false;
3020 }
3021 }
3022 return true;
3023}
3024
3025bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003026ClangASTContext::IsObjCClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003027{
3028 if (type)
3029 {
3030 clang::QualType qual_type (GetCanonicalQualType(type));
3031
3032 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3033
3034 if (obj_pointer_type)
3035 return obj_pointer_type->isObjCClassType();
3036 }
3037 return false;
3038}
3039
3040bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003041ClangASTContext::IsObjCObjectOrInterfaceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003042{
3043 if (type)
3044 return GetCanonicalQualType(type)->isObjCObjectOrInterfaceType();
3045 return false;
3046}
3047
3048bool
3049ClangASTContext::IsPolymorphicClass (void* type)
3050{
3051 if (type)
3052 {
3053 clang::QualType qual_type(GetCanonicalQualType(type));
3054 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3055 switch (type_class)
3056 {
3057 case clang::Type::Record:
3058 if (GetCompleteType(type))
3059 {
3060 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3061 const clang::RecordDecl *record_decl = record_type->getDecl();
3062 if (record_decl)
3063 {
3064 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3065 if (cxx_record_decl)
3066 return cxx_record_decl->isPolymorphic();
3067 }
3068 }
3069 break;
3070
3071 default:
3072 break;
3073 }
3074 }
3075 return false;
3076}
3077
3078bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003079ClangASTContext::IsPossibleDynamicType (void* type, CompilerType *dynamic_pointee_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00003080 bool check_cplusplus,
3081 bool check_objc)
3082{
3083 clang::QualType pointee_qual_type;
3084 if (type)
3085 {
3086 clang::QualType qual_type (GetCanonicalQualType(type));
3087 bool success = false;
3088 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3089 switch (type_class)
3090 {
3091 case clang::Type::Builtin:
3092 if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
3093 {
3094 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003095 dynamic_pointee_type->SetCompilerType(this, type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003096 return true;
3097 }
3098 break;
3099
3100 case clang::Type::ObjCObjectPointer:
3101 if (check_objc)
3102 {
3103 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003104 dynamic_pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003105 return true;
3106 }
3107 break;
3108
3109 case clang::Type::Pointer:
3110 pointee_qual_type = llvm::cast<clang::PointerType>(qual_type)->getPointeeType();
3111 success = true;
3112 break;
3113
3114 case clang::Type::LValueReference:
3115 case clang::Type::RValueReference:
3116 pointee_qual_type = llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType();
3117 success = true;
3118 break;
3119
3120 case clang::Type::Typedef:
3121 return IsPossibleDynamicType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3122 dynamic_pointee_type,
3123 check_cplusplus,
3124 check_objc);
3125
3126 case clang::Type::Elaborated:
3127 return IsPossibleDynamicType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3128 dynamic_pointee_type,
3129 check_cplusplus,
3130 check_objc);
3131
3132 case clang::Type::Paren:
3133 return IsPossibleDynamicType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
3134 dynamic_pointee_type,
3135 check_cplusplus,
3136 check_objc);
3137 default:
3138 break;
3139 }
3140
3141 if (success)
3142 {
3143 // Check to make sure what we are pointing too is a possible dynamic C++ type
3144 // We currently accept any "void *" (in case we have a class that has been
3145 // watered down to an opaque pointer) and virtual C++ classes.
3146 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
3147 switch (pointee_type_class)
3148 {
3149 case clang::Type::Builtin:
3150 switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind())
3151 {
3152 case clang::BuiltinType::UnknownAny:
3153 case clang::BuiltinType::Void:
3154 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003155 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003156 return true;
3157
3158 case clang::BuiltinType::NullPtr:
3159 case clang::BuiltinType::Bool:
3160 case clang::BuiltinType::Char_U:
3161 case clang::BuiltinType::UChar:
3162 case clang::BuiltinType::WChar_U:
3163 case clang::BuiltinType::Char16:
3164 case clang::BuiltinType::Char32:
3165 case clang::BuiltinType::UShort:
3166 case clang::BuiltinType::UInt:
3167 case clang::BuiltinType::ULong:
3168 case clang::BuiltinType::ULongLong:
3169 case clang::BuiltinType::UInt128:
3170 case clang::BuiltinType::Char_S:
3171 case clang::BuiltinType::SChar:
3172 case clang::BuiltinType::WChar_S:
3173 case clang::BuiltinType::Short:
3174 case clang::BuiltinType::Int:
3175 case clang::BuiltinType::Long:
3176 case clang::BuiltinType::LongLong:
3177 case clang::BuiltinType::Int128:
3178 case clang::BuiltinType::Float:
3179 case clang::BuiltinType::Double:
3180 case clang::BuiltinType::LongDouble:
3181 case clang::BuiltinType::Dependent:
3182 case clang::BuiltinType::Overload:
3183 case clang::BuiltinType::ObjCId:
3184 case clang::BuiltinType::ObjCClass:
3185 case clang::BuiltinType::ObjCSel:
3186 case clang::BuiltinType::BoundMember:
3187 case clang::BuiltinType::Half:
3188 case clang::BuiltinType::ARCUnbridgedCast:
3189 case clang::BuiltinType::PseudoObject:
3190 case clang::BuiltinType::BuiltinFn:
3191 case clang::BuiltinType::OCLEvent:
3192 case clang::BuiltinType::OCLImage1d:
3193 case clang::BuiltinType::OCLImage1dArray:
3194 case clang::BuiltinType::OCLImage1dBuffer:
3195 case clang::BuiltinType::OCLImage2d:
3196 case clang::BuiltinType::OCLImage2dArray:
3197 case clang::BuiltinType::OCLImage3d:
3198 case clang::BuiltinType::OCLSampler:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00003199 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00003200 break;
3201 }
3202 break;
3203
3204 case clang::Type::Record:
3205 if (check_cplusplus)
3206 {
3207 clang::CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
3208 if (cxx_record_decl)
3209 {
3210 bool is_complete = cxx_record_decl->isCompleteDefinition();
3211
3212 if (is_complete)
3213 success = cxx_record_decl->isDynamicClass();
3214 else
3215 {
3216 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), cxx_record_decl);
3217 if (metadata)
3218 success = metadata->GetIsDynamicCXXType();
3219 else
3220 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00003221 is_complete = CompilerType(getASTContext(), pointee_qual_type).GetCompleteType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003222 if (is_complete)
3223 success = cxx_record_decl->isDynamicClass();
3224 else
3225 success = false;
3226 }
3227 }
3228
3229 if (success)
3230 {
3231 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003232 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003233 return true;
3234 }
3235 }
3236 }
3237 break;
3238
3239 case clang::Type::ObjCObject:
3240 case clang::Type::ObjCInterface:
3241 if (check_objc)
3242 {
3243 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003244 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003245 return true;
3246 }
3247 break;
3248
3249 default:
3250 break;
3251 }
3252 }
3253 }
3254 if (dynamic_pointee_type)
3255 dynamic_pointee_type->Clear();
3256 return false;
3257}
3258
3259
3260bool
3261ClangASTContext::IsScalarType (void* type)
3262{
3263 if (!type)
3264 return false;
3265
3266 return (GetTypeInfo (type, nullptr) & eTypeIsScalar) != 0;
3267}
3268
3269bool
3270ClangASTContext::IsTypedefType (void* type)
3271{
3272 if (!type)
3273 return false;
3274 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
3275}
3276
3277bool
3278ClangASTContext::IsVoidType (void* type)
3279{
3280 if (!type)
3281 return false;
3282 return GetCanonicalQualType(type)->isVoidType();
3283}
3284
3285bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003286ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003287{
3288 if (type)
3289 {
3290 clang::QualType qual_type (GetCanonicalQualType(type));
3291
3292 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3293 if (cxx_record_decl)
3294 {
3295 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
3296 return true;
3297 }
3298 }
3299 class_name.clear();
3300 return false;
3301}
3302
3303
3304bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003305ClangASTContext::IsCXXClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003306{
3307 if (!type)
3308 return false;
3309
3310 clang::QualType qual_type (GetCanonicalQualType(type));
3311 if (qual_type->getAsCXXRecordDecl() != nullptr)
3312 return true;
3313 return false;
3314}
3315
3316bool
3317ClangASTContext::IsBeingDefined (void* type)
3318{
3319 if (!type)
3320 return false;
3321 clang::QualType qual_type (GetCanonicalQualType(type));
3322 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
3323 if (tag_type)
3324 return tag_type->isBeingDefined();
3325 return false;
3326}
3327
3328bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003329ClangASTContext::IsObjCObjectPointerType (const CompilerType& type, CompilerType *class_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003330{
3331 if (!type)
3332 return false;
3333
3334 clang::QualType qual_type (GetCanonicalQualType(type));
3335
3336 if (qual_type->isObjCObjectPointerType())
3337 {
3338 if (class_type_ptr)
3339 {
3340 if (!qual_type->isObjCClassType() &&
3341 !qual_type->isObjCIdType())
3342 {
3343 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3344 if (obj_pointer_type == nullptr)
3345 class_type_ptr->Clear();
3346 else
Greg Clayton99558cc42015-08-24 23:46:31 +00003347 class_type_ptr->SetCompilerType (type.GetTypeSystem(), clang::QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003348 }
3349 }
3350 return true;
3351 }
3352 if (class_type_ptr)
3353 class_type_ptr->Clear();
3354 return false;
3355}
3356
3357bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003358ClangASTContext::GetObjCClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003359{
3360 if (!type)
3361 return false;
3362
3363 clang::QualType qual_type (GetCanonicalQualType(type));
3364
3365 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3366 if (object_type)
3367 {
3368 const clang::ObjCInterfaceDecl *interface = object_type->getInterface();
3369 if (interface)
3370 {
3371 class_name = interface->getNameAsString();
3372 return true;
3373 }
3374 }
3375 return false;
3376}
3377
3378
3379//----------------------------------------------------------------------
3380// Type Completion
3381//----------------------------------------------------------------------
3382
3383bool
3384ClangASTContext::GetCompleteType (void* type)
3385{
3386 if (!type)
3387 return false;
3388 const bool allow_completion = true;
3389 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
3390}
3391
3392ConstString
3393ClangASTContext::GetTypeName (void* type)
3394{
3395 std::string type_name;
3396 if (type)
3397 {
3398 clang::PrintingPolicy printing_policy (getASTContext()->getPrintingPolicy());
3399 clang::QualType qual_type(GetQualType(type));
3400 printing_policy.SuppressTagKeyword = true;
3401 printing_policy.LangOpts.WChar = true;
3402 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
3403 if (typedef_type)
3404 {
3405 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
3406 type_name = typedef_decl->getQualifiedNameAsString();
3407 }
3408 else
3409 {
3410 type_name = qual_type.getAsString(printing_policy);
3411 }
3412 }
3413 return ConstString(type_name);
3414}
3415
3416uint32_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00003417ClangASTContext::GetTypeInfo (void* type, CompilerType *pointee_or_element_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003418{
3419 if (!type)
3420 return 0;
3421
3422 if (pointee_or_element_clang_type)
3423 pointee_or_element_clang_type->Clear();
3424
3425 clang::QualType qual_type (GetQualType(type));
3426
3427 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3428 switch (type_class)
3429 {
3430 case clang::Type::Builtin:
3431 {
3432 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3433
3434 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
3435 switch (builtin_type->getKind())
3436 {
3437 case clang::BuiltinType::ObjCId:
3438 case clang::BuiltinType::ObjCClass:
3439 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003440 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003441 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3442 break;
3443
3444 case clang::BuiltinType::ObjCSel:
3445 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003446 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->CharTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003447 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3448 break;
3449
3450 case clang::BuiltinType::Bool:
3451 case clang::BuiltinType::Char_U:
3452 case clang::BuiltinType::UChar:
3453 case clang::BuiltinType::WChar_U:
3454 case clang::BuiltinType::Char16:
3455 case clang::BuiltinType::Char32:
3456 case clang::BuiltinType::UShort:
3457 case clang::BuiltinType::UInt:
3458 case clang::BuiltinType::ULong:
3459 case clang::BuiltinType::ULongLong:
3460 case clang::BuiltinType::UInt128:
3461 case clang::BuiltinType::Char_S:
3462 case clang::BuiltinType::SChar:
3463 case clang::BuiltinType::WChar_S:
3464 case clang::BuiltinType::Short:
3465 case clang::BuiltinType::Int:
3466 case clang::BuiltinType::Long:
3467 case clang::BuiltinType::LongLong:
3468 case clang::BuiltinType::Int128:
3469 case clang::BuiltinType::Float:
3470 case clang::BuiltinType::Double:
3471 case clang::BuiltinType::LongDouble:
3472 builtin_type_flags |= eTypeIsScalar;
3473 if (builtin_type->isInteger())
3474 {
3475 builtin_type_flags |= eTypeIsInteger;
3476 if (builtin_type->isSignedInteger())
3477 builtin_type_flags |= eTypeIsSigned;
3478 }
3479 else if (builtin_type->isFloatingPoint())
3480 builtin_type_flags |= eTypeIsFloat;
3481 break;
3482 default:
3483 break;
3484 }
3485 return builtin_type_flags;
3486 }
3487
3488 case clang::Type::BlockPointer:
3489 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003490 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003491 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3492
3493 case clang::Type::Complex:
3494 {
3495 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3496 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal());
3497 if (complex_type)
3498 {
3499 clang::QualType complex_element_type (complex_type->getElementType());
3500 if (complex_element_type->isIntegerType())
3501 complex_type_flags |= eTypeIsFloat;
3502 else if (complex_element_type->isFloatingType())
3503 complex_type_flags |= eTypeIsInteger;
3504 }
3505 return complex_type_flags;
3506 }
3507 break;
3508
3509 case clang::Type::ConstantArray:
3510 case clang::Type::DependentSizedArray:
3511 case clang::Type::IncompleteArray:
3512 case clang::Type::VariableArray:
3513 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003514 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ArrayType>(qual_type.getTypePtr())->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003515 return eTypeHasChildren | eTypeIsArray;
3516
3517 case clang::Type::DependentName: return 0;
3518 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
3519 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
3520 case clang::Type::Decltype: return 0;
3521
3522 case clang::Type::Enum:
3523 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003524 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::EnumType>(qual_type)->getDecl()->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003525 return eTypeIsEnumeration | eTypeHasValue;
3526
3527 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003528 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003529 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003530 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003531
3532 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
3533 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
3534 case clang::Type::InjectedClassName: return 0;
3535
3536 case clang::Type::LValueReference:
3537 case clang::Type::RValueReference:
3538 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003539 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003540 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3541
3542 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
3543
3544 case clang::Type::ObjCObjectPointer:
3545 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003546 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003547 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
3548
3549 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3550 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3551
3552 case clang::Type::Pointer:
3553 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003554 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003555 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3556
3557 case clang::Type::Record:
3558 if (qual_type->getAsCXXRecordDecl())
3559 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3560 else
3561 return eTypeHasChildren | eTypeIsStructUnion;
3562 break;
3563 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
3564 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
3565 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
3566
3567 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003568 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 +00003569 case clang::Type::TypeOfExpr: return 0;
3570 case clang::Type::TypeOf: return 0;
3571 case clang::Type::UnresolvedUsing: return 0;
3572
3573 case clang::Type::ExtVector:
3574 case clang::Type::Vector:
3575 {
3576 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
3577 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal());
3578 if (vector_type)
3579 {
3580 if (vector_type->isIntegerType())
3581 vector_type_flags |= eTypeIsFloat;
3582 else if (vector_type->isFloatingType())
3583 vector_type_flags |= eTypeIsInteger;
3584 }
3585 return vector_type_flags;
3586 }
3587 default: return 0;
3588 }
3589 return 0;
3590}
3591
3592
3593
3594lldb::LanguageType
3595ClangASTContext::GetMinimumLanguage (void* type)
3596{
3597 if (!type)
3598 return lldb::eLanguageTypeC;
3599
3600 // If the type is a reference, then resolve it to what it refers to first:
3601 clang::QualType qual_type (GetCanonicalQualType(type).getNonReferenceType());
3602 if (qual_type->isAnyPointerType())
3603 {
3604 if (qual_type->isObjCObjectPointerType())
3605 return lldb::eLanguageTypeObjC;
3606
3607 clang::QualType pointee_type (qual_type->getPointeeType());
3608 if (pointee_type->getPointeeCXXRecordDecl() != nullptr)
3609 return lldb::eLanguageTypeC_plus_plus;
3610 if (pointee_type->isObjCObjectOrInterfaceType())
3611 return lldb::eLanguageTypeObjC;
3612 if (pointee_type->isObjCClassType())
3613 return lldb::eLanguageTypeObjC;
3614 if (pointee_type.getTypePtr() == getASTContext()->ObjCBuiltinIdTy.getTypePtr())
3615 return lldb::eLanguageTypeObjC;
3616 }
3617 else
3618 {
3619 if (qual_type->isObjCObjectOrInterfaceType())
3620 return lldb::eLanguageTypeObjC;
3621 if (qual_type->getAsCXXRecordDecl())
3622 return lldb::eLanguageTypeC_plus_plus;
3623 switch (qual_type->getTypeClass())
3624 {
3625 default:
3626 break;
3627 case clang::Type::Builtin:
3628 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3629 {
3630 default:
3631 case clang::BuiltinType::Void:
3632 case clang::BuiltinType::Bool:
3633 case clang::BuiltinType::Char_U:
3634 case clang::BuiltinType::UChar:
3635 case clang::BuiltinType::WChar_U:
3636 case clang::BuiltinType::Char16:
3637 case clang::BuiltinType::Char32:
3638 case clang::BuiltinType::UShort:
3639 case clang::BuiltinType::UInt:
3640 case clang::BuiltinType::ULong:
3641 case clang::BuiltinType::ULongLong:
3642 case clang::BuiltinType::UInt128:
3643 case clang::BuiltinType::Char_S:
3644 case clang::BuiltinType::SChar:
3645 case clang::BuiltinType::WChar_S:
3646 case clang::BuiltinType::Short:
3647 case clang::BuiltinType::Int:
3648 case clang::BuiltinType::Long:
3649 case clang::BuiltinType::LongLong:
3650 case clang::BuiltinType::Int128:
3651 case clang::BuiltinType::Float:
3652 case clang::BuiltinType::Double:
3653 case clang::BuiltinType::LongDouble:
3654 break;
3655
3656 case clang::BuiltinType::NullPtr:
3657 return eLanguageTypeC_plus_plus;
3658
3659 case clang::BuiltinType::ObjCId:
3660 case clang::BuiltinType::ObjCClass:
3661 case clang::BuiltinType::ObjCSel:
3662 return eLanguageTypeObjC;
3663
3664 case clang::BuiltinType::Dependent:
3665 case clang::BuiltinType::Overload:
3666 case clang::BuiltinType::BoundMember:
3667 case clang::BuiltinType::UnknownAny:
3668 break;
3669 }
3670 break;
3671 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003672 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
Greg Claytond8d4a572015-08-11 21:38:15 +00003673 }
3674 }
3675 return lldb::eLanguageTypeC;
3676}
3677
3678lldb::TypeClass
3679ClangASTContext::GetTypeClass (void* type)
3680{
3681 if (!type)
3682 return lldb::eTypeClassInvalid;
3683
3684 clang::QualType qual_type(GetQualType(type));
3685
3686 switch (qual_type->getTypeClass())
3687 {
3688 case clang::Type::UnaryTransform: break;
3689 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
3690 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
3691 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
3692 case clang::Type::VariableArray: return lldb::eTypeClassArray;
3693 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
3694 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
3695 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
3696 case clang::Type::ExtVector: return lldb::eTypeClassVector;
3697 case clang::Type::Vector: return lldb::eTypeClassVector;
3698 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
3699 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
3700 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
3701 case clang::Type::Pointer: return lldb::eTypeClassPointer;
3702 case clang::Type::LValueReference: return lldb::eTypeClassReference;
3703 case clang::Type::RValueReference: return lldb::eTypeClassReference;
3704 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
3705 case clang::Type::Complex:
3706 if (qual_type->isComplexType())
3707 return lldb::eTypeClassComplexFloat;
3708 else
3709 return lldb::eTypeClassComplexInteger;
3710 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
3711 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
3712 case clang::Type::Record:
3713 {
3714 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3715 const clang::RecordDecl *record_decl = record_type->getDecl();
3716 if (record_decl->isUnion())
3717 return lldb::eTypeClassUnion;
3718 else if (record_decl->isStruct())
3719 return lldb::eTypeClassStruct;
3720 else
3721 return lldb::eTypeClassClass;
3722 }
3723 break;
3724 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
3725 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
3726 case clang::Type::UnresolvedUsing: break;
3727 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003728 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003729 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003730 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003731
3732 case clang::Type::Attributed: break;
3733 case clang::Type::TemplateTypeParm: break;
3734 case clang::Type::SubstTemplateTypeParm: break;
3735 case clang::Type::SubstTemplateTypeParmPack:break;
3736 case clang::Type::Auto: break;
3737 case clang::Type::InjectedClassName: break;
3738 case clang::Type::DependentName: break;
3739 case clang::Type::DependentTemplateSpecialization: break;
3740 case clang::Type::PackExpansion: break;
3741
3742 case clang::Type::TypeOfExpr: break;
3743 case clang::Type::TypeOf: break;
3744 case clang::Type::Decltype: break;
3745 case clang::Type::TemplateSpecialization: break;
3746 case clang::Type::Atomic: break;
3747
3748 // pointer type decayed from an array or function type.
3749 case clang::Type::Decayed: break;
3750 case clang::Type::Adjusted: break;
3751 }
3752 // We don't know hot to display this type...
3753 return lldb::eTypeClassOther;
3754
3755}
3756
3757unsigned
3758ClangASTContext::GetTypeQualifiers(void* type)
3759{
3760 if (type)
3761 return GetQualType(type).getQualifiers().getCVRQualifiers();
3762 return 0;
3763}
3764
3765//----------------------------------------------------------------------
3766// Creating related types
3767//----------------------------------------------------------------------
3768
Greg Claytona1e5dc82015-08-11 22:53:00 +00003769CompilerType
3770ClangASTContext::AddConstModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003771{
Greg Claytonf73034f2015-09-08 18:15:05 +00003772 if (type && llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()))
Greg Claytond8d4a572015-08-11 21:38:15 +00003773 {
Greg Claytonf73034f2015-09-08 18:15:05 +00003774 // Make sure this type is a clang AST type
Greg Claytond8d4a572015-08-11 21:38:15 +00003775 clang::QualType result(GetQualType(type));
3776 result.addConst();
Greg Claytona1e5dc82015-08-11 22:53:00 +00003777 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003778 }
Greg Claytonf73034f2015-09-08 18:15:05 +00003779
Greg Claytona1e5dc82015-08-11 22:53:00 +00003780 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003781}
3782
Greg Claytona1e5dc82015-08-11 22:53:00 +00003783CompilerType
3784ClangASTContext::AddRestrictModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003785{
Greg Claytonf73034f2015-09-08 18:15:05 +00003786 if (type && llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()))
Greg Claytond8d4a572015-08-11 21:38:15 +00003787 {
3788 clang::QualType result(GetQualType(type));
3789 result.getQualifiers().setRestrict (true);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003790 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003791 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003792 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003793}
3794
Greg Claytona1e5dc82015-08-11 22:53:00 +00003795CompilerType
3796ClangASTContext::AddVolatileModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003797{
Greg Claytonf73034f2015-09-08 18:15:05 +00003798 if (type && llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()))
Greg Claytond8d4a572015-08-11 21:38:15 +00003799 {
3800 clang::QualType result(GetQualType(type));
3801 result.getQualifiers().setVolatile (true);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003802 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003803 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003804 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003805}
3806
Greg Claytona1e5dc82015-08-11 22:53:00 +00003807CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003808ClangASTContext::GetArrayElementType (void* type, uint64_t *stride)
3809{
3810 if (type)
3811 {
3812 clang::QualType qual_type(GetCanonicalQualType(type));
3813
3814 const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
3815
3816 if (!array_eletype)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003817 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003818
Greg Claytona1e5dc82015-08-11 22:53:00 +00003819 CompilerType element_type (getASTContext(), array_eletype->getCanonicalTypeUnqualified());
Greg Claytond8d4a572015-08-11 21:38:15 +00003820
3821 // TODO: the real stride will be >= this value.. find the real one!
3822 if (stride)
3823 *stride = element_type.GetByteSize(nullptr);
3824
3825 return element_type;
3826
3827 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003828 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003829}
3830
Greg Claytona1e5dc82015-08-11 22:53:00 +00003831CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003832ClangASTContext::GetCanonicalType (void* type)
3833{
3834 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003835 return CompilerType (getASTContext(), GetCanonicalQualType(type));
3836 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003837}
3838
3839static clang::QualType
3840GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
3841{
3842 if (qual_type->isPointerType())
3843 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
3844 else
3845 qual_type = qual_type.getUnqualifiedType();
3846 qual_type.removeLocalConst();
3847 qual_type.removeLocalRestrict();
3848 qual_type.removeLocalVolatile();
3849 return qual_type;
3850}
3851
Greg Claytona1e5dc82015-08-11 22:53:00 +00003852CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003853ClangASTContext::GetFullyUnqualifiedType (void* type)
3854{
3855 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003856 return CompilerType(getASTContext(), GetFullyUnqualifiedType_Impl(getASTContext(), GetQualType(type)));
3857 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003858}
3859
3860
3861int
3862ClangASTContext::GetFunctionArgumentCount (void* type)
3863{
3864 if (type)
3865 {
3866 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3867 if (func)
3868 return func->getNumParams();
3869 }
3870 return -1;
3871}
3872
Greg Claytona1e5dc82015-08-11 22:53:00 +00003873CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003874ClangASTContext::GetFunctionArgumentTypeAtIndex (void* type, size_t idx)
3875{
3876 if (type)
3877 {
3878 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3879 if (func)
3880 {
3881 const uint32_t num_args = func->getNumParams();
3882 if (idx < num_args)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003883 return CompilerType(getASTContext(), func->getParamType(idx));
Greg Claytond8d4a572015-08-11 21:38:15 +00003884 }
3885 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003886 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003887}
3888
Greg Claytona1e5dc82015-08-11 22:53:00 +00003889CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003890ClangASTContext::GetFunctionReturnType (void* type)
3891{
3892 if (type)
3893 {
3894 clang::QualType qual_type(GetCanonicalQualType(type));
3895 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3896 if (func)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003897 return CompilerType(getASTContext(), func->getReturnType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003898 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003899 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003900}
3901
3902size_t
3903ClangASTContext::GetNumMemberFunctions (void* type)
3904{
3905 size_t num_functions = 0;
3906 if (type)
3907 {
3908 clang::QualType qual_type(GetCanonicalQualType(type));
3909 switch (qual_type->getTypeClass()) {
3910 case clang::Type::Record:
3911 if (GetCompleteQualType (getASTContext(), qual_type))
3912 {
3913 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3914 const clang::RecordDecl *record_decl = record_type->getDecl();
3915 assert(record_decl);
3916 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3917 if (cxx_record_decl)
3918 num_functions = std::distance(cxx_record_decl->method_begin(), cxx_record_decl->method_end());
3919 }
3920 break;
3921
3922 case clang::Type::ObjCObjectPointer:
3923 if (GetCompleteType(type))
3924 {
3925 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
3926 if (objc_class_type)
3927 {
3928 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
3929 if (class_interface_decl)
3930 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
3931 }
3932 }
3933 break;
3934
3935 case clang::Type::ObjCObject:
3936 case clang::Type::ObjCInterface:
3937 if (GetCompleteType(type))
3938 {
3939 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
3940 if (objc_class_type)
3941 {
3942 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3943 if (class_interface_decl)
3944 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
3945 }
3946 }
3947 break;
3948
3949
3950 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003951 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00003952
3953 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003954 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00003955
3956 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003957 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00003958
3959 default:
3960 break;
3961 }
3962 }
3963 return num_functions;
3964}
3965
3966TypeMemberFunctionImpl
3967ClangASTContext::GetMemberFunctionAtIndex (void* type, size_t idx)
3968{
3969 std::string name("");
3970 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003971 CompilerType clang_type{};
Greg Claytond8d4a572015-08-11 21:38:15 +00003972 clang::ObjCMethodDecl *method_decl(nullptr);
3973 if (type)
3974 {
3975 clang::QualType qual_type(GetCanonicalQualType(type));
3976 switch (qual_type->getTypeClass()) {
3977 case clang::Type::Record:
3978 if (GetCompleteQualType (getASTContext(), qual_type))
3979 {
3980 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3981 const clang::RecordDecl *record_decl = record_type->getDecl();
3982 assert(record_decl);
3983 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3984 if (cxx_record_decl)
3985 {
3986 auto method_iter = cxx_record_decl->method_begin();
3987 auto method_end = cxx_record_decl->method_end();
3988 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
3989 {
3990 std::advance(method_iter, idx);
3991 auto method_decl = method_iter->getCanonicalDecl();
3992 if (method_decl)
3993 {
3994 if (!method_decl->getName().empty())
3995 name.assign(method_decl->getName().data());
3996 else
3997 name.clear();
3998 if (method_decl->isStatic())
3999 kind = lldb::eMemberFunctionKindStaticMethod;
4000 else if (llvm::isa<clang::CXXConstructorDecl>(method_decl))
4001 kind = lldb::eMemberFunctionKindConstructor;
4002 else if (llvm::isa<clang::CXXDestructorDecl>(method_decl))
4003 kind = lldb::eMemberFunctionKindDestructor;
4004 else
4005 kind = lldb::eMemberFunctionKindInstanceMethod;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004006 clang_type = CompilerType(getASTContext(),method_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004007 }
4008 }
4009 }
4010 }
4011 break;
4012
4013 case clang::Type::ObjCObjectPointer:
4014 if (GetCompleteType(type))
4015 {
4016 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4017 if (objc_class_type)
4018 {
4019 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4020 if (class_interface_decl)
4021 {
4022 auto method_iter = class_interface_decl->meth_begin();
4023 auto method_end = class_interface_decl->meth_end();
4024 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4025 {
4026 std::advance(method_iter, idx);
4027 method_decl = method_iter->getCanonicalDecl();
4028 if (method_decl)
4029 {
4030 name = method_decl->getSelector().getAsString();
4031 if (method_decl->isClassMethod())
4032 kind = lldb::eMemberFunctionKindStaticMethod;
4033 else
4034 kind = lldb::eMemberFunctionKindInstanceMethod;
4035 }
4036 }
4037 }
4038 }
4039 }
4040 break;
4041
4042 case clang::Type::ObjCObject:
4043 case clang::Type::ObjCInterface:
4044 if (GetCompleteType(type))
4045 {
4046 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4047 if (objc_class_type)
4048 {
4049 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4050 if (class_interface_decl)
4051 {
4052 auto method_iter = class_interface_decl->meth_begin();
4053 auto method_end = class_interface_decl->meth_end();
4054 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4055 {
4056 std::advance(method_iter, idx);
4057 method_decl = method_iter->getCanonicalDecl();
4058 if (method_decl)
4059 {
4060 name = method_decl->getSelector().getAsString();
4061 if (method_decl->isClassMethod())
4062 kind = lldb::eMemberFunctionKindStaticMethod;
4063 else
4064 kind = lldb::eMemberFunctionKindInstanceMethod;
4065 }
4066 }
4067 }
4068 }
4069 }
4070 break;
4071
4072 case clang::Type::Typedef:
4073 return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx);
4074
4075 case clang::Type::Elaborated:
4076 return GetMemberFunctionAtIndex(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx);
4077
4078 case clang::Type::Paren:
4079 return GetMemberFunctionAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx);
4080
4081 default:
4082 break;
4083 }
4084 }
4085
4086 if (kind == eMemberFunctionKindUnknown)
4087 return TypeMemberFunctionImpl();
4088 if (method_decl)
4089 return TypeMemberFunctionImpl(method_decl, name, kind);
4090 if (type)
4091 return TypeMemberFunctionImpl(clang_type, name, kind);
4092
4093 return TypeMemberFunctionImpl();
4094}
4095
Greg Claytona1e5dc82015-08-11 22:53:00 +00004096CompilerType
4097ClangASTContext::GetLValueReferenceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004098{
4099 if (type)
4100 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004101 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004102 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004103 return CompilerType(ast->getASTContext(), ast->getASTContext()->getLValueReferenceType(GetQualType(type)));
Greg Claytond8d4a572015-08-11 21:38:15 +00004104 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004105 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004106}
4107
Greg Claytona1e5dc82015-08-11 22:53:00 +00004108CompilerType
4109ClangASTContext::GetRValueReferenceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004110{
4111 if (type)
4112 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004113 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004114 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004115 return CompilerType(ast->getASTContext(), ast->getASTContext()->getRValueReferenceType(GetQualType(type)));
Greg Claytond8d4a572015-08-11 21:38:15 +00004116 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004117 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004118}
4119
Greg Claytona1e5dc82015-08-11 22:53:00 +00004120CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004121ClangASTContext::GetNonReferenceType (void* type)
4122{
4123 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004124 return CompilerType(getASTContext(), GetQualType(type).getNonReferenceType());
4125 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004126}
4127
Greg Claytona1e5dc82015-08-11 22:53:00 +00004128CompilerType
4129ClangASTContext::CreateTypedefType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00004130 const char *typedef_name,
Greg Clayton99558cc42015-08-24 23:46:31 +00004131 const CompilerDeclContext &compiler_decl_ctx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004132{
4133 if (type && typedef_name && typedef_name[0])
4134 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004135 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004136 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004137 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004138 clang::ASTContext* clang_ast = ast->getASTContext();
4139 clang::QualType qual_type (GetQualType(type));
Greg Clayton99558cc42015-08-24 23:46:31 +00004140
4141 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004142 if (decl_ctx == nullptr)
4143 decl_ctx = ast->getASTContext()->getTranslationUnitDecl();
Greg Clayton99558cc42015-08-24 23:46:31 +00004144
Greg Claytond8d4a572015-08-11 21:38:15 +00004145 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4146 decl_ctx,
4147 clang::SourceLocation(),
4148 clang::SourceLocation(),
4149 &clang_ast->Idents.get(typedef_name),
4150 clang_ast->getTrivialTypeSourceInfo(qual_type));
4151
4152 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4153
4154 // Get a uniqued clang::QualType for the typedef decl type
Greg Claytona1e5dc82015-08-11 22:53:00 +00004155 return CompilerType (clang_ast, clang_ast->getTypedefType (decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00004156 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004157 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004158
4159}
4160
Greg Claytona1e5dc82015-08-11 22:53:00 +00004161CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004162ClangASTContext::GetPointeeType (void* type)
4163{
4164 if (type)
4165 {
4166 clang::QualType qual_type(GetQualType(type));
Greg Claytona1e5dc82015-08-11 22:53:00 +00004167 return CompilerType (getASTContext(), qual_type.getTypePtr()->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004168 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004169 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004170}
4171
Greg Claytona1e5dc82015-08-11 22:53:00 +00004172CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004173ClangASTContext::GetPointerType (void* type)
4174{
4175 if (type)
4176 {
4177 clang::QualType qual_type (GetQualType(type));
4178
4179 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4180 switch (type_class)
4181 {
4182 case clang::Type::ObjCObject:
4183 case clang::Type::ObjCInterface:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004184 return CompilerType(getASTContext(), getASTContext()->getObjCObjectPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004185
4186 default:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004187 return CompilerType(getASTContext(), getASTContext()->getPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004188 }
4189 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004190 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004191}
4192
Greg Claytona1e5dc82015-08-11 22:53:00 +00004193CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004194ClangASTContext::GetTypedefedType (void* type)
4195{
4196 if (type)
4197 {
4198 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4199 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004200 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004201 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004202 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004203}
4204
Greg Claytona1e5dc82015-08-11 22:53:00 +00004205CompilerType
4206ClangASTContext::RemoveFastQualifiers (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004207{
Greg Claytonf73034f2015-09-08 18:15:05 +00004208 if (type && llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()))
Greg Claytond8d4a572015-08-11 21:38:15 +00004209 {
4210 clang::QualType qual_type(GetQualType(type));
4211 qual_type.getQualifiers().removeFastQualifiers();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004212 return CompilerType (type.GetTypeSystem(), qual_type.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004213 }
4214 return type;
4215}
4216
4217
4218//----------------------------------------------------------------------
4219// Create related types using the current type's AST
4220//----------------------------------------------------------------------
4221
Greg Claytona1e5dc82015-08-11 22:53:00 +00004222CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00004223ClangASTContext::GetBasicTypeFromAST (lldb::BasicType basic_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004224{
Greg Clayton99558cc42015-08-24 23:46:31 +00004225 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004226}
4227//----------------------------------------------------------------------
4228// Exploring the type
4229//----------------------------------------------------------------------
4230
4231uint64_t
4232ClangASTContext::GetBitSize (void* type, ExecutionContextScope *exe_scope)
4233{
4234 if (GetCompleteType (type))
4235 {
4236 clang::QualType qual_type(GetCanonicalQualType(type));
4237 switch (qual_type->getTypeClass())
4238 {
4239 case clang::Type::ObjCInterface:
4240 case clang::Type::ObjCObject:
4241 {
4242 ExecutionContext exe_ctx (exe_scope);
4243 Process *process = exe_ctx.GetProcessPtr();
4244 if (process)
4245 {
4246 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4247 if (objc_runtime)
4248 {
4249 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004250 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00004251 return bit_size;
4252 }
4253 }
4254 else
4255 {
4256 static bool g_printed = false;
4257 if (!g_printed)
4258 {
4259 StreamString s;
4260 DumpTypeDescription(&s);
4261
4262 llvm::outs() << "warning: trying to determine the size of type ";
4263 llvm::outs() << s.GetString() << "\n";
4264 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
4265 llvm::outs() << "backtrace:\n";
4266 llvm::sys::PrintStackTrace(llvm::outs());
4267 llvm::outs() << "\n";
4268 g_printed = true;
4269 }
4270 }
4271 }
4272 // fallthrough
4273 default:
4274 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
4275 if (bit_size == 0)
4276 {
4277 if (qual_type->isIncompleteArrayType())
4278 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
4279 }
4280 if (qual_type->isObjCObjectOrInterfaceType())
4281 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
4282 return bit_size;
4283 }
4284 }
4285 return 0;
4286}
4287
4288size_t
4289ClangASTContext::GetTypeBitAlign (void* type)
4290{
4291 if (GetCompleteType(type))
4292 return getASTContext()->getTypeAlign(GetQualType(type));
4293 return 0;
4294}
4295
4296
4297lldb::Encoding
4298ClangASTContext::GetEncoding (void* type, uint64_t &count)
4299{
4300 if (!type)
4301 return lldb::eEncodingInvalid;
4302
4303 count = 1;
4304 clang::QualType qual_type(GetCanonicalQualType(type));
4305
4306 switch (qual_type->getTypeClass())
4307 {
4308 case clang::Type::UnaryTransform:
4309 break;
4310
4311 case clang::Type::FunctionNoProto:
4312 case clang::Type::FunctionProto:
4313 break;
4314
4315 case clang::Type::IncompleteArray:
4316 case clang::Type::VariableArray:
4317 break;
4318
4319 case clang::Type::ConstantArray:
4320 break;
4321
4322 case clang::Type::ExtVector:
4323 case clang::Type::Vector:
4324 // TODO: Set this to more than one???
4325 break;
4326
4327 case clang::Type::Builtin:
4328 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4329 {
4330 default: assert(0 && "Unknown builtin type!");
4331 case clang::BuiltinType::Void:
4332 break;
4333
4334 case clang::BuiltinType::Bool:
4335 case clang::BuiltinType::Char_S:
4336 case clang::BuiltinType::SChar:
4337 case clang::BuiltinType::WChar_S:
4338 case clang::BuiltinType::Char16:
4339 case clang::BuiltinType::Char32:
4340 case clang::BuiltinType::Short:
4341 case clang::BuiltinType::Int:
4342 case clang::BuiltinType::Long:
4343 case clang::BuiltinType::LongLong:
4344 case clang::BuiltinType::Int128: return lldb::eEncodingSint;
4345
4346 case clang::BuiltinType::Char_U:
4347 case clang::BuiltinType::UChar:
4348 case clang::BuiltinType::WChar_U:
4349 case clang::BuiltinType::UShort:
4350 case clang::BuiltinType::UInt:
4351 case clang::BuiltinType::ULong:
4352 case clang::BuiltinType::ULongLong:
4353 case clang::BuiltinType::UInt128: return lldb::eEncodingUint;
4354
4355 case clang::BuiltinType::Float:
4356 case clang::BuiltinType::Double:
4357 case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
4358
4359 case clang::BuiltinType::ObjCClass:
4360 case clang::BuiltinType::ObjCId:
4361 case clang::BuiltinType::ObjCSel: return lldb::eEncodingUint;
4362
4363 case clang::BuiltinType::NullPtr: return lldb::eEncodingUint;
4364
4365 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4366 case clang::BuiltinType::Kind::BoundMember:
4367 case clang::BuiltinType::Kind::BuiltinFn:
4368 case clang::BuiltinType::Kind::Dependent:
4369 case clang::BuiltinType::Kind::Half:
4370 case clang::BuiltinType::Kind::OCLEvent:
4371 case clang::BuiltinType::Kind::OCLImage1d:
4372 case clang::BuiltinType::Kind::OCLImage1dArray:
4373 case clang::BuiltinType::Kind::OCLImage1dBuffer:
4374 case clang::BuiltinType::Kind::OCLImage2d:
4375 case clang::BuiltinType::Kind::OCLImage2dArray:
4376 case clang::BuiltinType::Kind::OCLImage3d:
4377 case clang::BuiltinType::Kind::OCLSampler:
4378 case clang::BuiltinType::Kind::Overload:
4379 case clang::BuiltinType::Kind::PseudoObject:
4380 case clang::BuiltinType::Kind::UnknownAny:
4381 break;
4382 }
4383 break;
4384 // All pointer types are represented as unsigned integer encodings.
4385 // We may nee to add a eEncodingPointer if we ever need to know the
4386 // difference
4387 case clang::Type::ObjCObjectPointer:
4388 case clang::Type::BlockPointer:
4389 case clang::Type::Pointer:
4390 case clang::Type::LValueReference:
4391 case clang::Type::RValueReference:
4392 case clang::Type::MemberPointer: return lldb::eEncodingUint;
4393 case clang::Type::Complex:
4394 {
4395 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4396 if (qual_type->isComplexType())
4397 encoding = lldb::eEncodingIEEE754;
4398 else
4399 {
4400 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
4401 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004402 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004403 else
4404 encoding = lldb::eEncodingSint;
4405 }
4406 count = 2;
4407 return encoding;
4408 }
4409
4410 case clang::Type::ObjCInterface: break;
4411 case clang::Type::Record: break;
4412 case clang::Type::Enum: return lldb::eEncodingSint;
4413 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004414 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004415
4416 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004417 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004418
4419 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004420 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004421
4422 case clang::Type::DependentSizedArray:
4423 case clang::Type::DependentSizedExtVector:
4424 case clang::Type::UnresolvedUsing:
4425 case clang::Type::Attributed:
4426 case clang::Type::TemplateTypeParm:
4427 case clang::Type::SubstTemplateTypeParm:
4428 case clang::Type::SubstTemplateTypeParmPack:
4429 case clang::Type::Auto:
4430 case clang::Type::InjectedClassName:
4431 case clang::Type::DependentName:
4432 case clang::Type::DependentTemplateSpecialization:
4433 case clang::Type::PackExpansion:
4434 case clang::Type::ObjCObject:
4435
4436 case clang::Type::TypeOfExpr:
4437 case clang::Type::TypeOf:
4438 case clang::Type::Decltype:
4439 case clang::Type::TemplateSpecialization:
4440 case clang::Type::Atomic:
4441 case clang::Type::Adjusted:
4442 break;
4443
4444 // pointer type decayed from an array or function type.
4445 case clang::Type::Decayed:
4446 break;
4447 }
4448 count = 0;
4449 return lldb::eEncodingInvalid;
4450}
4451
4452lldb::Format
4453ClangASTContext::GetFormat (void* type)
4454{
4455 if (!type)
4456 return lldb::eFormatDefault;
4457
4458 clang::QualType qual_type(GetCanonicalQualType(type));
4459
4460 switch (qual_type->getTypeClass())
4461 {
4462 case clang::Type::UnaryTransform:
4463 break;
4464
4465 case clang::Type::FunctionNoProto:
4466 case clang::Type::FunctionProto:
4467 break;
4468
4469 case clang::Type::IncompleteArray:
4470 case clang::Type::VariableArray:
4471 break;
4472
4473 case clang::Type::ConstantArray:
4474 return lldb::eFormatVoid; // no value
4475
4476 case clang::Type::ExtVector:
4477 case clang::Type::Vector:
4478 break;
4479
4480 case clang::Type::Builtin:
4481 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4482 {
4483 //default: assert(0 && "Unknown builtin type!");
4484 case clang::BuiltinType::UnknownAny:
4485 case clang::BuiltinType::Void:
4486 case clang::BuiltinType::BoundMember:
4487 break;
4488
4489 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
4490 case clang::BuiltinType::Char_S:
4491 case clang::BuiltinType::SChar:
4492 case clang::BuiltinType::WChar_S:
4493 case clang::BuiltinType::Char_U:
4494 case clang::BuiltinType::UChar:
4495 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
4496 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
4497 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
4498 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
4499 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
4500 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
4501 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
4502 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
4503 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
4504 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
4505 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
4506 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
4507 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
4508 case clang::BuiltinType::Float: return lldb::eFormatFloat;
4509 case clang::BuiltinType::Double: return lldb::eFormatFloat;
4510 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
4511 case clang::BuiltinType::NullPtr:
4512 case clang::BuiltinType::Overload:
4513 case clang::BuiltinType::Dependent:
4514 case clang::BuiltinType::ObjCId:
4515 case clang::BuiltinType::ObjCClass:
4516 case clang::BuiltinType::ObjCSel:
4517 case clang::BuiltinType::Half:
4518 case clang::BuiltinType::ARCUnbridgedCast:
4519 case clang::BuiltinType::PseudoObject:
4520 case clang::BuiltinType::BuiltinFn:
4521 case clang::BuiltinType::OCLEvent:
4522 case clang::BuiltinType::OCLImage1d:
4523 case clang::BuiltinType::OCLImage1dArray:
4524 case clang::BuiltinType::OCLImage1dBuffer:
4525 case clang::BuiltinType::OCLImage2d:
4526 case clang::BuiltinType::OCLImage2dArray:
4527 case clang::BuiltinType::OCLImage3d:
4528 case clang::BuiltinType::OCLSampler:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00004529 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00004530 return lldb::eFormatHex;
4531 }
4532 break;
4533 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
4534 case clang::Type::BlockPointer: return lldb::eFormatHex;
4535 case clang::Type::Pointer: return lldb::eFormatHex;
4536 case clang::Type::LValueReference:
4537 case clang::Type::RValueReference: return lldb::eFormatHex;
4538 case clang::Type::MemberPointer: break;
4539 case clang::Type::Complex:
4540 {
4541 if (qual_type->isComplexType())
4542 return lldb::eFormatComplex;
4543 else
4544 return lldb::eFormatComplexInteger;
4545 }
4546 case clang::Type::ObjCInterface: break;
4547 case clang::Type::Record: break;
4548 case clang::Type::Enum: return lldb::eFormatEnum;
4549 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004550 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004551 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004552 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004553 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004554 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004555 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004556 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004557 case clang::Type::DependentSizedArray:
4558 case clang::Type::DependentSizedExtVector:
4559 case clang::Type::UnresolvedUsing:
4560 case clang::Type::Attributed:
4561 case clang::Type::TemplateTypeParm:
4562 case clang::Type::SubstTemplateTypeParm:
4563 case clang::Type::SubstTemplateTypeParmPack:
4564 case clang::Type::InjectedClassName:
4565 case clang::Type::DependentName:
4566 case clang::Type::DependentTemplateSpecialization:
4567 case clang::Type::PackExpansion:
4568 case clang::Type::ObjCObject:
4569
4570 case clang::Type::TypeOfExpr:
4571 case clang::Type::TypeOf:
4572 case clang::Type::Decltype:
4573 case clang::Type::TemplateSpecialization:
4574 case clang::Type::Atomic:
4575 case clang::Type::Adjusted:
4576 break;
4577
4578 // pointer type decayed from an array or function type.
4579 case clang::Type::Decayed:
4580 break;
4581 }
4582 // We don't know hot to display this type...
4583 return lldb::eFormatBytes;
4584}
4585
4586static bool
4587ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
4588{
4589 while (class_interface_decl)
4590 {
4591 if (class_interface_decl->ivar_size() > 0)
4592 return true;
4593
4594 if (check_superclass)
4595 class_interface_decl = class_interface_decl->getSuperClass();
4596 else
4597 break;
4598 }
4599 return false;
4600}
4601
4602uint32_t
4603ClangASTContext::GetNumChildren (void* type, bool omit_empty_base_classes)
4604{
4605 if (!type)
4606 return 0;
4607
4608 uint32_t num_children = 0;
4609 clang::QualType qual_type(GetQualType(type));
4610 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4611 switch (type_class)
4612 {
4613 case clang::Type::Builtin:
4614 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4615 {
4616 case clang::BuiltinType::ObjCId: // child is Class
4617 case clang::BuiltinType::ObjCClass: // child is Class
4618 num_children = 1;
4619 break;
4620
4621 default:
4622 break;
4623 }
4624 break;
4625
4626 case clang::Type::Complex: return 0;
4627
4628 case clang::Type::Record:
4629 if (GetCompleteQualType (getASTContext(), qual_type))
4630 {
4631 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4632 const clang::RecordDecl *record_decl = record_type->getDecl();
4633 assert(record_decl);
4634 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4635 if (cxx_record_decl)
4636 {
4637 if (omit_empty_base_classes)
4638 {
4639 // Check each base classes to see if it or any of its
4640 // base classes contain any fields. This can help
4641 // limit the noise in variable views by not having to
4642 // show base classes that contain no members.
4643 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4644 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4645 base_class != base_class_end;
4646 ++base_class)
4647 {
4648 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
4649
4650 // Skip empty base classes
4651 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
4652 continue;
4653
4654 num_children++;
4655 }
4656 }
4657 else
4658 {
4659 // Include all base classes
4660 num_children += cxx_record_decl->getNumBases();
4661 }
4662
4663 }
4664 clang::RecordDecl::field_iterator field, field_end;
4665 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
4666 ++num_children;
4667 }
4668 break;
4669
4670 case clang::Type::ObjCObject:
4671 case clang::Type::ObjCInterface:
4672 if (GetCompleteQualType (getASTContext(), qual_type))
4673 {
4674 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4675 assert (objc_class_type);
4676 if (objc_class_type)
4677 {
4678 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4679
4680 if (class_interface_decl)
4681 {
4682
4683 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4684 if (superclass_interface_decl)
4685 {
4686 if (omit_empty_base_classes)
4687 {
4688 if (ObjCDeclHasIVars (superclass_interface_decl, true))
4689 ++num_children;
4690 }
4691 else
4692 ++num_children;
4693 }
4694
4695 num_children += class_interface_decl->ivar_size();
4696 }
4697 }
4698 }
4699 break;
4700
4701 case clang::Type::ObjCObjectPointer:
4702 {
4703 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
4704 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004705 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004706 // If this type points to a simple type, then it has 1 child
4707 if (num_pointee_children == 0)
4708 num_children = 1;
4709 else
4710 num_children = num_pointee_children;
4711 }
4712 break;
4713
4714 case clang::Type::Vector:
4715 case clang::Type::ExtVector:
4716 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
4717 break;
4718
4719 case clang::Type::ConstantArray:
4720 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4721 break;
4722
4723 case clang::Type::Pointer:
4724 {
4725 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
4726 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00004727 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004728 if (num_pointee_children == 0)
4729 {
4730 // We have a pointer to a pointee type that claims it has no children.
4731 // We will want to look at
4732 num_children = GetNumPointeeChildren (pointee_type);
4733 }
4734 else
4735 num_children = num_pointee_children;
4736 }
4737 break;
4738
4739 case clang::Type::LValueReference:
4740 case clang::Type::RValueReference:
4741 {
4742 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
4743 clang::QualType pointee_type = reference_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004744 uint32_t num_pointee_children = CompilerType (getASTContext(), pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004745 // If this type points to a simple type, then it has 1 child
4746 if (num_pointee_children == 0)
4747 num_children = 1;
4748 else
4749 num_children = num_pointee_children;
4750 }
4751 break;
4752
4753
4754 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004755 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004756 break;
4757
4758 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004759 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004760 break;
4761
4762 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004763 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004764 break;
4765 default:
4766 break;
4767 }
4768 return num_children;
4769}
4770
4771lldb::BasicType
4772ClangASTContext::GetBasicTypeEnumeration (void* type)
4773{
4774 if (type)
4775 {
4776 clang::QualType qual_type(GetQualType(type));
4777 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4778 if (type_class == clang::Type::Builtin)
4779 {
4780 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4781 {
4782 case clang::BuiltinType::Void: return eBasicTypeVoid;
4783 case clang::BuiltinType::Bool: return eBasicTypeBool;
4784 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
4785 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
4786 case clang::BuiltinType::Char16: return eBasicTypeChar16;
4787 case clang::BuiltinType::Char32: return eBasicTypeChar32;
4788 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
4789 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
4790 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
4791 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
4792 case clang::BuiltinType::Short: return eBasicTypeShort;
4793 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
4794 case clang::BuiltinType::Int: return eBasicTypeInt;
4795 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
4796 case clang::BuiltinType::Long: return eBasicTypeLong;
4797 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
4798 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
4799 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
4800 case clang::BuiltinType::Int128: return eBasicTypeInt128;
4801 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
4802
4803 case clang::BuiltinType::Half: return eBasicTypeHalf;
4804 case clang::BuiltinType::Float: return eBasicTypeFloat;
4805 case clang::BuiltinType::Double: return eBasicTypeDouble;
4806 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
4807
4808 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
4809 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
4810 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
4811 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
4812 case clang::BuiltinType::Dependent:
4813 case clang::BuiltinType::Overload:
4814 case clang::BuiltinType::BoundMember:
4815 case clang::BuiltinType::PseudoObject:
4816 case clang::BuiltinType::UnknownAny:
4817 case clang::BuiltinType::BuiltinFn:
4818 case clang::BuiltinType::ARCUnbridgedCast:
4819 case clang::BuiltinType::OCLEvent:
4820 case clang::BuiltinType::OCLImage1d:
4821 case clang::BuiltinType::OCLImage1dArray:
4822 case clang::BuiltinType::OCLImage1dBuffer:
4823 case clang::BuiltinType::OCLImage2d:
4824 case clang::BuiltinType::OCLImage2dArray:
4825 case clang::BuiltinType::OCLImage3d:
4826 case clang::BuiltinType::OCLSampler:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00004827 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00004828 return eBasicTypeOther;
4829 }
4830 }
4831 }
4832 return eBasicTypeInvalid;
4833}
4834
Greg Clayton99558cc42015-08-24 23:46:31 +00004835void
4836ClangASTContext::ForEachEnumerator (void* type, std::function <bool (const CompilerType &integer_type, const ConstString &name, const llvm::APSInt &value)> const &callback)
4837{
4838 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
4839 if (enum_type)
4840 {
4841 const clang::EnumDecl *enum_decl = enum_type->getDecl();
4842 if (enum_decl)
4843 {
4844 CompilerType integer_type(this, enum_decl->getIntegerType().getAsOpaquePtr());
4845
4846 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
4847 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
4848 {
4849 ConstString name(enum_pos->getNameAsString().c_str());
4850 if (!callback (integer_type, name, enum_pos->getInitVal()))
4851 break;
4852 }
4853 }
4854 }
4855}
4856
Greg Claytond8d4a572015-08-11 21:38:15 +00004857
4858#pragma mark Aggregate Types
4859
4860uint32_t
Greg Claytond8d4a572015-08-11 21:38:15 +00004861ClangASTContext::GetNumFields (void* type)
4862{
4863 if (!type)
4864 return 0;
4865
4866 uint32_t count = 0;
4867 clang::QualType qual_type(GetCanonicalQualType(type));
4868 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4869 switch (type_class)
4870 {
4871 case clang::Type::Record:
4872 if (GetCompleteType(type))
4873 {
4874 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
4875 if (record_type)
4876 {
4877 clang::RecordDecl *record_decl = record_type->getDecl();
4878 if (record_decl)
4879 {
4880 uint32_t field_idx = 0;
4881 clang::RecordDecl::field_iterator field, field_end;
4882 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
4883 ++field_idx;
4884 count = field_idx;
4885 }
4886 }
4887 }
4888 break;
4889
4890 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004891 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00004892 break;
4893
4894 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004895 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00004896 break;
4897
4898 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004899 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00004900 break;
4901
4902 case clang::Type::ObjCObjectPointer:
4903 if (GetCompleteType(type))
4904 {
4905 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4906 if (objc_class_type)
4907 {
4908 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4909
4910 if (class_interface_decl)
4911 count = class_interface_decl->ivar_size();
4912 }
4913 }
4914 break;
4915
4916 case clang::Type::ObjCObject:
4917 case clang::Type::ObjCInterface:
4918 if (GetCompleteType(type))
4919 {
4920 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4921 if (objc_class_type)
4922 {
4923 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4924
4925 if (class_interface_decl)
4926 count = class_interface_decl->ivar_size();
4927 }
4928 }
4929 break;
4930
4931 default:
4932 break;
4933 }
4934 return count;
4935}
4936
Greg Claytond8d4a572015-08-11 21:38:15 +00004937static clang_type_t
4938GetObjCFieldAtIndex (clang::ASTContext *ast,
4939 clang::ObjCInterfaceDecl *class_interface_decl,
4940 size_t idx,
4941 std::string& name,
4942 uint64_t *bit_offset_ptr,
4943 uint32_t *bitfield_bit_size_ptr,
4944 bool *is_bitfield_ptr)
4945{
4946 if (class_interface_decl)
4947 {
4948 if (idx < (class_interface_decl->ivar_size()))
4949 {
4950 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4951 uint32_t ivar_idx = 0;
4952
4953 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
4954 {
4955 if (ivar_idx == idx)
4956 {
4957 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
4958
4959 clang::QualType ivar_qual_type(ivar_decl->getType());
4960
4961 name.assign(ivar_decl->getNameAsString());
4962
4963 if (bit_offset_ptr)
4964 {
4965 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
4966 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
4967 }
4968
4969 const bool is_bitfield = ivar_pos->isBitField();
4970
4971 if (bitfield_bit_size_ptr)
4972 {
4973 *bitfield_bit_size_ptr = 0;
4974
4975 if (is_bitfield && ast)
4976 {
4977 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
4978 llvm::APSInt bitfield_apsint;
4979 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
4980 {
4981 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
4982 }
4983 }
4984 }
4985 if (is_bitfield_ptr)
4986 *is_bitfield_ptr = is_bitfield;
4987
4988 return ivar_qual_type.getAsOpaquePtr();
4989 }
4990 }
4991 }
4992 }
4993 return nullptr;
4994}
4995
Greg Claytona1e5dc82015-08-11 22:53:00 +00004996CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004997ClangASTContext::GetFieldAtIndex (void* type, size_t idx,
4998 std::string& name,
4999 uint64_t *bit_offset_ptr,
5000 uint32_t *bitfield_bit_size_ptr,
5001 bool *is_bitfield_ptr)
5002{
5003 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005004 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005005
5006 clang::QualType qual_type(GetCanonicalQualType(type));
5007 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5008 switch (type_class)
5009 {
5010 case clang::Type::Record:
5011 if (GetCompleteType(type))
5012 {
5013 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5014 const clang::RecordDecl *record_decl = record_type->getDecl();
5015 uint32_t field_idx = 0;
5016 clang::RecordDecl::field_iterator field, field_end;
5017 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
5018 {
5019 if (idx == field_idx)
5020 {
5021 // Print the member type if requested
5022 // Print the member name and equal sign
5023 name.assign(field->getNameAsString());
5024
5025 // Figure out the type byte size (field_type_info.first) and
5026 // alignment (field_type_info.second) from the AST context.
5027 if (bit_offset_ptr)
5028 {
5029 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5030 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5031 }
5032
5033 const bool is_bitfield = field->isBitField();
5034
5035 if (bitfield_bit_size_ptr)
5036 {
5037 *bitfield_bit_size_ptr = 0;
5038
5039 if (is_bitfield)
5040 {
5041 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5042 llvm::APSInt bitfield_apsint;
5043 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5044 {
5045 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5046 }
5047 }
5048 }
5049 if (is_bitfield_ptr)
5050 *is_bitfield_ptr = is_bitfield;
5051
Greg Claytona1e5dc82015-08-11 22:53:00 +00005052 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005053 }
5054 }
5055 }
5056 break;
5057
5058 case clang::Type::ObjCObjectPointer:
5059 if (GetCompleteType(type))
5060 {
5061 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5062 if (objc_class_type)
5063 {
5064 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005065 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 +00005066 }
5067 }
5068 break;
5069
5070 case clang::Type::ObjCObject:
5071 case clang::Type::ObjCInterface:
5072 if (GetCompleteType(type))
5073 {
5074 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5075 assert (objc_class_type);
5076 if (objc_class_type)
5077 {
5078 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005079 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 +00005080 }
5081 }
5082 break;
5083
5084
5085 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005086 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005087 GetFieldAtIndex (idx,
5088 name,
5089 bit_offset_ptr,
5090 bitfield_bit_size_ptr,
5091 is_bitfield_ptr);
5092
5093 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005094 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005095 GetFieldAtIndex (idx,
5096 name,
5097 bit_offset_ptr,
5098 bitfield_bit_size_ptr,
5099 is_bitfield_ptr);
5100
5101 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005102 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005103 GetFieldAtIndex (idx,
5104 name,
5105 bit_offset_ptr,
5106 bitfield_bit_size_ptr,
5107 is_bitfield_ptr);
5108
5109 default:
5110 break;
5111 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005112 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005113}
5114
Greg Clayton99558cc42015-08-24 23:46:31 +00005115uint32_t
5116ClangASTContext::GetNumDirectBaseClasses (void *type)
5117{
5118 uint32_t count = 0;
5119 clang::QualType qual_type(GetCanonicalQualType(type));
5120 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5121 switch (type_class)
5122 {
5123 case clang::Type::Record:
5124 if (GetCompleteType(type))
5125 {
5126 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5127 if (cxx_record_decl)
5128 count = cxx_record_decl->getNumBases();
5129 }
5130 break;
5131
5132 case clang::Type::ObjCObjectPointer:
5133 count = GetPointeeType(type).GetNumDirectBaseClasses();
5134 break;
5135
5136 case clang::Type::ObjCObject:
5137 if (GetCompleteType(type))
5138 {
5139 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5140 if (objc_class_type)
5141 {
5142 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5143
5144 if (class_interface_decl && class_interface_decl->getSuperClass())
5145 count = 1;
5146 }
5147 }
5148 break;
5149 case clang::Type::ObjCInterface:
5150 if (GetCompleteType(type))
5151 {
5152 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5153 if (objc_interface_type)
5154 {
5155 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5156
5157 if (class_interface_decl && class_interface_decl->getSuperClass())
5158 count = 1;
5159 }
5160 }
5161 break;
5162
5163
5164 case clang::Type::Typedef:
5165 count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5166 break;
5167
5168 case clang::Type::Elaborated:
5169 count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5170 break;
5171
5172 case clang::Type::Paren:
5173 return GetNumDirectBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5174
5175 default:
5176 break;
5177 }
5178 return count;
5179
5180}
5181
5182uint32_t
5183ClangASTContext::GetNumVirtualBaseClasses (void *type)
5184{
5185 uint32_t count = 0;
5186 clang::QualType qual_type(GetCanonicalQualType(type));
5187 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5188 switch (type_class)
5189 {
5190 case clang::Type::Record:
5191 if (GetCompleteType(type))
5192 {
5193 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5194 if (cxx_record_decl)
5195 count = cxx_record_decl->getNumVBases();
5196 }
5197 break;
5198
5199 case clang::Type::Typedef:
5200 count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5201 break;
5202
5203 case clang::Type::Elaborated:
5204 count = GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5205 break;
5206
5207 case clang::Type::Paren:
5208 count = GetNumVirtualBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5209 break;
5210
5211 default:
5212 break;
5213 }
5214 return count;
5215
5216}
5217
5218CompilerType
5219ClangASTContext::GetDirectBaseClassAtIndex (void *type, size_t idx, uint32_t *bit_offset_ptr)
5220{
5221 clang::QualType qual_type(GetCanonicalQualType(type));
5222 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5223 switch (type_class)
5224 {
5225 case clang::Type::Record:
5226 if (GetCompleteType(type))
5227 {
5228 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5229 if (cxx_record_decl)
5230 {
5231 uint32_t curr_idx = 0;
5232 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5233 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5234 base_class != base_class_end;
5235 ++base_class, ++curr_idx)
5236 {
5237 if (curr_idx == idx)
5238 {
5239 if (bit_offset_ptr)
5240 {
5241 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5242 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5243 if (base_class->isVirtual())
5244 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5245 else
5246 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5247 }
5248 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5249 }
5250 }
5251 }
5252 }
5253 break;
5254
5255 case clang::Type::ObjCObjectPointer:
5256 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
5257
5258 case clang::Type::ObjCObject:
5259 if (idx == 0 && GetCompleteType(type))
5260 {
5261 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5262 if (objc_class_type)
5263 {
5264 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5265
5266 if (class_interface_decl)
5267 {
5268 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5269 if (superclass_interface_decl)
5270 {
5271 if (bit_offset_ptr)
5272 *bit_offset_ptr = 0;
5273 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5274 }
5275 }
5276 }
5277 }
5278 break;
5279 case clang::Type::ObjCInterface:
5280 if (idx == 0 && GetCompleteType(type))
5281 {
5282 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5283 if (objc_interface_type)
5284 {
5285 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5286
5287 if (class_interface_decl)
5288 {
5289 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5290 if (superclass_interface_decl)
5291 {
5292 if (bit_offset_ptr)
5293 *bit_offset_ptr = 0;
5294 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5295 }
5296 }
5297 }
5298 }
5299 break;
5300
5301
5302 case clang::Type::Typedef:
5303 return GetDirectBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5304
5305 case clang::Type::Elaborated:
5306 return GetDirectBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5307
5308 case clang::Type::Paren:
5309 return GetDirectBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5310
5311 default:
5312 break;
5313 }
5314 return CompilerType();
5315}
5316
5317CompilerType
5318ClangASTContext::GetVirtualBaseClassAtIndex (void *type,
5319 size_t idx,
5320 uint32_t *bit_offset_ptr)
5321{
5322 clang::QualType qual_type(GetCanonicalQualType(type));
5323 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5324 switch (type_class)
5325 {
5326 case clang::Type::Record:
5327 if (GetCompleteType(type))
5328 {
5329 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5330 if (cxx_record_decl)
5331 {
5332 uint32_t curr_idx = 0;
5333 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5334 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
5335 base_class != base_class_end;
5336 ++base_class, ++curr_idx)
5337 {
5338 if (curr_idx == idx)
5339 {
5340 if (bit_offset_ptr)
5341 {
5342 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5343 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5344 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5345
5346 }
5347 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5348 }
5349 }
5350 }
5351 }
5352 break;
5353
5354 case clang::Type::Typedef:
5355 return GetVirtualBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5356
5357 case clang::Type::Elaborated:
5358 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5359
5360 case clang::Type::Paren:
5361 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5362
5363 default:
5364 break;
5365 }
5366 return CompilerType();
5367
5368}
5369
Greg Claytond8d4a572015-08-11 21:38:15 +00005370// If a pointer to a pointee type (the clang_type arg) says that it has no
5371// children, then we either need to trust it, or override it and return a
5372// different result. For example, an "int *" has one child that is an integer,
5373// but a function pointer doesn't have any children. Likewise if a Record type
5374// claims it has no children, then there really is nothing to show.
5375uint32_t
5376ClangASTContext::GetNumPointeeChildren (clang::QualType type)
5377{
5378 if (type.isNull())
5379 return 0;
5380
5381 clang::QualType qual_type(type.getCanonicalType());
5382 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5383 switch (type_class)
5384 {
5385 case clang::Type::Builtin:
5386 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5387 {
5388 case clang::BuiltinType::UnknownAny:
5389 case clang::BuiltinType::Void:
5390 case clang::BuiltinType::NullPtr:
5391 case clang::BuiltinType::OCLEvent:
5392 case clang::BuiltinType::OCLImage1d:
5393 case clang::BuiltinType::OCLImage1dArray:
5394 case clang::BuiltinType::OCLImage1dBuffer:
5395 case clang::BuiltinType::OCLImage2d:
5396 case clang::BuiltinType::OCLImage2dArray:
5397 case clang::BuiltinType::OCLImage3d:
5398 case clang::BuiltinType::OCLSampler:
5399 return 0;
5400 case clang::BuiltinType::Bool:
5401 case clang::BuiltinType::Char_U:
5402 case clang::BuiltinType::UChar:
5403 case clang::BuiltinType::WChar_U:
5404 case clang::BuiltinType::Char16:
5405 case clang::BuiltinType::Char32:
5406 case clang::BuiltinType::UShort:
5407 case clang::BuiltinType::UInt:
5408 case clang::BuiltinType::ULong:
5409 case clang::BuiltinType::ULongLong:
5410 case clang::BuiltinType::UInt128:
5411 case clang::BuiltinType::Char_S:
5412 case clang::BuiltinType::SChar:
5413 case clang::BuiltinType::WChar_S:
5414 case clang::BuiltinType::Short:
5415 case clang::BuiltinType::Int:
5416 case clang::BuiltinType::Long:
5417 case clang::BuiltinType::LongLong:
5418 case clang::BuiltinType::Int128:
5419 case clang::BuiltinType::Float:
5420 case clang::BuiltinType::Double:
5421 case clang::BuiltinType::LongDouble:
5422 case clang::BuiltinType::Dependent:
5423 case clang::BuiltinType::Overload:
5424 case clang::BuiltinType::ObjCId:
5425 case clang::BuiltinType::ObjCClass:
5426 case clang::BuiltinType::ObjCSel:
5427 case clang::BuiltinType::BoundMember:
5428 case clang::BuiltinType::Half:
5429 case clang::BuiltinType::ARCUnbridgedCast:
5430 case clang::BuiltinType::PseudoObject:
5431 case clang::BuiltinType::BuiltinFn:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00005432 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00005433 return 1;
5434 }
5435 break;
5436
5437 case clang::Type::Complex: return 1;
5438 case clang::Type::Pointer: return 1;
5439 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
5440 case clang::Type::LValueReference: return 1;
5441 case clang::Type::RValueReference: return 1;
5442 case clang::Type::MemberPointer: return 0;
5443 case clang::Type::ConstantArray: return 0;
5444 case clang::Type::IncompleteArray: return 0;
5445 case clang::Type::VariableArray: return 0;
5446 case clang::Type::DependentSizedArray: return 0;
5447 case clang::Type::DependentSizedExtVector: return 0;
5448 case clang::Type::Vector: return 0;
5449 case clang::Type::ExtVector: return 0;
5450 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
5451 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
5452 case clang::Type::UnresolvedUsing: return 0;
5453 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
5454 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
5455 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
5456 case clang::Type::TypeOfExpr: return 0;
5457 case clang::Type::TypeOf: return 0;
5458 case clang::Type::Decltype: return 0;
5459 case clang::Type::Record: return 0;
5460 case clang::Type::Enum: return 1;
5461 case clang::Type::TemplateTypeParm: return 1;
5462 case clang::Type::SubstTemplateTypeParm: return 1;
5463 case clang::Type::TemplateSpecialization: return 1;
5464 case clang::Type::InjectedClassName: return 0;
5465 case clang::Type::DependentName: return 1;
5466 case clang::Type::DependentTemplateSpecialization: return 1;
5467 case clang::Type::ObjCObject: return 0;
5468 case clang::Type::ObjCInterface: return 0;
5469 case clang::Type::ObjCObjectPointer: return 1;
5470 default:
5471 break;
5472 }
5473 return 0;
5474}
5475
5476
Greg Claytona1e5dc82015-08-11 22:53:00 +00005477CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00005478ClangASTContext::GetChildClangTypeAtIndex (void* type,
5479 ExecutionContext *exe_ctx,
5480 size_t idx,
5481 bool transparent_pointers,
5482 bool omit_empty_base_classes,
5483 bool ignore_array_bounds,
5484 std::string& child_name,
5485 uint32_t &child_byte_size,
5486 int32_t &child_byte_offset,
5487 uint32_t &child_bitfield_bit_size,
5488 uint32_t &child_bitfield_bit_offset,
5489 bool &child_is_base_class,
5490 bool &child_is_deref_of_parent,
5491 ValueObject *valobj)
Greg Claytond8d4a572015-08-11 21:38:15 +00005492{
5493 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005494 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005495
5496 clang::QualType parent_qual_type(GetCanonicalQualType(type));
5497 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
5498 child_bitfield_bit_size = 0;
5499 child_bitfield_bit_offset = 0;
5500 child_is_base_class = false;
5501
5502 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
5503 uint32_t bit_offset;
5504 switch (parent_type_class)
5505 {
5506 case clang::Type::Builtin:
5507 if (idx_is_valid)
5508 {
5509 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
5510 {
5511 case clang::BuiltinType::ObjCId:
5512 case clang::BuiltinType::ObjCClass:
5513 child_name = "isa";
5514 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005515 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00005516
5517 default:
5518 break;
5519 }
5520 }
5521 break;
5522
5523 case clang::Type::Record:
5524 if (idx_is_valid && GetCompleteType(type))
5525 {
5526 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
5527 const clang::RecordDecl *record_decl = record_type->getDecl();
5528 assert(record_decl);
5529 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5530 uint32_t child_idx = 0;
5531
5532 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5533 if (cxx_record_decl)
5534 {
5535 // We might have base classes to print out first
5536 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5537 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5538 base_class != base_class_end;
5539 ++base_class)
5540 {
5541 const clang::CXXRecordDecl *base_class_decl = nullptr;
5542
5543 // Skip empty base classes
5544 if (omit_empty_base_classes)
5545 {
5546 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5547 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5548 continue;
5549 }
5550
5551 if (idx == child_idx)
5552 {
5553 if (base_class_decl == nullptr)
5554 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5555
5556
5557 if (base_class->isVirtual())
5558 {
5559 bool handled = false;
5560 if (valobj)
5561 {
5562 Error err;
5563 AddressType addr_type = eAddressTypeInvalid;
5564 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
5565
5566 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
5567 {
5568
5569 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
5570 Process *process = exe_ctx.GetProcessPtr();
5571 if (process)
5572 {
5573 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
5574 if (vtable_ctx)
5575 {
5576 if (vtable_ctx->isMicrosoft())
5577 {
5578 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
5579
5580 if (vtable_ptr_addr)
5581 {
5582 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
5583
5584 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
5585 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
5586 {
5587 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
5588 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
5589 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
5590 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5591 if (base_offset != UINT32_MAX)
5592 {
5593 handled = true;
5594 bit_offset = base_offset * 8;
5595 }
5596 }
5597 }
5598 }
5599 else
5600 {
5601 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
5602 if (vtable_ptr_addr)
5603 {
5604 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
5605 if (vtable_ptr != LLDB_INVALID_ADDRESS)
5606 {
5607 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
5608 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
5609 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5610 if (base_offset != UINT32_MAX)
5611 {
5612 handled = true;
5613 bit_offset = base_offset * 8;
5614 }
5615 }
5616 }
5617 }
5618 }
5619 }
5620 }
5621
5622 }
5623 if (!handled)
5624 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5625 }
5626 else
5627 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5628
5629 // Base classes should be a multiple of 8 bits in size
5630 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005631 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005632 child_name = base_class_clang_type.GetTypeName().AsCString("");
5633 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5634
5635 // Base classes bit sizes should be a multiple of 8 bits in size
5636 assert (base_class_clang_type_bit_size % 8 == 0);
5637 child_byte_size = base_class_clang_type_bit_size / 8;
5638 child_is_base_class = true;
5639 return base_class_clang_type;
5640 }
5641 // We don't increment the child index in the for loop since we might
5642 // be skipping empty base classes
5643 ++child_idx;
5644 }
5645 }
5646 // Make sure index is in range...
5647 uint32_t field_idx = 0;
5648 clang::RecordDecl::field_iterator field, field_end;
5649 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
5650 {
5651 if (idx == child_idx)
5652 {
5653 // Print the member type if requested
5654 // Print the member name and equal sign
5655 child_name.assign(field->getNameAsString().c_str());
5656
5657 // Figure out the type byte size (field_type_info.first) and
5658 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00005659 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005660 assert(field_idx < record_layout.getFieldCount());
5661 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5662
5663 // Figure out the field offset within the current struct/union/class type
5664 bit_offset = record_layout.getFieldOffset (field_idx);
5665 child_byte_offset = bit_offset / 8;
5666 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
5667 child_bitfield_bit_offset = bit_offset % 8;
5668
5669 return field_clang_type;
5670 }
5671 }
5672 }
5673 break;
5674
5675 case clang::Type::ObjCObject:
5676 case clang::Type::ObjCInterface:
5677 if (idx_is_valid && GetCompleteType(type))
5678 {
5679 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
5680 assert (objc_class_type);
5681 if (objc_class_type)
5682 {
5683 uint32_t child_idx = 0;
5684 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5685
5686 if (class_interface_decl)
5687 {
5688
5689 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
5690 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5691 if (superclass_interface_decl)
5692 {
5693 if (omit_empty_base_classes)
5694 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005695 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00005696 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
5697 {
5698 if (idx == 0)
5699 {
5700 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5701
5702
5703 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
5704
5705 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5706
5707 child_byte_size = ivar_type_info.Width / 8;
5708 child_byte_offset = 0;
5709 child_is_base_class = true;
5710
Greg Claytona1e5dc82015-08-11 22:53:00 +00005711 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005712 }
5713
5714 ++child_idx;
5715 }
5716 }
5717 else
5718 ++child_idx;
5719 }
5720
5721 const uint32_t superclass_idx = child_idx;
5722
5723 if (idx < (child_idx + class_interface_decl->ivar_size()))
5724 {
5725 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5726
5727 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
5728 {
5729 if (child_idx == idx)
5730 {
5731 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5732
5733 clang::QualType ivar_qual_type(ivar_decl->getType());
5734
5735 child_name.assign(ivar_decl->getNameAsString().c_str());
5736
5737 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5738
5739 child_byte_size = ivar_type_info.Width / 8;
5740
5741 // Figure out the field offset within the current struct/union/class type
5742 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
5743 // that doesn't account for the space taken up by unbacked properties, or from
5744 // the changing size of base classes that are newer than this class.
5745 // So if we have a process around that we can ask about this object, do so.
5746 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
5747 Process *process = nullptr;
5748 if (exe_ctx)
5749 process = exe_ctx->GetProcessPtr();
5750 if (process)
5751 {
5752 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
5753 if (objc_runtime != nullptr)
5754 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005755 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005756 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
5757 }
5758 }
5759
5760 // Setting this to UINT32_MAX to make sure we don't compute it twice...
5761 bit_offset = UINT32_MAX;
5762
5763 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
5764 {
5765 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5766 child_byte_offset = bit_offset / 8;
5767 }
5768
5769 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
5770 // of a bitfield within its containing object. So regardless of where we get the byte
5771 // offset from, we still need to get the bit offset for bitfields from the layout.
5772
5773 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
5774 {
5775 if (bit_offset == UINT32_MAX)
5776 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5777
5778 child_bitfield_bit_offset = bit_offset % 8;
5779 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005780 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005781 }
5782 ++child_idx;
5783 }
5784 }
5785 }
5786 }
5787 }
5788 break;
5789
5790 case clang::Type::ObjCObjectPointer:
5791 if (idx_is_valid)
5792 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005793 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00005794
5795 if (transparent_pointers && pointee_clang_type.IsAggregateType())
5796 {
5797 child_is_deref_of_parent = false;
5798 bool tmp_child_is_deref_of_parent = false;
5799 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5800 idx,
5801 transparent_pointers,
5802 omit_empty_base_classes,
5803 ignore_array_bounds,
5804 child_name,
5805 child_byte_size,
5806 child_byte_offset,
5807 child_bitfield_bit_size,
5808 child_bitfield_bit_offset,
5809 child_is_base_class,
5810 tmp_child_is_deref_of_parent,
5811 valobj);
5812 }
5813 else
5814 {
5815 child_is_deref_of_parent = true;
5816 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5817 if (parent_name)
5818 {
5819 child_name.assign(1, '*');
5820 child_name += parent_name;
5821 }
5822
5823 // We have a pointer to an simple type
5824 if (idx == 0 && pointee_clang_type.GetCompleteType())
5825 {
5826 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5827 child_byte_offset = 0;
5828 return pointee_clang_type;
5829 }
5830 }
5831 }
5832 break;
5833
5834 case clang::Type::Vector:
5835 case clang::Type::ExtVector:
5836 if (idx_is_valid)
5837 {
5838 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
5839 if (array)
5840 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005841 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005842 if (element_type.GetCompleteType())
5843 {
5844 char element_name[64];
5845 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
5846 child_name.assign(element_name);
5847 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5848 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
5849 return element_type;
5850 }
5851 }
5852 }
5853 break;
5854
5855 case clang::Type::ConstantArray:
5856 case clang::Type::IncompleteArray:
5857 if (ignore_array_bounds || idx_is_valid)
5858 {
5859 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
5860 if (array)
5861 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005862 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005863 if (element_type.GetCompleteType())
5864 {
5865 char element_name[64];
5866 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
5867 child_name.assign(element_name);
5868 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5869 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
5870 return element_type;
5871 }
5872 }
5873 }
5874 break;
5875
5876
5877 case clang::Type::Pointer:
5878 if (idx_is_valid)
5879 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005880 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00005881
5882 // Don't dereference "void *" pointers
5883 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00005884 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005885
5886 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
5887 {
5888 child_is_deref_of_parent = false;
5889 bool tmp_child_is_deref_of_parent = false;
5890 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5891 idx,
5892 transparent_pointers,
5893 omit_empty_base_classes,
5894 ignore_array_bounds,
5895 child_name,
5896 child_byte_size,
5897 child_byte_offset,
5898 child_bitfield_bit_size,
5899 child_bitfield_bit_offset,
5900 child_is_base_class,
5901 tmp_child_is_deref_of_parent,
5902 valobj);
5903 }
5904 else
5905 {
5906 child_is_deref_of_parent = true;
5907
5908 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5909 if (parent_name)
5910 {
5911 child_name.assign(1, '*');
5912 child_name += parent_name;
5913 }
5914
5915 // We have a pointer to an simple type
5916 if (idx == 0)
5917 {
5918 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5919 child_byte_offset = 0;
5920 return pointee_clang_type;
5921 }
5922 }
5923 }
5924 break;
5925
5926 case clang::Type::LValueReference:
5927 case clang::Type::RValueReference:
5928 if (idx_is_valid)
5929 {
5930 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00005931 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005932 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
5933 {
5934 child_is_deref_of_parent = false;
5935 bool tmp_child_is_deref_of_parent = false;
5936 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5937 idx,
5938 transparent_pointers,
5939 omit_empty_base_classes,
5940 ignore_array_bounds,
5941 child_name,
5942 child_byte_size,
5943 child_byte_offset,
5944 child_bitfield_bit_size,
5945 child_bitfield_bit_offset,
5946 child_is_base_class,
5947 tmp_child_is_deref_of_parent,
5948 valobj);
5949 }
5950 else
5951 {
5952 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5953 if (parent_name)
5954 {
5955 child_name.assign(1, '&');
5956 child_name += parent_name;
5957 }
5958
5959 // We have a pointer to an simple type
5960 if (idx == 0)
5961 {
5962 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5963 child_byte_offset = 0;
5964 return pointee_clang_type;
5965 }
5966 }
5967 }
5968 break;
5969
5970 case clang::Type::Typedef:
5971 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005972 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005973 return typedefed_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5974 idx,
5975 transparent_pointers,
5976 omit_empty_base_classes,
5977 ignore_array_bounds,
5978 child_name,
5979 child_byte_size,
5980 child_byte_offset,
5981 child_bitfield_bit_size,
5982 child_bitfield_bit_offset,
5983 child_is_base_class,
5984 child_is_deref_of_parent,
5985 valobj);
5986 }
5987 break;
5988
5989 case clang::Type::Elaborated:
5990 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005991 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005992 return elaborated_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5993 idx,
5994 transparent_pointers,
5995 omit_empty_base_classes,
5996 ignore_array_bounds,
5997 child_name,
5998 child_byte_size,
5999 child_byte_offset,
6000 child_bitfield_bit_size,
6001 child_bitfield_bit_offset,
6002 child_is_base_class,
6003 child_is_deref_of_parent,
6004 valobj);
6005 }
6006
6007 case clang::Type::Paren:
6008 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006009 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00006010 return paren_clang_type.GetChildClangTypeAtIndex (exe_ctx,
6011 idx,
6012 transparent_pointers,
6013 omit_empty_base_classes,
6014 ignore_array_bounds,
6015 child_name,
6016 child_byte_size,
6017 child_byte_offset,
6018 child_bitfield_bit_size,
6019 child_bitfield_bit_offset,
6020 child_is_base_class,
6021 child_is_deref_of_parent,
6022 valobj);
6023 }
6024
6025
6026 default:
6027 break;
6028 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006029 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006030}
6031
6032static uint32_t
6033GetIndexForRecordBase
6034(
6035 const clang::RecordDecl *record_decl,
6036 const clang::CXXBaseSpecifier *base_spec,
6037 bool omit_empty_base_classes
6038 )
6039{
6040 uint32_t child_idx = 0;
6041
6042 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6043
6044 // const char *super_name = record_decl->getNameAsCString();
6045 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6046 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6047 //
6048 if (cxx_record_decl)
6049 {
6050 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6051 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6052 base_class != base_class_end;
6053 ++base_class)
6054 {
6055 if (omit_empty_base_classes)
6056 {
6057 if (BaseSpecifierIsEmpty (base_class))
6058 continue;
6059 }
6060
6061 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6062 // child_idx,
6063 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6064 //
6065 //
6066 if (base_class == base_spec)
6067 return child_idx;
6068 ++child_idx;
6069 }
6070 }
6071
6072 return UINT32_MAX;
6073}
6074
6075
6076static uint32_t
6077GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6078 clang::NamedDecl *canonical_decl,
6079 bool omit_empty_base_classes)
6080{
6081 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6082 omit_empty_base_classes);
6083
6084 clang::RecordDecl::field_iterator field, field_end;
6085 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6086 field != field_end;
6087 ++field, ++child_idx)
6088 {
6089 if (field->getCanonicalDecl() == canonical_decl)
6090 return child_idx;
6091 }
6092
6093 return UINT32_MAX;
6094}
6095
6096// Look for a child member (doesn't include base classes, but it does include
6097// their members) in the type hierarchy. Returns an index path into "clang_type"
6098// on how to reach the appropriate member.
6099//
6100// class A
6101// {
6102// public:
6103// int m_a;
6104// int m_b;
6105// };
6106//
6107// class B
6108// {
6109// };
6110//
6111// class C :
6112// public B,
6113// public A
6114// {
6115// };
6116//
6117// If we have a clang type that describes "class C", and we wanted to looked
6118// "m_b" in it:
6119//
6120// With omit_empty_base_classes == false we would get an integer array back with:
6121// { 1, 1 }
6122// The first index 1 is the child index for "class A" within class C
6123// The second index 1 is the child index for "m_b" within class A
6124//
6125// With omit_empty_base_classes == true we would get an integer array back with:
6126// { 0, 1 }
6127// 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)
6128// The second index 1 is the child index for "m_b" within class A
6129
6130size_t
6131ClangASTContext::GetIndexOfChildMemberWithName (void* type, const char *name,
6132 bool omit_empty_base_classes,
6133 std::vector<uint32_t>& child_indexes)
6134{
6135 if (type && name && name[0])
6136 {
6137 clang::QualType qual_type(GetCanonicalQualType(type));
6138 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6139 switch (type_class)
6140 {
6141 case clang::Type::Record:
6142 if (GetCompleteType(type))
6143 {
6144 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6145 const clang::RecordDecl *record_decl = record_type->getDecl();
6146
6147 assert(record_decl);
6148 uint32_t child_idx = 0;
6149
6150 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6151
6152 // Try and find a field that matches NAME
6153 clang::RecordDecl::field_iterator field, field_end;
6154 llvm::StringRef name_sref(name);
6155 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6156 field != field_end;
6157 ++field, ++child_idx)
6158 {
6159 llvm::StringRef field_name = field->getName();
6160 if (field_name.empty())
6161 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006162 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006163 child_indexes.push_back(child_idx);
6164 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
6165 return child_indexes.size();
6166 child_indexes.pop_back();
6167
6168 }
6169 else if (field_name.equals (name_sref))
6170 {
6171 // We have to add on the number of base classes to this index!
6172 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
6173 return child_indexes.size();
6174 }
6175 }
6176
6177 if (cxx_record_decl)
6178 {
6179 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6180
6181 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6182
6183 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6184 // Didn't find things easily, lets let clang do its thang...
6185 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
6186 clang::DeclarationName decl_name(&ident_ref);
6187
6188 clang::CXXBasePaths paths;
6189 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
6190 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
6191 },
6192 paths))
6193 {
6194 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
6195 for (path = paths.begin(); path != path_end; ++path)
6196 {
6197 const size_t num_path_elements = path->size();
6198 for (size_t e=0; e<num_path_elements; ++e)
6199 {
6200 clang::CXXBasePathElement elem = (*path)[e];
6201
6202 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
6203 if (child_idx == UINT32_MAX)
6204 {
6205 child_indexes.clear();
6206 return 0;
6207 }
6208 else
6209 {
6210 child_indexes.push_back (child_idx);
6211 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
6212 }
6213 }
6214 for (clang::NamedDecl *path_decl : path->Decls)
6215 {
6216 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
6217 if (child_idx == UINT32_MAX)
6218 {
6219 child_indexes.clear();
6220 return 0;
6221 }
6222 else
6223 {
6224 child_indexes.push_back (child_idx);
6225 }
6226 }
6227 }
6228 return child_indexes.size();
6229 }
6230 }
6231
6232 }
6233 break;
6234
6235 case clang::Type::ObjCObject:
6236 case clang::Type::ObjCInterface:
6237 if (GetCompleteType(type))
6238 {
6239 llvm::StringRef name_sref(name);
6240 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6241 assert (objc_class_type);
6242 if (objc_class_type)
6243 {
6244 uint32_t child_idx = 0;
6245 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6246
6247 if (class_interface_decl)
6248 {
6249 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6250 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6251
6252 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6253 {
6254 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6255
6256 if (ivar_decl->getName().equals (name_sref))
6257 {
6258 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6259 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6260 ++child_idx;
6261
6262 child_indexes.push_back (child_idx);
6263 return child_indexes.size();
6264 }
6265 }
6266
6267 if (superclass_interface_decl)
6268 {
6269 // The super class index is always zero for ObjC classes,
6270 // so we push it onto the child indexes in case we find
6271 // an ivar in our superclass...
6272 child_indexes.push_back (0);
6273
Greg Claytona1e5dc82015-08-11 22:53:00 +00006274 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006275 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
6276 omit_empty_base_classes,
6277 child_indexes))
6278 {
6279 // We did find an ivar in a superclass so just
6280 // return the results!
6281 return child_indexes.size();
6282 }
6283
6284 // We didn't find an ivar matching "name" in our
6285 // superclass, pop the superclass zero index that
6286 // we pushed on above.
6287 child_indexes.pop_back();
6288 }
6289 }
6290 }
6291 }
6292 break;
6293
6294 case clang::Type::ObjCObjectPointer:
6295 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006296 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006297 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
6298 omit_empty_base_classes,
6299 child_indexes);
6300 }
6301 break;
6302
6303
6304 case clang::Type::ConstantArray:
6305 {
6306 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6307 // const uint64_t element_count = array->getSize().getLimitedValue();
6308 //
6309 // if (idx < element_count)
6310 // {
6311 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6312 //
6313 // char element_name[32];
6314 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6315 //
6316 // child_name.assign(element_name);
6317 // assert(field_type_info.first % 8 == 0);
6318 // child_byte_size = field_type_info.first / 8;
6319 // child_byte_offset = idx * child_byte_size;
6320 // return array->getElementType().getAsOpaquePtr();
6321 // }
6322 }
6323 break;
6324
6325 // case clang::Type::MemberPointerType:
6326 // {
6327 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6328 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6329 //
6330 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6331 // {
6332 // return GetIndexOfChildWithName (ast,
6333 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6334 // name);
6335 // }
6336 // }
6337 // break;
6338 //
6339 case clang::Type::LValueReference:
6340 case clang::Type::RValueReference:
6341 {
6342 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6343 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006344 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006345
6346 if (pointee_clang_type.IsAggregateType ())
6347 {
6348 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6349 omit_empty_base_classes,
6350 child_indexes);
6351 }
6352 }
6353 break;
6354
6355 case clang::Type::Pointer:
6356 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006357 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006358
6359 if (pointee_clang_type.IsAggregateType ())
6360 {
6361 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6362 omit_empty_base_classes,
6363 child_indexes);
6364 }
6365 }
6366 break;
6367
6368 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006369 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006370 omit_empty_base_classes,
6371 child_indexes);
6372
6373 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006374 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006375 omit_empty_base_classes,
6376 child_indexes);
6377
6378 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006379 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006380 omit_empty_base_classes,
6381 child_indexes);
6382
6383 default:
6384 break;
6385 }
6386 }
6387 return 0;
6388}
6389
6390
6391// Get the index of the child of "clang_type" whose name matches. This function
6392// doesn't descend into the children, but only looks one level deep and name
6393// matches can include base class names.
6394
6395uint32_t
6396ClangASTContext::GetIndexOfChildWithName (void* type, const char *name, bool omit_empty_base_classes)
6397{
6398 if (type && name && name[0])
6399 {
6400 clang::QualType qual_type(GetCanonicalQualType(type));
6401
6402 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6403
6404 switch (type_class)
6405 {
6406 case clang::Type::Record:
6407 if (GetCompleteType(type))
6408 {
6409 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6410 const clang::RecordDecl *record_decl = record_type->getDecl();
6411
6412 assert(record_decl);
6413 uint32_t child_idx = 0;
6414
6415 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6416
6417 if (cxx_record_decl)
6418 {
6419 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6420 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6421 base_class != base_class_end;
6422 ++base_class)
6423 {
6424 // Skip empty base classes
6425 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6426 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
6427 continue;
6428
Greg Claytona1e5dc82015-08-11 22:53:00 +00006429 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006430 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
6431 if (base_class_type_name.compare (name) == 0)
6432 return child_idx;
6433 ++child_idx;
6434 }
6435 }
6436
6437 // Try and find a field that matches NAME
6438 clang::RecordDecl::field_iterator field, field_end;
6439 llvm::StringRef name_sref(name);
6440 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6441 field != field_end;
6442 ++field, ++child_idx)
6443 {
6444 if (field->getName().equals (name_sref))
6445 return child_idx;
6446 }
6447
6448 }
6449 break;
6450
6451 case clang::Type::ObjCObject:
6452 case clang::Type::ObjCInterface:
6453 if (GetCompleteType(type))
6454 {
6455 llvm::StringRef name_sref(name);
6456 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6457 assert (objc_class_type);
6458 if (objc_class_type)
6459 {
6460 uint32_t child_idx = 0;
6461 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6462
6463 if (class_interface_decl)
6464 {
6465 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6466 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6467
6468 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6469 {
6470 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6471
6472 if (ivar_decl->getName().equals (name_sref))
6473 {
6474 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6475 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6476 ++child_idx;
6477
6478 return child_idx;
6479 }
6480 }
6481
6482 if (superclass_interface_decl)
6483 {
6484 if (superclass_interface_decl->getName().equals (name_sref))
6485 return 0;
6486 }
6487 }
6488 }
6489 }
6490 break;
6491
6492 case clang::Type::ObjCObjectPointer:
6493 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006494 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006495 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6496 }
6497 break;
6498
6499 case clang::Type::ConstantArray:
6500 {
6501 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6502 // const uint64_t element_count = array->getSize().getLimitedValue();
6503 //
6504 // if (idx < element_count)
6505 // {
6506 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6507 //
6508 // char element_name[32];
6509 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6510 //
6511 // child_name.assign(element_name);
6512 // assert(field_type_info.first % 8 == 0);
6513 // child_byte_size = field_type_info.first / 8;
6514 // child_byte_offset = idx * child_byte_size;
6515 // return array->getElementType().getAsOpaquePtr();
6516 // }
6517 }
6518 break;
6519
6520 // case clang::Type::MemberPointerType:
6521 // {
6522 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6523 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6524 //
6525 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6526 // {
6527 // return GetIndexOfChildWithName (ast,
6528 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6529 // name);
6530 // }
6531 // }
6532 // break;
6533 //
6534 case clang::Type::LValueReference:
6535 case clang::Type::RValueReference:
6536 {
6537 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006538 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006539
6540 if (pointee_type.IsAggregateType ())
6541 {
6542 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6543 }
6544 }
6545 break;
6546
6547 case clang::Type::Pointer:
6548 {
6549 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006550 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006551
6552 if (pointee_type.IsAggregateType ())
6553 {
6554 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6555 }
6556 else
6557 {
6558 // if (parent_name)
6559 // {
6560 // child_name.assign(1, '*');
6561 // child_name += parent_name;
6562 // }
6563 //
6564 // // We have a pointer to an simple type
6565 // if (idx == 0)
6566 // {
6567 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
6568 // assert(clang_type_info.first % 8 == 0);
6569 // child_byte_size = clang_type_info.first / 8;
6570 // child_byte_offset = 0;
6571 // return pointee_type.getAsOpaquePtr();
6572 // }
6573 }
6574 }
6575 break;
6576
6577 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006578 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006579
6580 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006581 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006582
6583 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006584 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006585
6586 default:
6587 break;
6588 }
6589 }
6590 return UINT32_MAX;
6591}
6592
6593
6594size_t
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006595ClangASTContext::GetNumTemplateArguments (void* type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006596{
6597 if (!type)
6598 return 0;
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006599
6600 clang::QualType qual_type (GetCanonicalQualType(type));
6601 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6602 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00006603 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006604 case clang::Type::Record:
6605 if (GetCompleteType(type))
6606 {
6607 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6608 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00006609 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006610 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6611 if (template_decl)
6612 return template_decl->getTemplateArgs().size();
Greg Claytond8d4a572015-08-11 21:38:15 +00006613 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006614 }
6615 break;
6616
6617 case clang::Type::Typedef:
6618 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
6619
6620 case clang::Type::Elaborated:
6621 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
6622
6623 case clang::Type::Paren:
6624 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
6625
6626 default:
6627 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006628 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006629
Greg Claytond8d4a572015-08-11 21:38:15 +00006630 return 0;
6631}
6632
Greg Claytona1e5dc82015-08-11 22:53:00 +00006633CompilerType
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006634ClangASTContext::GetTemplateArgument (void* type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00006635{
6636 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00006637 return CompilerType();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006638
6639 clang::QualType qual_type (GetCanonicalQualType(type));
6640 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6641 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00006642 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006643 case clang::Type::Record:
6644 if (GetCompleteType(type))
6645 {
6646 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6647 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00006648 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006649 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6650 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
Greg Claytond8d4a572015-08-11 21:38:15 +00006651 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006652 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
6653 switch (template_arg.getKind())
Greg Claytond8d4a572015-08-11 21:38:15 +00006654 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006655 case clang::TemplateArgument::Null:
6656 kind = eTemplateArgumentKindNull;
6657 return CompilerType();
6658
6659 case clang::TemplateArgument::Type:
6660 kind = eTemplateArgumentKindType;
6661 return CompilerType(getASTContext(), template_arg.getAsType());
6662
6663 case clang::TemplateArgument::Declaration:
6664 kind = eTemplateArgumentKindDeclaration;
6665 return CompilerType();
6666
6667 case clang::TemplateArgument::Integral:
6668 kind = eTemplateArgumentKindIntegral;
6669 return CompilerType(getASTContext(), template_arg.getIntegralType());
6670
6671 case clang::TemplateArgument::Template:
6672 kind = eTemplateArgumentKindTemplate;
6673 return CompilerType();
6674
6675 case clang::TemplateArgument::TemplateExpansion:
6676 kind = eTemplateArgumentKindTemplateExpansion;
6677 return CompilerType();
6678
6679 case clang::TemplateArgument::Expression:
6680 kind = eTemplateArgumentKindExpression;
6681 return CompilerType();
6682
6683 case clang::TemplateArgument::Pack:
6684 kind = eTemplateArgumentKindPack;
6685 return CompilerType();
6686
6687 default:
6688 assert (!"Unhandled clang::TemplateArgument::ArgKind");
6689 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006690 }
6691 }
6692 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006693 }
6694 break;
6695
6696 case clang::Type::Typedef:
6697 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
6698
6699 case clang::Type::Elaborated:
6700 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
6701
6702 case clang::Type::Paren:
6703 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
6704
6705 default:
6706 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006707 }
6708 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006709 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00006710}
6711
6712static bool
6713IsOperator (const char *name, clang::OverloadedOperatorKind &op_kind)
6714{
6715 if (name == nullptr || name[0] == '\0')
6716 return false;
6717
6718#define OPERATOR_PREFIX "operator"
6719#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
6720
6721 const char *post_op_name = nullptr;
6722
6723 bool no_space = true;
6724
6725 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
6726 return false;
6727
6728 post_op_name = name + OPERATOR_PREFIX_LENGTH;
6729
6730 if (post_op_name[0] == ' ')
6731 {
6732 post_op_name++;
6733 no_space = false;
6734 }
6735
6736#undef OPERATOR_PREFIX
6737#undef OPERATOR_PREFIX_LENGTH
6738
6739 // This is an operator, set the overloaded operator kind to invalid
6740 // in case this is a conversion operator...
6741 op_kind = clang::NUM_OVERLOADED_OPERATORS;
6742
6743 switch (post_op_name[0])
6744 {
6745 default:
6746 if (no_space)
6747 return false;
6748 break;
6749 case 'n':
6750 if (no_space)
6751 return false;
6752 if (strcmp (post_op_name, "new") == 0)
6753 op_kind = clang::OO_New;
6754 else if (strcmp (post_op_name, "new[]") == 0)
6755 op_kind = clang::OO_Array_New;
6756 break;
6757
6758 case 'd':
6759 if (no_space)
6760 return false;
6761 if (strcmp (post_op_name, "delete") == 0)
6762 op_kind = clang::OO_Delete;
6763 else if (strcmp (post_op_name, "delete[]") == 0)
6764 op_kind = clang::OO_Array_Delete;
6765 break;
6766
6767 case '+':
6768 if (post_op_name[1] == '\0')
6769 op_kind = clang::OO_Plus;
6770 else if (post_op_name[2] == '\0')
6771 {
6772 if (post_op_name[1] == '=')
6773 op_kind = clang::OO_PlusEqual;
6774 else if (post_op_name[1] == '+')
6775 op_kind = clang::OO_PlusPlus;
6776 }
6777 break;
6778
6779 case '-':
6780 if (post_op_name[1] == '\0')
6781 op_kind = clang::OO_Minus;
6782 else if (post_op_name[2] == '\0')
6783 {
6784 switch (post_op_name[1])
6785 {
6786 case '=': op_kind = clang::OO_MinusEqual; break;
6787 case '-': op_kind = clang::OO_MinusMinus; break;
6788 case '>': op_kind = clang::OO_Arrow; break;
6789 }
6790 }
6791 else if (post_op_name[3] == '\0')
6792 {
6793 if (post_op_name[2] == '*')
6794 op_kind = clang::OO_ArrowStar; break;
6795 }
6796 break;
6797
6798 case '*':
6799 if (post_op_name[1] == '\0')
6800 op_kind = clang::OO_Star;
6801 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6802 op_kind = clang::OO_StarEqual;
6803 break;
6804
6805 case '/':
6806 if (post_op_name[1] == '\0')
6807 op_kind = clang::OO_Slash;
6808 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6809 op_kind = clang::OO_SlashEqual;
6810 break;
6811
6812 case '%':
6813 if (post_op_name[1] == '\0')
6814 op_kind = clang::OO_Percent;
6815 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6816 op_kind = clang::OO_PercentEqual;
6817 break;
6818
6819
6820 case '^':
6821 if (post_op_name[1] == '\0')
6822 op_kind = clang::OO_Caret;
6823 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6824 op_kind = clang::OO_CaretEqual;
6825 break;
6826
6827 case '&':
6828 if (post_op_name[1] == '\0')
6829 op_kind = clang::OO_Amp;
6830 else if (post_op_name[2] == '\0')
6831 {
6832 switch (post_op_name[1])
6833 {
6834 case '=': op_kind = clang::OO_AmpEqual; break;
6835 case '&': op_kind = clang::OO_AmpAmp; break;
6836 }
6837 }
6838 break;
6839
6840 case '|':
6841 if (post_op_name[1] == '\0')
6842 op_kind = clang::OO_Pipe;
6843 else if (post_op_name[2] == '\0')
6844 {
6845 switch (post_op_name[1])
6846 {
6847 case '=': op_kind = clang::OO_PipeEqual; break;
6848 case '|': op_kind = clang::OO_PipePipe; break;
6849 }
6850 }
6851 break;
6852
6853 case '~':
6854 if (post_op_name[1] == '\0')
6855 op_kind = clang::OO_Tilde;
6856 break;
6857
6858 case '!':
6859 if (post_op_name[1] == '\0')
6860 op_kind = clang::OO_Exclaim;
6861 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6862 op_kind = clang::OO_ExclaimEqual;
6863 break;
6864
6865 case '=':
6866 if (post_op_name[1] == '\0')
6867 op_kind = clang::OO_Equal;
6868 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6869 op_kind = clang::OO_EqualEqual;
6870 break;
6871
6872 case '<':
6873 if (post_op_name[1] == '\0')
6874 op_kind = clang::OO_Less;
6875 else if (post_op_name[2] == '\0')
6876 {
6877 switch (post_op_name[1])
6878 {
6879 case '<': op_kind = clang::OO_LessLess; break;
6880 case '=': op_kind = clang::OO_LessEqual; break;
6881 }
6882 }
6883 else if (post_op_name[3] == '\0')
6884 {
6885 if (post_op_name[2] == '=')
6886 op_kind = clang::OO_LessLessEqual;
6887 }
6888 break;
6889
6890 case '>':
6891 if (post_op_name[1] == '\0')
6892 op_kind = clang::OO_Greater;
6893 else if (post_op_name[2] == '\0')
6894 {
6895 switch (post_op_name[1])
6896 {
6897 case '>': op_kind = clang::OO_GreaterGreater; break;
6898 case '=': op_kind = clang::OO_GreaterEqual; break;
6899 }
6900 }
6901 else if (post_op_name[1] == '>' &&
6902 post_op_name[2] == '=' &&
6903 post_op_name[3] == '\0')
6904 {
6905 op_kind = clang::OO_GreaterGreaterEqual;
6906 }
6907 break;
6908
6909 case ',':
6910 if (post_op_name[1] == '\0')
6911 op_kind = clang::OO_Comma;
6912 break;
6913
6914 case '(':
6915 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
6916 op_kind = clang::OO_Call;
6917 break;
6918
6919 case '[':
6920 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
6921 op_kind = clang::OO_Subscript;
6922 break;
6923 }
6924
6925 return true;
6926}
6927
6928clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006929ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006930{
6931 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
6932 if (enutype)
6933 return enutype->getDecl();
6934 return NULL;
6935}
6936
6937clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006938ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006939{
6940 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(GetCanonicalQualType(type));
6941 if (record_type)
6942 return record_type->getDecl();
6943 return nullptr;
6944}
6945
6946clang::CXXRecordDecl *
6947ClangASTContext::GetAsCXXRecordDecl (void* type)
6948{
6949 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
6950}
6951
6952clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006953ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006954{
6955 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(GetCanonicalQualType(type));
6956 if (objc_class_type)
6957 return objc_class_type->getInterface();
6958 return nullptr;
6959}
6960
6961clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006962ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
6963 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00006964 AccessType access,
6965 uint32_t bitfield_bit_size)
6966{
6967 if (!type.IsValid() || !field_clang_type.IsValid())
6968 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00006969 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00006970 if (!ast)
6971 return nullptr;
6972 clang::ASTContext* clang_ast = ast->getASTContext();
6973
6974 clang::FieldDecl *field = nullptr;
6975
6976 clang::Expr *bit_width = nullptr;
6977 if (bitfield_bit_size != 0)
6978 {
6979 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
6980 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
6981 }
6982
6983 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
6984 if (record_decl)
6985 {
6986 field = clang::FieldDecl::Create (*clang_ast,
6987 record_decl,
6988 clang::SourceLocation(),
6989 clang::SourceLocation(),
6990 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
6991 GetQualType(field_clang_type), // Field type
6992 nullptr, // TInfo *
6993 bit_width, // BitWidth
6994 false, // Mutable
6995 clang::ICIS_NoInit); // HasInit
6996
6997 if (!name)
6998 {
6999 // Determine whether this field corresponds to an anonymous
7000 // struct or union.
7001 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
7002 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
7003 if (!Rec->getDeclName()) {
7004 Rec->setAnonymousStructOrUnion(true);
7005 field->setImplicit();
7006
7007 }
7008 }
7009 }
7010
7011 if (field)
7012 {
7013 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7014
7015 record_decl->addDecl(field);
7016
7017#ifdef LLDB_CONFIGURATION_DEBUG
7018 VerifyDecl(field);
7019#endif
7020 }
7021 }
7022 else
7023 {
7024 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7025
7026 if (class_interface_decl)
7027 {
7028 const bool is_synthesized = false;
7029
7030 field_clang_type.GetCompleteType();
7031
7032 field = clang::ObjCIvarDecl::Create (*clang_ast,
7033 class_interface_decl,
7034 clang::SourceLocation(),
7035 clang::SourceLocation(),
7036 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7037 GetQualType(field_clang_type), // Field type
7038 nullptr, // TypeSourceInfo *
7039 ConvertAccessTypeToObjCIvarAccessControl (access),
7040 bit_width,
7041 is_synthesized);
7042
7043 if (field)
7044 {
7045 class_interface_decl->addDecl(field);
7046
7047#ifdef LLDB_CONFIGURATION_DEBUG
7048 VerifyDecl(field);
7049#endif
7050 }
7051 }
7052 }
7053 return field;
7054}
7055
7056void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007057ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007058{
Greg Claytonf73034f2015-09-08 18:15:05 +00007059 if (!type)
7060 return;
7061
7062 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007063 if (!ast)
7064 return;
7065
7066 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7067
7068 if (!record_decl)
7069 return;
7070
7071 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7072
7073 IndirectFieldVector indirect_fields;
7074 clang::RecordDecl::field_iterator field_pos;
7075 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7076 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7077 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7078 {
7079 if (field_pos->isAnonymousStructOrUnion())
7080 {
7081 clang::QualType field_qual_type = field_pos->getType();
7082
7083 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7084
7085 if (!field_record_type)
7086 continue;
7087
7088 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7089
7090 if (!field_record_decl)
7091 continue;
7092
7093 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7094 di != de;
7095 ++di)
7096 {
7097 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7098 {
7099 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7100 chain[0] = *field_pos;
7101 chain[1] = nested_field_decl;
7102 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7103 record_decl,
7104 clang::SourceLocation(),
7105 nested_field_decl->getIdentifier(),
7106 nested_field_decl->getType(),
7107 chain,
7108 2);
7109
7110 indirect_field->setImplicit();
7111
7112 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7113 nested_field_decl->getAccess()));
7114
7115 indirect_fields.push_back(indirect_field);
7116 }
7117 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7118 {
7119 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
7120 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7121 chain[0] = *field_pos;
7122
7123 int chain_index = 1;
7124 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7125 nce = nested_indirect_field_decl->chain_end();
7126 nci < nce;
7127 ++nci)
7128 {
7129 chain[chain_index] = *nci;
7130 chain_index++;
7131 }
7132
7133 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7134 record_decl,
7135 clang::SourceLocation(),
7136 nested_indirect_field_decl->getIdentifier(),
7137 nested_indirect_field_decl->getType(),
7138 chain,
7139 nested_chain_size + 1);
7140
7141 indirect_field->setImplicit();
7142
7143 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7144 nested_indirect_field_decl->getAccess()));
7145
7146 indirect_fields.push_back(indirect_field);
7147 }
7148 }
7149 }
7150 }
7151
7152 // Check the last field to see if it has an incomplete array type as its
7153 // last member and if it does, the tell the record decl about it
7154 if (last_field_pos != field_end_pos)
7155 {
7156 if (last_field_pos->getType()->isIncompleteArrayType())
7157 record_decl->hasFlexibleArrayMember();
7158 }
7159
7160 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7161 ifi < ife;
7162 ++ifi)
7163 {
7164 record_decl->addDecl(*ifi);
7165 }
7166}
7167
7168void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007169ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007170{
Greg Claytonf73034f2015-09-08 18:15:05 +00007171 if (type)
7172 {
7173 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7174 if (ast)
7175 {
7176 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007177
Greg Claytonf73034f2015-09-08 18:15:05 +00007178 if (!record_decl)
7179 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00007180
Greg Claytonf73034f2015-09-08 18:15:05 +00007181 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*ast->getASTContext()));
7182 }
7183 }
Greg Claytond8d4a572015-08-11 21:38:15 +00007184}
7185
7186clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007187ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7188 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007189 AccessType access)
7190{
7191 clang::VarDecl *var_decl = nullptr;
7192
7193 if (!type.IsValid() || !var_type.IsValid())
7194 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007195 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007196 if (!ast)
7197 return nullptr;
7198
7199 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7200 if (record_decl)
7201 {
7202 var_decl = clang::VarDecl::Create (*ast->getASTContext(), // ASTContext &
7203 record_decl, // DeclContext *
7204 clang::SourceLocation(), // clang::SourceLocation StartLoc
7205 clang::SourceLocation(), // clang::SourceLocation IdLoc
7206 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7207 GetQualType(var_type), // Variable clang::QualType
7208 nullptr, // TypeSourceInfo *
7209 clang::SC_Static); // StorageClass
7210 if (var_decl)
7211 {
7212 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7213 record_decl->addDecl(var_decl);
7214
7215#ifdef LLDB_CONFIGURATION_DEBUG
7216 VerifyDecl(var_decl);
7217#endif
7218 }
7219 }
7220 return var_decl;
7221}
7222
7223
7224clang::CXXMethodDecl *
7225ClangASTContext::AddMethodToCXXRecordType (void* type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007226 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007227 lldb::AccessType access,
7228 bool is_virtual,
7229 bool is_static,
7230 bool is_inline,
7231 bool is_explicit,
7232 bool is_attr_used,
7233 bool is_artificial)
7234{
7235 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7236 return nullptr;
7237
7238 clang::QualType record_qual_type(GetCanonicalQualType(type));
7239
7240 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7241
7242 if (cxx_record_decl == nullptr)
7243 return nullptr;
7244
7245 clang::QualType method_qual_type (GetQualType(method_clang_type));
7246
7247 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7248
7249 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7250
7251 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7252
7253 if (function_type == nullptr)
7254 return nullptr;
7255
7256 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7257
7258 if (!method_function_prototype)
7259 return nullptr;
7260
7261 unsigned int num_params = method_function_prototype->getNumParams();
7262
7263 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7264 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7265
7266 if (is_artificial)
7267 return nullptr; // skip everything artificial
7268
7269 if (name[0] == '~')
7270 {
7271 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7272 cxx_record_decl,
7273 clang::SourceLocation(),
7274 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7275 method_qual_type,
7276 nullptr,
7277 is_inline,
7278 is_artificial);
7279 cxx_method_decl = cxx_dtor_decl;
7280 }
7281 else if (decl_name == cxx_record_decl->getDeclName())
7282 {
7283 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
7284 cxx_record_decl,
7285 clang::SourceLocation(),
7286 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7287 method_qual_type,
7288 nullptr, // TypeSourceInfo *
7289 is_explicit,
7290 is_inline,
7291 is_artificial,
7292 false /*is_constexpr*/);
7293 cxx_method_decl = cxx_ctor_decl;
7294 }
7295 else
7296 {
7297 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7298 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7299
7300 if (IsOperator (name, op_kind))
7301 {
7302 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
7303 {
7304 // Check the number of operator parameters. Sometimes we have
7305 // seen bad DWARF that doesn't correctly describe operators and
7306 // if we try to create a method and add it to the class, clang
7307 // will assert and crash, so we need to make sure things are
7308 // acceptable.
7309 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
7310 return nullptr;
7311 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7312 cxx_record_decl,
7313 clang::SourceLocation(),
7314 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
7315 method_qual_type,
7316 nullptr, // TypeSourceInfo *
7317 SC,
7318 is_inline,
7319 false /*is_constexpr*/,
7320 clang::SourceLocation());
7321 }
7322 else if (num_params == 0)
7323 {
7324 // Conversion operators don't take params...
7325 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
7326 cxx_record_decl,
7327 clang::SourceLocation(),
7328 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
7329 method_qual_type,
7330 nullptr, // TypeSourceInfo *
7331 is_inline,
7332 is_explicit,
7333 false /*is_constexpr*/,
7334 clang::SourceLocation());
7335 }
7336 }
7337
7338 if (cxx_method_decl == nullptr)
7339 {
7340 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7341 cxx_record_decl,
7342 clang::SourceLocation(),
7343 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
7344 method_qual_type,
7345 nullptr, // TypeSourceInfo *
7346 SC,
7347 is_inline,
7348 false /*is_constexpr*/,
7349 clang::SourceLocation());
7350 }
7351 }
7352
7353 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
7354
7355 cxx_method_decl->setAccess (access_specifier);
7356 cxx_method_decl->setVirtualAsWritten (is_virtual);
7357
7358 if (is_attr_used)
7359 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
7360
7361 // Populate the method decl with parameter decls
7362
7363 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7364
7365 for (unsigned param_index = 0;
7366 param_index < num_params;
7367 ++param_index)
7368 {
7369 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
7370 cxx_method_decl,
7371 clang::SourceLocation(),
7372 clang::SourceLocation(),
7373 nullptr, // anonymous
7374 method_function_prototype->getParamType(param_index),
7375 nullptr,
7376 clang::SC_None,
7377 nullptr));
7378 }
7379
7380 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
7381
7382 cxx_record_decl->addDecl (cxx_method_decl);
7383
7384 // Sometimes the debug info will mention a constructor (default/copy/move),
7385 // destructor, or assignment operator (copy/move) but there won't be any
7386 // version of this in the code. So we check if the function was artificially
7387 // generated and if it is trivial and this lets the compiler/backend know
7388 // that it can inline the IR for these when it needs to and we can avoid a
7389 // "missing function" error when running expressions.
7390
7391 if (is_artificial)
7392 {
7393 if (cxx_ctor_decl &&
7394 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
7395 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
7396 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
7397 {
7398 cxx_ctor_decl->setDefaulted();
7399 cxx_ctor_decl->setTrivial(true);
7400 }
7401 else if (cxx_dtor_decl)
7402 {
7403 if (cxx_record_decl->hasTrivialDestructor())
7404 {
7405 cxx_dtor_decl->setDefaulted();
7406 cxx_dtor_decl->setTrivial(true);
7407 }
7408 }
7409 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
7410 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
7411 {
7412 cxx_method_decl->setDefaulted();
7413 cxx_method_decl->setTrivial(true);
7414 }
7415 }
7416
7417#ifdef LLDB_CONFIGURATION_DEBUG
7418 VerifyDecl(cxx_method_decl);
7419#endif
7420
7421 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
7422 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
7423 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
7424 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
7425 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
7426 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
7427 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
7428 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
7429 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
7430 return cxx_method_decl;
7431}
7432
7433
7434#pragma mark C++ Base Classes
7435
7436clang::CXXBaseSpecifier *
7437ClangASTContext::CreateBaseClassSpecifier (void* type, AccessType access, bool is_virtual, bool base_of_class)
7438{
7439 if (type)
7440 return new clang::CXXBaseSpecifier (clang::SourceRange(),
7441 is_virtual,
7442 base_of_class,
7443 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
7444 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
7445 clang::SourceLocation());
7446 return nullptr;
7447}
7448
7449void
7450ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
7451{
7452 for (unsigned i=0; i<num_base_classes; ++i)
7453 {
7454 delete base_classes[i];
7455 base_classes[i] = nullptr;
7456 }
7457}
7458
7459bool
7460ClangASTContext::SetBaseClassesForClassType (void* type, clang::CXXBaseSpecifier const * const *base_classes,
7461 unsigned num_base_classes)
7462{
7463 if (type)
7464 {
7465 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
7466 if (cxx_record_decl)
7467 {
7468 cxx_record_decl->setBases(base_classes, num_base_classes);
7469 return true;
7470 }
7471 }
7472 return false;
7473}
7474
7475bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007476ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007477{
Greg Claytonf73034f2015-09-08 18:15:05 +00007478 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007479 if (!ast)
7480 return false;
7481 clang::ASTContext* clang_ast = ast->getASTContext();
7482
7483 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
7484 {
7485 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7486 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
7487 if (class_interface_decl && super_interface_decl)
7488 {
7489 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
7490 return true;
7491 }
7492 }
7493 return false;
7494}
7495
7496bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007497ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007498 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007499 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007500 clang::ObjCIvarDecl *ivar_decl,
7501 const char *property_setter_name,
7502 const char *property_getter_name,
7503 uint32_t property_attributes,
7504 ClangASTMetadata *metadata)
7505{
7506 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
7507 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00007508 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007509 if (!ast)
7510 return false;
7511 clang::ASTContext* clang_ast = ast->getASTContext();
7512
7513 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7514
7515 if (class_interface_decl)
7516 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007517 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00007518
7519 if (property_clang_type.IsValid())
7520 property_clang_type_to_access = property_clang_type;
7521 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007522 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007523
7524 if (class_interface_decl && property_clang_type_to_access.IsValid())
7525 {
7526 clang::TypeSourceInfo *prop_type_source;
7527 if (ivar_decl)
7528 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
7529 else
7530 prop_type_source = clang_ast->getTrivialTypeSourceInfo (GetQualType(property_clang_type));
7531
7532 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create (*clang_ast,
7533 class_interface_decl,
7534 clang::SourceLocation(), // Source Location
7535 &clang_ast->Idents.get(property_name),
7536 clang::SourceLocation(), //Source Location for AT
7537 clang::SourceLocation(), //Source location for (
7538 ivar_decl ? ivar_decl->getType() : ClangASTContext::GetQualType(property_clang_type),
7539 prop_type_source);
7540
7541 if (property_decl)
7542 {
7543 if (metadata)
7544 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
7545
7546 class_interface_decl->addDecl (property_decl);
7547
7548 clang::Selector setter_sel, getter_sel;
7549
7550 if (property_setter_name != nullptr)
7551 {
7552 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
7553 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
7554 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7555 }
7556 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
7557 {
7558 std::string setter_sel_string("set");
7559 setter_sel_string.push_back(::toupper(property_name[0]));
7560 setter_sel_string.append(&property_name[1]);
7561 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
7562 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7563 }
7564 property_decl->setSetterName(setter_sel);
7565 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
7566
7567 if (property_getter_name != nullptr)
7568 {
7569 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
7570 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7571 }
7572 else
7573 {
7574 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
7575 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7576 }
7577 property_decl->setGetterName(getter_sel);
7578 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
7579
7580 if (ivar_decl)
7581 property_decl->setPropertyIvarDecl (ivar_decl);
7582
7583 if (property_attributes & DW_APPLE_PROPERTY_readonly)
7584 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
7585 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
7586 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
7587 if (property_attributes & DW_APPLE_PROPERTY_assign)
7588 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
7589 if (property_attributes & DW_APPLE_PROPERTY_retain)
7590 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
7591 if (property_attributes & DW_APPLE_PROPERTY_copy)
7592 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
7593 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
7594 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
7595
7596 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
7597 {
7598 const bool isInstance = true;
7599 const bool isVariadic = false;
7600 const bool isSynthesized = false;
7601 const bool isImplicitlyDeclared = true;
7602 const bool isDefined = false;
7603 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7604 const bool HasRelatedResultType = false;
7605
7606 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create (*clang_ast,
7607 clang::SourceLocation(),
7608 clang::SourceLocation(),
7609 getter_sel,
7610 GetQualType(property_clang_type_to_access),
7611 nullptr,
7612 class_interface_decl,
7613 isInstance,
7614 isVariadic,
7615 isSynthesized,
7616 isImplicitlyDeclared,
7617 isDefined,
7618 impControl,
7619 HasRelatedResultType);
7620
7621 if (getter && metadata)
7622 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
7623
7624 if (getter)
7625 {
7626 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
7627
7628 class_interface_decl->addDecl(getter);
7629 }
7630 }
7631
7632 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
7633 {
7634 clang::QualType result_type = clang_ast->VoidTy;
7635
7636 const bool isInstance = true;
7637 const bool isVariadic = false;
7638 const bool isSynthesized = false;
7639 const bool isImplicitlyDeclared = true;
7640 const bool isDefined = false;
7641 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7642 const bool HasRelatedResultType = false;
7643
7644 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
7645 clang::SourceLocation(),
7646 clang::SourceLocation(),
7647 setter_sel,
7648 result_type,
7649 nullptr,
7650 class_interface_decl,
7651 isInstance,
7652 isVariadic,
7653 isSynthesized,
7654 isImplicitlyDeclared,
7655 isDefined,
7656 impControl,
7657 HasRelatedResultType);
7658
7659 if (setter && metadata)
7660 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
7661
7662 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
7663
7664 params.push_back (clang::ParmVarDecl::Create (*clang_ast,
7665 setter,
7666 clang::SourceLocation(),
7667 clang::SourceLocation(),
7668 nullptr, // anonymous
7669 GetQualType(property_clang_type_to_access),
7670 nullptr,
7671 clang::SC_Auto,
7672 nullptr));
7673
7674 if (setter)
7675 {
7676 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7677
7678 class_interface_decl->addDecl(setter);
7679 }
7680 }
7681
7682 return true;
7683 }
7684 }
7685 }
7686 return false;
7687}
7688
7689bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007690ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00007691{
7692 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7693 if (class_interface_decl)
7694 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
7695 return false;
7696}
7697
7698
7699clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007700ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007701 const char *name, // the full symbol name as seen in the symbol table (void* type, "-[NString stringWithCString:]")
Greg Claytona1e5dc82015-08-11 22:53:00 +00007702 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007703 lldb::AccessType access,
7704 bool is_artificial)
7705{
7706 if (!type || !method_clang_type.IsValid())
7707 return nullptr;
7708
7709 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
7710
7711 if (class_interface_decl == nullptr)
7712 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007713 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7714 if (lldb_ast == nullptr)
7715 return nullptr;
7716 clang::ASTContext *ast = lldb_ast->getASTContext();
7717
Greg Claytond8d4a572015-08-11 21:38:15 +00007718 const char *selector_start = ::strchr (name, ' ');
7719 if (selector_start == nullptr)
7720 return nullptr;
7721
7722 selector_start++;
7723 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
7724
7725 size_t len = 0;
7726 const char *start;
7727 //printf ("name = '%s'\n", name);
7728
7729 unsigned num_selectors_with_args = 0;
7730 for (start = selector_start;
7731 start && *start != '\0' && *start != ']';
7732 start += len)
7733 {
7734 len = ::strcspn(start, ":]");
7735 bool has_arg = (start[len] == ':');
7736 if (has_arg)
7737 ++num_selectors_with_args;
7738 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
7739 if (has_arg)
7740 len += 1;
7741 }
7742
7743
7744 if (selector_idents.size() == 0)
7745 return nullptr;
7746
7747 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
7748 selector_idents.data());
7749
7750 clang::QualType method_qual_type (GetQualType(method_clang_type));
7751
7752 // Populate the method decl with parameter decls
7753 const clang::Type *method_type(method_qual_type.getTypePtr());
7754
7755 if (method_type == nullptr)
7756 return nullptr;
7757
7758 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
7759
7760 if (!method_function_prototype)
7761 return nullptr;
7762
7763
7764 bool is_variadic = false;
7765 bool is_synthesized = false;
7766 bool is_defined = false;
7767 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
7768
7769 const unsigned num_args = method_function_prototype->getNumParams();
7770
7771 if (num_args != num_selectors_with_args)
7772 return nullptr; // some debug information is corrupt. We are not going to deal with it.
7773
7774 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create (*ast,
7775 clang::SourceLocation(), // beginLoc,
7776 clang::SourceLocation(), // endLoc,
7777 method_selector,
7778 method_function_prototype->getReturnType(),
7779 nullptr, // TypeSourceInfo *ResultTInfo,
7780 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(GetQualType(type)),
7781 name[0] == '-',
7782 is_variadic,
7783 is_synthesized,
7784 true, // is_implicitly_declared; we force this to true because we don't have source locations
7785 is_defined,
7786 imp_control,
7787 false /*has_related_result_type*/);
7788
7789
7790 if (objc_method_decl == nullptr)
7791 return nullptr;
7792
7793 if (num_args > 0)
7794 {
7795 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7796
7797 for (unsigned param_index = 0; param_index < num_args; ++param_index)
7798 {
7799 params.push_back (clang::ParmVarDecl::Create (*ast,
7800 objc_method_decl,
7801 clang::SourceLocation(),
7802 clang::SourceLocation(),
7803 nullptr, // anonymous
7804 method_function_prototype->getParamType(param_index),
7805 nullptr,
7806 clang::SC_Auto,
7807 nullptr));
7808 }
7809
7810 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7811 }
7812
7813 class_interface_decl->addDecl (objc_method_decl);
7814
7815#ifdef LLDB_CONFIGURATION_DEBUG
7816 VerifyDecl(objc_method_decl);
7817#endif
7818
7819 return objc_method_decl;
7820}
7821
7822bool
7823ClangASTContext::SetHasExternalStorage (void* type, bool has_extern)
7824{
7825 if (!type)
7826 return false;
7827
7828 clang::QualType qual_type (GetCanonicalQualType(type));
7829
7830 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7831 switch (type_class)
7832 {
7833 case clang::Type::Record:
7834 {
7835 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7836 if (cxx_record_decl)
7837 {
7838 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
7839 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
7840 return true;
7841 }
7842 }
7843 break;
7844
7845 case clang::Type::Enum:
7846 {
7847 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
7848 if (enum_decl)
7849 {
7850 enum_decl->setHasExternalLexicalStorage (has_extern);
7851 enum_decl->setHasExternalVisibleStorage (has_extern);
7852 return true;
7853 }
7854 }
7855 break;
7856
7857 case clang::Type::ObjCObject:
7858 case clang::Type::ObjCInterface:
7859 {
7860 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
7861 assert (objc_class_type);
7862 if (objc_class_type)
7863 {
7864 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
7865
7866 if (class_interface_decl)
7867 {
7868 class_interface_decl->setHasExternalLexicalStorage (has_extern);
7869 class_interface_decl->setHasExternalVisibleStorage (has_extern);
7870 return true;
7871 }
7872 }
7873 }
7874 break;
7875
7876 case clang::Type::Typedef:
7877 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
7878
7879 case clang::Type::Elaborated:
7880 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
7881
7882 case clang::Type::Paren:
7883 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
7884
7885 default:
7886 break;
7887 }
7888 return false;
7889}
7890
7891
7892#pragma mark TagDecl
7893
7894bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007895ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007896{
7897 if (type)
7898 {
7899
7900 clang::QualType qual_type (GetQualType(type));
7901 const clang::Type *t = qual_type.getTypePtr();
7902 if (t)
7903 {
7904 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(t);
7905 if (tag_type)
7906 {
7907 clang::TagDecl *tag_decl = tag_type->getDecl();
7908 if (tag_decl)
7909 {
7910 tag_decl->startDefinition();
7911 return true;
7912 }
7913 }
7914
7915 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(t);
7916 if (object_type)
7917 {
7918 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
7919 if (interface_decl)
7920 {
7921 interface_decl->startDefinition();
7922 return true;
7923 }
7924 }
7925 }
7926 }
7927 return false;
7928}
7929
7930bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007931ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007932{
7933 if (type)
7934 {
7935 clang::QualType qual_type (GetQualType(type));
7936 if (qual_type.isNull())
7937 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00007938 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7939 if (lldb_ast == nullptr)
7940 return false;
7941 clang::ASTContext *ast = lldb_ast->getASTContext();
7942
Greg Claytond8d4a572015-08-11 21:38:15 +00007943 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7944
7945 if (cxx_record_decl)
7946 {
7947 cxx_record_decl->completeDefinition();
7948
7949 return true;
7950 }
7951
7952 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(qual_type.getTypePtr());
7953
7954 if (enutype)
7955 {
7956 clang::EnumDecl *enum_decl = enutype->getDecl();
7957
7958 if (enum_decl)
7959 {
7960 /// TODO This really needs to be fixed.
7961
7962 unsigned NumPositiveBits = 1;
7963 unsigned NumNegativeBits = 0;
7964
7965 clang::QualType promotion_qual_type;
7966 // If the enum integer type is less than an integer in bit width,
7967 // then we must promote it to an integer size.
7968 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
7969 {
7970 if (enum_decl->getIntegerType()->isSignedIntegerType())
7971 promotion_qual_type = ast->IntTy;
7972 else
7973 promotion_qual_type = ast->UnsignedIntTy;
7974 }
7975 else
7976 promotion_qual_type = enum_decl->getIntegerType();
7977
7978 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
7979 return true;
7980 }
7981 }
7982 }
7983 return false;
7984}
7985
Greg Claytond8d4a572015-08-11 21:38:15 +00007986bool
Greg Clayton8b4edba2015-08-14 20:02:05 +00007987ClangASTContext::AddEnumerationValueToEnumerationType (void* type,
7988 const CompilerType &enumerator_clang_type,
7989 const Declaration &decl,
7990 const char *name,
7991 int64_t enum_value,
7992 uint32_t enum_value_bit_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00007993{
7994 if (type && enumerator_clang_type.IsValid() && name && name[0])
7995 {
7996 clang::QualType enum_qual_type (GetCanonicalQualType(type));
7997
7998 bool is_signed = false;
7999 enumerator_clang_type.IsIntegerType (is_signed);
8000 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8001 if (clang_type)
8002 {
8003 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8004
8005 if (enutype)
8006 {
8007 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
8008 enum_llvm_apsint = enum_value;
8009 clang::EnumConstantDecl *enumerator_decl =
8010 clang::EnumConstantDecl::Create (*getASTContext(),
8011 enutype->getDecl(),
8012 clang::SourceLocation(),
8013 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
8014 GetQualType(enumerator_clang_type),
8015 nullptr,
8016 enum_llvm_apsint);
8017
8018 if (enumerator_decl)
8019 {
8020 enutype->getDecl()->addDecl(enumerator_decl);
8021
8022#ifdef LLDB_CONFIGURATION_DEBUG
8023 VerifyDecl(enumerator_decl);
8024#endif
8025
8026 return true;
8027 }
8028 }
8029 }
8030 }
8031 return false;
8032}
8033
Greg Claytona1e5dc82015-08-11 22:53:00 +00008034CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00008035ClangASTContext::GetEnumerationIntegerType (void* type)
8036{
8037 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8038 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8039 if (clang_type)
8040 {
8041 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8042 if (enutype)
8043 {
8044 clang::EnumDecl *enum_decl = enutype->getDecl();
8045 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008046 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008047 }
8048 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008049 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008050}
8051
Greg Claytona1e5dc82015-08-11 22:53:00 +00008052CompilerType
8053ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008054{
8055 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8056 {
Greg Claytonf73034f2015-09-08 18:15:05 +00008057 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008058 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008059 return CompilerType();
8060 return CompilerType (ast->getASTContext(),
Greg Claytond8d4a572015-08-11 21:38:15 +00008061 ast->getASTContext()->getMemberPointerType (GetQualType(pointee_type),
8062 GetQualType(type).getTypePtr()));
8063 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008064 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008065}
8066
8067
8068size_t
8069ClangASTContext::ConvertStringToFloatValue (void* type, const char *s, uint8_t *dst, size_t dst_size)
8070{
8071 if (type)
8072 {
8073 clang::QualType qual_type (GetCanonicalQualType(type));
8074 uint32_t count = 0;
8075 bool is_complex = false;
8076 if (IsFloatingPointType (type, count, is_complex))
8077 {
8078 // TODO: handle complex and vector types
8079 if (count != 1)
8080 return false;
8081
8082 llvm::StringRef s_sref(s);
8083 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8084
8085 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8086 const uint64_t byte_size = bit_size / 8;
8087 if (dst_size >= byte_size)
8088 {
8089 if (bit_size == sizeof(float)*8)
8090 {
8091 float float32 = ap_float.convertToFloat();
8092 ::memcpy (dst, &float32, byte_size);
8093 return byte_size;
8094 }
8095 else if (bit_size >= 64)
8096 {
8097 llvm::APInt ap_int(ap_float.bitcastToAPInt());
8098 ::memcpy (dst, ap_int.getRawData(), byte_size);
8099 return byte_size;
8100 }
8101 }
8102 }
8103 }
8104 return 0;
8105}
8106
8107
8108
8109//----------------------------------------------------------------------
8110// Dumping types
8111//----------------------------------------------------------------------
8112#define DEPTH_INCREMENT 2
8113
8114void
8115ClangASTContext::DumpValue (void* type, ExecutionContext *exe_ctx,
8116 Stream *s,
8117 lldb::Format format,
8118 const lldb_private::DataExtractor &data,
8119 lldb::offset_t data_byte_offset,
8120 size_t data_byte_size,
8121 uint32_t bitfield_bit_size,
8122 uint32_t bitfield_bit_offset,
8123 bool show_types,
8124 bool show_summary,
8125 bool verbose,
8126 uint32_t depth)
8127{
8128 if (!type)
8129 return;
8130
8131 clang::QualType qual_type(GetQualType(type));
8132 switch (qual_type->getTypeClass())
8133 {
8134 case clang::Type::Record:
8135 if (GetCompleteType(type))
8136 {
8137 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8138 const clang::RecordDecl *record_decl = record_type->getDecl();
8139 assert(record_decl);
8140 uint32_t field_bit_offset = 0;
8141 uint32_t field_byte_offset = 0;
8142 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8143 uint32_t child_idx = 0;
8144
8145 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8146 if (cxx_record_decl)
8147 {
8148 // We might have base classes to print out first
8149 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8150 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8151 base_class != base_class_end;
8152 ++base_class)
8153 {
8154 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8155
8156 // Skip empty base classes
8157 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8158 continue;
8159
8160 if (base_class->isVirtual())
8161 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8162 else
8163 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8164 field_byte_offset = field_bit_offset / 8;
8165 assert (field_bit_offset % 8 == 0);
8166 if (child_idx == 0)
8167 s->PutChar('{');
8168 else
8169 s->PutChar(',');
8170
8171 clang::QualType base_class_qual_type = base_class->getType();
8172 std::string base_class_type_name(base_class_qual_type.getAsString());
8173
8174 // Indent and print the base class type name
8175 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8176
8177 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8178
8179 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008180 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008181 base_clang_type.DumpValue (exe_ctx,
8182 s, // Stream to dump to
8183 base_clang_type.GetFormat(), // The format with which to display the member
8184 data, // Data buffer containing all bytes for this type
8185 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8186 base_class_type_info.Width / 8, // Size of this type in bytes
8187 0, // Bitfield bit size
8188 0, // Bitfield bit offset
8189 show_types, // Boolean indicating if we should show the variable types
8190 show_summary, // Boolean indicating if we should show a summary for the current type
8191 verbose, // Verbose output?
8192 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8193
8194 ++child_idx;
8195 }
8196 }
8197 uint32_t field_idx = 0;
8198 clang::RecordDecl::field_iterator field, field_end;
8199 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8200 {
8201 // Print the starting squiggly bracket (if this is the
8202 // first member) or comma (for member 2 and beyond) for
8203 // the struct/union/class member.
8204 if (child_idx == 0)
8205 s->PutChar('{');
8206 else
8207 s->PutChar(',');
8208
8209 // Indent
8210 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8211
8212 clang::QualType field_type = field->getType();
8213 // Print the member type if requested
8214 // Figure out the type byte size (field_type_info.first) and
8215 // alignment (field_type_info.second) from the AST context.
8216 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8217 assert(field_idx < record_layout.getFieldCount());
8218 // Figure out the field offset within the current struct/union/class type
8219 field_bit_offset = record_layout.getFieldOffset (field_idx);
8220 field_byte_offset = field_bit_offset / 8;
8221 uint32_t field_bitfield_bit_size = 0;
8222 uint32_t field_bitfield_bit_offset = 0;
8223 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8224 field_bitfield_bit_offset = field_bit_offset % 8;
8225
8226 if (show_types)
8227 {
8228 std::string field_type_name(field_type.getAsString());
8229 if (field_bitfield_bit_size > 0)
8230 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
8231 else
8232 s->Printf("(%s) ", field_type_name.c_str());
8233 }
8234 // Print the member name and equal sign
8235 s->Printf("%s = ", field->getNameAsString().c_str());
8236
8237
8238 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008239 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008240 field_clang_type.DumpValue (exe_ctx,
8241 s, // Stream to dump to
8242 field_clang_type.GetFormat(), // The format with which to display the member
8243 data, // Data buffer containing all bytes for this type
8244 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8245 field_type_info.Width / 8, // Size of this type in bytes
8246 field_bitfield_bit_size, // Bitfield bit size
8247 field_bitfield_bit_offset, // Bitfield bit offset
8248 show_types, // Boolean indicating if we should show the variable types
8249 show_summary, // Boolean indicating if we should show a summary for the current type
8250 verbose, // Verbose output?
8251 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8252 }
8253
8254 // Indent the trailing squiggly bracket
8255 if (child_idx > 0)
8256 s->Printf("\n%*s}", depth, "");
8257 }
8258 return;
8259
8260 case clang::Type::Enum:
8261 if (GetCompleteType(type))
8262 {
8263 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8264 const clang::EnumDecl *enum_decl = enutype->getDecl();
8265 assert(enum_decl);
8266 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8267 lldb::offset_t offset = data_byte_offset;
8268 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
8269 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8270 {
8271 if (enum_pos->getInitVal() == enum_value)
8272 {
8273 s->Printf("%s", enum_pos->getNameAsString().c_str());
8274 return;
8275 }
8276 }
8277 // If we have gotten here we didn't get find the enumerator in the
8278 // enum decl, so just print the integer.
8279 s->Printf("%" PRIi64, enum_value);
8280 }
8281 return;
8282
8283 case clang::Type::ConstantArray:
8284 {
8285 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
8286 bool is_array_of_characters = false;
8287 clang::QualType element_qual_type = array->getElementType();
8288
8289 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
8290 if (canonical_type)
8291 is_array_of_characters = canonical_type->isCharType();
8292
8293 const uint64_t element_count = array->getSize().getLimitedValue();
8294
8295 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
8296
8297 uint32_t element_idx = 0;
8298 uint32_t element_offset = 0;
8299 uint64_t element_byte_size = field_type_info.Width / 8;
8300 uint32_t element_stride = element_byte_size;
8301
8302 if (is_array_of_characters)
8303 {
8304 s->PutChar('"');
8305 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8306 s->PutChar('"');
8307 return;
8308 }
8309 else
8310 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008311 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008312 lldb::Format element_format = element_clang_type.GetFormat();
8313
8314 for (element_idx = 0; element_idx < element_count; ++element_idx)
8315 {
8316 // Print the starting squiggly bracket (if this is the
8317 // first member) or comman (for member 2 and beyong) for
8318 // the struct/union/class member.
8319 if (element_idx == 0)
8320 s->PutChar('{');
8321 else
8322 s->PutChar(',');
8323
8324 // Indent and print the index
8325 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
8326
8327 // Figure out the field offset within the current struct/union/class type
8328 element_offset = element_idx * element_stride;
8329
8330 // Dump the value of the member
8331 element_clang_type.DumpValue (exe_ctx,
8332 s, // Stream to dump to
8333 element_format, // The format with which to display the element
8334 data, // Data buffer containing all bytes for this type
8335 data_byte_offset + element_offset,// Offset into "data" where to grab value from
8336 element_byte_size, // Size of this type in bytes
8337 0, // Bitfield bit size
8338 0, // Bitfield bit offset
8339 show_types, // Boolean indicating if we should show the variable types
8340 show_summary, // Boolean indicating if we should show a summary for the current type
8341 verbose, // Verbose output?
8342 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8343 }
8344
8345 // Indent the trailing squiggly bracket
8346 if (element_idx > 0)
8347 s->Printf("\n%*s}", depth, "");
8348 }
8349 }
8350 return;
8351
8352 case clang::Type::Typedef:
8353 {
8354 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
8355
Greg Claytona1e5dc82015-08-11 22:53:00 +00008356 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008357 lldb::Format typedef_format = typedef_clang_type.GetFormat();
8358 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8359 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8360
8361 return typedef_clang_type.DumpValue (exe_ctx,
8362 s, // Stream to dump to
8363 typedef_format, // The format with which to display the element
8364 data, // Data buffer containing all bytes for this type
8365 data_byte_offset, // Offset into "data" where to grab value from
8366 typedef_byte_size, // Size of this type in bytes
8367 bitfield_bit_size, // Bitfield bit size
8368 bitfield_bit_offset,// Bitfield bit offset
8369 show_types, // Boolean indicating if we should show the variable types
8370 show_summary, // Boolean indicating if we should show a summary for the current type
8371 verbose, // Verbose output?
8372 depth); // Scope depth for any types that have children
8373 }
8374 break;
8375
8376 case clang::Type::Elaborated:
8377 {
8378 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008379 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008380 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
8381 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
8382 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
8383
8384 return elaborated_clang_type.DumpValue (exe_ctx,
8385 s, // Stream to dump to
8386 elaborated_format, // The format with which to display the element
8387 data, // Data buffer containing all bytes for this type
8388 data_byte_offset, // Offset into "data" where to grab value from
8389 elaborated_byte_size, // Size of this type in bytes
8390 bitfield_bit_size, // Bitfield bit size
8391 bitfield_bit_offset,// Bitfield bit offset
8392 show_types, // Boolean indicating if we should show the variable types
8393 show_summary, // Boolean indicating if we should show a summary for the current type
8394 verbose, // Verbose output?
8395 depth); // Scope depth for any types that have children
8396 }
8397 break;
8398
8399 case clang::Type::Paren:
8400 {
8401 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008402 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008403
8404 lldb::Format desugar_format = desugar_clang_type.GetFormat();
8405 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
8406 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
8407
8408 return desugar_clang_type.DumpValue (exe_ctx,
8409 s, // Stream to dump to
8410 desugar_format, // The format with which to display the element
8411 data, // Data buffer containing all bytes for this type
8412 data_byte_offset, // Offset into "data" where to grab value from
8413 desugar_byte_size, // Size of this type in bytes
8414 bitfield_bit_size, // Bitfield bit size
8415 bitfield_bit_offset,// Bitfield bit offset
8416 show_types, // Boolean indicating if we should show the variable types
8417 show_summary, // Boolean indicating if we should show a summary for the current type
8418 verbose, // Verbose output?
8419 depth); // Scope depth for any types that have children
8420 }
8421 break;
8422
8423 default:
8424 // We are down to a scalar type that we just need to display.
8425 data.Dump(s,
8426 data_byte_offset,
8427 format,
8428 data_byte_size,
8429 1,
8430 UINT32_MAX,
8431 LLDB_INVALID_ADDRESS,
8432 bitfield_bit_size,
8433 bitfield_bit_offset);
8434
8435 if (show_summary)
8436 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
8437 break;
8438 }
8439}
8440
8441
8442
8443
8444bool
8445ClangASTContext::DumpTypeValue (void* type, Stream *s,
8446 lldb::Format format,
8447 const lldb_private::DataExtractor &data,
8448 lldb::offset_t byte_offset,
8449 size_t byte_size,
8450 uint32_t bitfield_bit_size,
8451 uint32_t bitfield_bit_offset,
8452 ExecutionContextScope *exe_scope)
8453{
8454 if (!type)
8455 return false;
8456 if (IsAggregateType(type))
8457 {
8458 return false;
8459 }
8460 else
8461 {
8462 clang::QualType qual_type(GetQualType(type));
8463
8464 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8465 switch (type_class)
8466 {
8467 case clang::Type::Typedef:
8468 {
8469 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008470 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008471 if (format == eFormatDefault)
8472 format = typedef_clang_type.GetFormat();
8473 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8474 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8475
8476 return typedef_clang_type.DumpTypeValue (s,
8477 format, // The format with which to display the element
8478 data, // Data buffer containing all bytes for this type
8479 byte_offset, // Offset into "data" where to grab value from
8480 typedef_byte_size, // Size of this type in bytes
8481 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
8482 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
8483 exe_scope);
8484 }
8485 break;
8486
8487 case clang::Type::Enum:
8488 // If our format is enum or default, show the enumeration value as
8489 // its enumeration string value, else just display it as requested.
8490 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
8491 {
8492 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8493 const clang::EnumDecl *enum_decl = enutype->getDecl();
8494 assert(enum_decl);
8495 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8496 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
8497 lldb::offset_t offset = byte_offset;
8498 if (is_signed)
8499 {
8500 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8501 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8502 {
8503 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
8504 {
8505 s->PutCString (enum_pos->getNameAsString().c_str());
8506 return true;
8507 }
8508 }
8509 // If we have gotten here we didn't get find the enumerator in the
8510 // enum decl, so just print the integer.
8511 s->Printf("%" PRIi64, enum_svalue);
8512 }
8513 else
8514 {
8515 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8516 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8517 {
8518 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
8519 {
8520 s->PutCString (enum_pos->getNameAsString().c_str());
8521 return true;
8522 }
8523 }
8524 // If we have gotten here we didn't get find the enumerator in the
8525 // enum decl, so just print the integer.
8526 s->Printf("%" PRIu64, enum_uvalue);
8527 }
8528 return true;
8529 }
8530 // format was not enum, just fall through and dump the value as requested....
8531
8532 default:
8533 // We are down to a scalar type that we just need to display.
8534 {
8535 uint32_t item_count = 1;
8536 // A few formats, we might need to modify our size and count for depending
8537 // on how we are trying to display the value...
8538 switch (format)
8539 {
8540 default:
8541 case eFormatBoolean:
8542 case eFormatBinary:
8543 case eFormatComplex:
8544 case eFormatCString: // NULL terminated C strings
8545 case eFormatDecimal:
8546 case eFormatEnum:
8547 case eFormatHex:
8548 case eFormatHexUppercase:
8549 case eFormatFloat:
8550 case eFormatOctal:
8551 case eFormatOSType:
8552 case eFormatUnsigned:
8553 case eFormatPointer:
8554 case eFormatVectorOfChar:
8555 case eFormatVectorOfSInt8:
8556 case eFormatVectorOfUInt8:
8557 case eFormatVectorOfSInt16:
8558 case eFormatVectorOfUInt16:
8559 case eFormatVectorOfSInt32:
8560 case eFormatVectorOfUInt32:
8561 case eFormatVectorOfSInt64:
8562 case eFormatVectorOfUInt64:
8563 case eFormatVectorOfFloat32:
8564 case eFormatVectorOfFloat64:
8565 case eFormatVectorOfUInt128:
8566 break;
8567
8568 case eFormatChar:
8569 case eFormatCharPrintable:
8570 case eFormatCharArray:
8571 case eFormatBytes:
8572 case eFormatBytesWithASCII:
8573 item_count = byte_size;
8574 byte_size = 1;
8575 break;
8576
8577 case eFormatUnicode16:
8578 item_count = byte_size / 2;
8579 byte_size = 2;
8580 break;
8581
8582 case eFormatUnicode32:
8583 item_count = byte_size / 4;
8584 byte_size = 4;
8585 break;
8586 }
8587 return data.Dump (s,
8588 byte_offset,
8589 format,
8590 byte_size,
8591 item_count,
8592 UINT32_MAX,
8593 LLDB_INVALID_ADDRESS,
8594 bitfield_bit_size,
8595 bitfield_bit_offset,
8596 exe_scope);
8597 }
8598 break;
8599 }
8600 }
8601 return 0;
8602}
8603
8604
8605
8606void
8607ClangASTContext::DumpSummary (void* type, ExecutionContext *exe_ctx,
8608 Stream *s,
8609 const lldb_private::DataExtractor &data,
8610 lldb::offset_t data_byte_offset,
8611 size_t data_byte_size)
8612{
8613 uint32_t length = 0;
8614 if (IsCStringType (type, length))
8615 {
8616 if (exe_ctx)
8617 {
8618 Process *process = exe_ctx->GetProcessPtr();
8619 if (process)
8620 {
8621 lldb::offset_t offset = data_byte_offset;
8622 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
8623 std::vector<uint8_t> buf;
8624 if (length > 0)
8625 buf.resize (length);
8626 else
8627 buf.resize (256);
8628
8629 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
8630 buf.back() = '\0';
8631 size_t bytes_read;
8632 size_t total_cstr_len = 0;
8633 Error error;
8634 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
8635 {
8636 const size_t len = strlen((const char *)&buf.front());
8637 if (len == 0)
8638 break;
8639 if (total_cstr_len == 0)
8640 s->PutCString (" \"");
8641 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8642 total_cstr_len += len;
8643 if (len < buf.size())
8644 break;
8645 pointer_address += total_cstr_len;
8646 }
8647 if (total_cstr_len > 0)
8648 s->PutChar ('"');
8649 }
8650 }
8651 }
8652}
8653
8654void
8655ClangASTContext::DumpTypeDescription (void* type)
8656{
8657 StreamFile s (stdout, false);
8658 DumpTypeDescription (&s);
8659 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
8660 if (metadata)
8661 {
8662 metadata->Dump (&s);
8663 }
8664}
8665
8666void
8667ClangASTContext::DumpTypeDescription (void* type, Stream *s)
8668{
8669 if (type)
8670 {
8671 clang::QualType qual_type(GetQualType(type));
8672
8673 llvm::SmallVector<char, 1024> buf;
8674 llvm::raw_svector_ostream llvm_ostrm (buf);
8675
8676 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8677 switch (type_class)
8678 {
8679 case clang::Type::ObjCObject:
8680 case clang::Type::ObjCInterface:
8681 {
8682 GetCompleteType(type);
8683
8684 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8685 assert (objc_class_type);
8686 if (objc_class_type)
8687 {
8688 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8689 if (class_interface_decl)
8690 {
8691 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
8692 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
8693 }
8694 }
8695 }
8696 break;
8697
8698 case clang::Type::Typedef:
8699 {
8700 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
8701 if (typedef_type)
8702 {
8703 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
8704 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
8705 if (!clang_typedef_name.empty())
8706 {
8707 s->PutCString ("typedef ");
8708 s->PutCString (clang_typedef_name.c_str());
8709 }
8710 }
8711 }
8712 break;
8713
8714 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008715 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008716 return;
8717
8718 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008719 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008720 return;
8721
8722 case clang::Type::Record:
8723 {
8724 GetCompleteType(type);
8725
8726 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8727 const clang::RecordDecl *record_decl = record_type->getDecl();
8728 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8729
8730 if (cxx_record_decl)
8731 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8732 else
8733 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8734 }
8735 break;
8736
8737 default:
8738 {
8739 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
8740 if (tag_type)
8741 {
8742 clang::TagDecl *tag_decl = tag_type->getDecl();
8743 if (tag_decl)
8744 tag_decl->print(llvm_ostrm, 0);
8745 }
8746 else
8747 {
8748 std::string clang_type_name(qual_type.getAsString());
8749 if (!clang_type_name.empty())
8750 s->PutCString (clang_type_name.c_str());
8751 }
8752 }
8753 }
8754
Greg Claytond8d4a572015-08-11 21:38:15 +00008755 if (buf.size() > 0)
8756 {
8757 s->Write (buf.data(), buf.size());
8758 }
8759 }
8760}
Greg Clayton8b4edba2015-08-14 20:02:05 +00008761
Greg Clayton8b4edba2015-08-14 20:02:05 +00008762clang::ClassTemplateDecl *
Greg Clayton6071e6f2015-08-26 22:57:51 +00008763ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008764 lldb::AccessType access_type,
8765 const char *parent_name,
8766 int tag_decl_kind,
8767 const ClangASTContext::TemplateParameterInfos &template_param_infos)
8768{
8769 if (template_param_infos.IsValid())
8770 {
8771 std::string template_basename(parent_name);
8772 template_basename.erase (template_basename.find('<'));
8773
8774 return CreateClassTemplateDecl (decl_ctx,
8775 access_type,
8776 template_basename.c_str(),
8777 tag_decl_kind,
8778 template_param_infos);
8779 }
8780 return NULL;
8781}
8782
Greg Clayton6dc8d582015-08-18 22:32:36 +00008783void
8784ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl)
8785{
8786 ClangASTContext *ast = (ClangASTContext *)baton;
8787 SymbolFile *sym_file = ast->GetSymbolFile();
8788 if (sym_file)
8789 {
8790 CompilerType clang_type = GetTypeForDecl (decl);
8791 if (clang_type)
8792 sym_file->CompleteType (clang_type);
8793 }
8794}
8795
8796void
8797ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
8798{
8799 ClangASTContext *ast = (ClangASTContext *)baton;
8800 SymbolFile *sym_file = ast->GetSymbolFile();
8801 if (sym_file)
8802 {
8803 CompilerType clang_type = GetTypeForDecl (decl);
8804 if (clang_type)
8805 sym_file->CompleteType (clang_type);
8806 }
8807}
Greg Clayton8b4edba2015-08-14 20:02:05 +00008808
Greg Clayton261ac3f2015-08-28 01:01:03 +00008809
8810DWARFASTParser *
8811ClangASTContext::GetDWARFParser ()
8812{
8813 if (!m_dwarf_ast_parser_ap)
8814 m_dwarf_ast_parser_ap.reset(new DWARFASTParserClang(*this));
8815 return m_dwarf_ast_parser_ap.get();
8816}
8817
8818
Greg Clayton8b4edba2015-08-14 20:02:05 +00008819bool
Greg Clayton6dc8d582015-08-18 22:32:36 +00008820ClangASTContext::LayoutRecordType(void *baton,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008821 const clang::RecordDecl *record_decl,
8822 uint64_t &bit_size,
8823 uint64_t &alignment,
8824 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
8825 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
8826 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
8827{
Greg Clayton6dc8d582015-08-18 22:32:36 +00008828 ClangASTContext *ast = (ClangASTContext *)baton;
Greg Clayton261ac3f2015-08-28 01:01:03 +00008829 DWARFASTParserClang *dwarf_ast_parser = (DWARFASTParserClang *)ast->GetDWARFParser();
8830 return dwarf_ast_parser->LayoutRecordType(record_decl, bit_size, alignment, field_offsets, base_offsets, vbase_offsets);
Greg Clayton8b4edba2015-08-14 20:02:05 +00008831}
8832
Greg Clayton99558cc42015-08-24 23:46:31 +00008833//----------------------------------------------------------------------
8834// CompilerDeclContext functions
8835//----------------------------------------------------------------------
8836
8837bool
8838ClangASTContext::DeclContextIsStructUnionOrClass (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00008839{
Greg Clayton99558cc42015-08-24 23:46:31 +00008840 if (opaque_decl_ctx)
8841 return ((clang::DeclContext *)opaque_decl_ctx)->isRecord();
8842 else
8843 return false;
Greg Clayton8b4edba2015-08-14 20:02:05 +00008844}
8845
Greg Clayton99558cc42015-08-24 23:46:31 +00008846ConstString
8847ClangASTContext::DeclContextGetName (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00008848{
Greg Clayton99558cc42015-08-24 23:46:31 +00008849 if (opaque_decl_ctx)
8850 {
8851 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
8852 if (named_decl)
8853 return ConstString(named_decl->getName());
8854 }
8855 return ConstString();
8856}
8857
8858bool
8859ClangASTContext::DeclContextIsClassMethod (void *opaque_decl_ctx,
8860 lldb::LanguageType *language_ptr,
8861 bool *is_instance_method_ptr,
8862 ConstString *language_object_name_ptr)
8863{
8864 if (opaque_decl_ctx)
8865 {
8866 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
8867 if (ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
8868 {
8869 if (is_instance_method_ptr)
8870 *is_instance_method_ptr = objc_method->isInstanceMethod();
8871 if (language_ptr)
8872 *language_ptr = eLanguageTypeObjC;
8873 if (language_object_name_ptr)
8874 language_object_name_ptr->SetCString("self");
8875 return true;
8876 }
8877 else if (CXXMethodDecl *cxx_method = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
8878 {
8879 if (is_instance_method_ptr)
8880 *is_instance_method_ptr = cxx_method->isInstance();
8881 if (language_ptr)
8882 *language_ptr = eLanguageTypeC_plus_plus;
8883 if (language_object_name_ptr)
8884 language_object_name_ptr->SetCString("this");
8885 return true;
8886 }
8887 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
8888 {
8889 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
8890 if (metadata && metadata->HasObjectPtr())
8891 {
8892 if (is_instance_method_ptr)
8893 *is_instance_method_ptr = true;
8894 if (language_ptr)
8895 *language_ptr = eLanguageTypeObjC;
8896 if (language_object_name_ptr)
8897 language_object_name_ptr->SetCString (metadata->GetObjectPtrName());
8898 return true;
8899 }
8900 }
8901 }
8902 return false;
8903}
8904
8905clang::DeclContext *
8906ClangASTContext::DeclContextGetAsDeclContext (const CompilerDeclContext &dc)
8907{
8908 if (dc.IsClang())
8909 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
8910 return nullptr;
8911}
8912
8913
8914ObjCMethodDecl *
8915ClangASTContext::DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc)
8916{
8917 if (dc.IsClang())
8918 return llvm::dyn_cast<clang::ObjCMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8919 return nullptr;
8920}
8921
8922CXXMethodDecl *
8923ClangASTContext::DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc)
8924{
8925 if (dc.IsClang())
8926 return llvm::dyn_cast<clang::CXXMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8927 return nullptr;
8928}
8929
8930clang::FunctionDecl *
8931ClangASTContext::DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc)
8932{
8933 if (dc.IsClang())
8934 return llvm::dyn_cast<clang::FunctionDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8935 return nullptr;
8936}
8937
8938clang::NamespaceDecl *
8939ClangASTContext::DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc)
8940{
8941 if (dc.IsClang())
8942 return llvm::dyn_cast<clang::NamespaceDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8943 return nullptr;
8944}
8945
8946ClangASTMetadata *
8947ClangASTContext::DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object)
8948{
8949 clang::ASTContext *ast = DeclContextGetClangASTContext (dc);
8950 if (ast)
8951 return ClangASTContext::GetMetadata (ast, object);
8952 return nullptr;
8953}
8954
8955clang::ASTContext *
8956ClangASTContext::DeclContextGetClangASTContext (const CompilerDeclContext &dc)
8957{
Greg Claytonf73034f2015-09-08 18:15:05 +00008958 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
8959 if (ast)
8960 return ast->getASTContext();
Greg Clayton99558cc42015-08-24 23:46:31 +00008961 return nullptr;
Greg Clayton8b4edba2015-08-14 20:02:05 +00008962}
8963