blob: 7cccddaf0de58dd7508b34b2d7b133d2cbf11299 [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:
3199 break;
3200 }
3201 break;
3202
3203 case clang::Type::Record:
3204 if (check_cplusplus)
3205 {
3206 clang::CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
3207 if (cxx_record_decl)
3208 {
3209 bool is_complete = cxx_record_decl->isCompleteDefinition();
3210
3211 if (is_complete)
3212 success = cxx_record_decl->isDynamicClass();
3213 else
3214 {
3215 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), cxx_record_decl);
3216 if (metadata)
3217 success = metadata->GetIsDynamicCXXType();
3218 else
3219 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00003220 is_complete = CompilerType(getASTContext(), pointee_qual_type).GetCompleteType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003221 if (is_complete)
3222 success = cxx_record_decl->isDynamicClass();
3223 else
3224 success = false;
3225 }
3226 }
3227
3228 if (success)
3229 {
3230 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003231 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003232 return true;
3233 }
3234 }
3235 }
3236 break;
3237
3238 case clang::Type::ObjCObject:
3239 case clang::Type::ObjCInterface:
3240 if (check_objc)
3241 {
3242 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003243 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003244 return true;
3245 }
3246 break;
3247
3248 default:
3249 break;
3250 }
3251 }
3252 }
3253 if (dynamic_pointee_type)
3254 dynamic_pointee_type->Clear();
3255 return false;
3256}
3257
3258
3259bool
3260ClangASTContext::IsScalarType (void* type)
3261{
3262 if (!type)
3263 return false;
3264
3265 return (GetTypeInfo (type, nullptr) & eTypeIsScalar) != 0;
3266}
3267
3268bool
3269ClangASTContext::IsTypedefType (void* type)
3270{
3271 if (!type)
3272 return false;
3273 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
3274}
3275
3276bool
3277ClangASTContext::IsVoidType (void* type)
3278{
3279 if (!type)
3280 return false;
3281 return GetCanonicalQualType(type)->isVoidType();
3282}
3283
3284bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003285ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003286{
3287 if (type)
3288 {
3289 clang::QualType qual_type (GetCanonicalQualType(type));
3290
3291 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3292 if (cxx_record_decl)
3293 {
3294 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
3295 return true;
3296 }
3297 }
3298 class_name.clear();
3299 return false;
3300}
3301
3302
3303bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003304ClangASTContext::IsCXXClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003305{
3306 if (!type)
3307 return false;
3308
3309 clang::QualType qual_type (GetCanonicalQualType(type));
3310 if (qual_type->getAsCXXRecordDecl() != nullptr)
3311 return true;
3312 return false;
3313}
3314
3315bool
3316ClangASTContext::IsBeingDefined (void* type)
3317{
3318 if (!type)
3319 return false;
3320 clang::QualType qual_type (GetCanonicalQualType(type));
3321 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
3322 if (tag_type)
3323 return tag_type->isBeingDefined();
3324 return false;
3325}
3326
3327bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003328ClangASTContext::IsObjCObjectPointerType (const CompilerType& type, CompilerType *class_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003329{
3330 if (!type)
3331 return false;
3332
3333 clang::QualType qual_type (GetCanonicalQualType(type));
3334
3335 if (qual_type->isObjCObjectPointerType())
3336 {
3337 if (class_type_ptr)
3338 {
3339 if (!qual_type->isObjCClassType() &&
3340 !qual_type->isObjCIdType())
3341 {
3342 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3343 if (obj_pointer_type == nullptr)
3344 class_type_ptr->Clear();
3345 else
Greg Clayton99558cc42015-08-24 23:46:31 +00003346 class_type_ptr->SetCompilerType (type.GetTypeSystem(), clang::QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003347 }
3348 }
3349 return true;
3350 }
3351 if (class_type_ptr)
3352 class_type_ptr->Clear();
3353 return false;
3354}
3355
3356bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003357ClangASTContext::GetObjCClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003358{
3359 if (!type)
3360 return false;
3361
3362 clang::QualType qual_type (GetCanonicalQualType(type));
3363
3364 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3365 if (object_type)
3366 {
3367 const clang::ObjCInterfaceDecl *interface = object_type->getInterface();
3368 if (interface)
3369 {
3370 class_name = interface->getNameAsString();
3371 return true;
3372 }
3373 }
3374 return false;
3375}
3376
3377
3378//----------------------------------------------------------------------
3379// Type Completion
3380//----------------------------------------------------------------------
3381
3382bool
3383ClangASTContext::GetCompleteType (void* type)
3384{
3385 if (!type)
3386 return false;
3387 const bool allow_completion = true;
3388 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
3389}
3390
3391ConstString
3392ClangASTContext::GetTypeName (void* type)
3393{
3394 std::string type_name;
3395 if (type)
3396 {
3397 clang::PrintingPolicy printing_policy (getASTContext()->getPrintingPolicy());
3398 clang::QualType qual_type(GetQualType(type));
3399 printing_policy.SuppressTagKeyword = true;
3400 printing_policy.LangOpts.WChar = true;
3401 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
3402 if (typedef_type)
3403 {
3404 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
3405 type_name = typedef_decl->getQualifiedNameAsString();
3406 }
3407 else
3408 {
3409 type_name = qual_type.getAsString(printing_policy);
3410 }
3411 }
3412 return ConstString(type_name);
3413}
3414
3415uint32_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00003416ClangASTContext::GetTypeInfo (void* type, CompilerType *pointee_or_element_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003417{
3418 if (!type)
3419 return 0;
3420
3421 if (pointee_or_element_clang_type)
3422 pointee_or_element_clang_type->Clear();
3423
3424 clang::QualType qual_type (GetQualType(type));
3425
3426 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3427 switch (type_class)
3428 {
3429 case clang::Type::Builtin:
3430 {
3431 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3432
3433 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
3434 switch (builtin_type->getKind())
3435 {
3436 case clang::BuiltinType::ObjCId:
3437 case clang::BuiltinType::ObjCClass:
3438 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003439 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003440 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3441 break;
3442
3443 case clang::BuiltinType::ObjCSel:
3444 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003445 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->CharTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003446 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3447 break;
3448
3449 case clang::BuiltinType::Bool:
3450 case clang::BuiltinType::Char_U:
3451 case clang::BuiltinType::UChar:
3452 case clang::BuiltinType::WChar_U:
3453 case clang::BuiltinType::Char16:
3454 case clang::BuiltinType::Char32:
3455 case clang::BuiltinType::UShort:
3456 case clang::BuiltinType::UInt:
3457 case clang::BuiltinType::ULong:
3458 case clang::BuiltinType::ULongLong:
3459 case clang::BuiltinType::UInt128:
3460 case clang::BuiltinType::Char_S:
3461 case clang::BuiltinType::SChar:
3462 case clang::BuiltinType::WChar_S:
3463 case clang::BuiltinType::Short:
3464 case clang::BuiltinType::Int:
3465 case clang::BuiltinType::Long:
3466 case clang::BuiltinType::LongLong:
3467 case clang::BuiltinType::Int128:
3468 case clang::BuiltinType::Float:
3469 case clang::BuiltinType::Double:
3470 case clang::BuiltinType::LongDouble:
3471 builtin_type_flags |= eTypeIsScalar;
3472 if (builtin_type->isInteger())
3473 {
3474 builtin_type_flags |= eTypeIsInteger;
3475 if (builtin_type->isSignedInteger())
3476 builtin_type_flags |= eTypeIsSigned;
3477 }
3478 else if (builtin_type->isFloatingPoint())
3479 builtin_type_flags |= eTypeIsFloat;
3480 break;
3481 default:
3482 break;
3483 }
3484 return builtin_type_flags;
3485 }
3486
3487 case clang::Type::BlockPointer:
3488 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003489 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003490 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3491
3492 case clang::Type::Complex:
3493 {
3494 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3495 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal());
3496 if (complex_type)
3497 {
3498 clang::QualType complex_element_type (complex_type->getElementType());
3499 if (complex_element_type->isIntegerType())
3500 complex_type_flags |= eTypeIsFloat;
3501 else if (complex_element_type->isFloatingType())
3502 complex_type_flags |= eTypeIsInteger;
3503 }
3504 return complex_type_flags;
3505 }
3506 break;
3507
3508 case clang::Type::ConstantArray:
3509 case clang::Type::DependentSizedArray:
3510 case clang::Type::IncompleteArray:
3511 case clang::Type::VariableArray:
3512 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003513 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ArrayType>(qual_type.getTypePtr())->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003514 return eTypeHasChildren | eTypeIsArray;
3515
3516 case clang::Type::DependentName: return 0;
3517 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
3518 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
3519 case clang::Type::Decltype: return 0;
3520
3521 case clang::Type::Enum:
3522 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003523 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::EnumType>(qual_type)->getDecl()->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003524 return eTypeIsEnumeration | eTypeHasValue;
3525
3526 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003527 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003528 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003529 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003530
3531 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
3532 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
3533 case clang::Type::InjectedClassName: return 0;
3534
3535 case clang::Type::LValueReference:
3536 case clang::Type::RValueReference:
3537 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003538 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003539 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3540
3541 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
3542
3543 case clang::Type::ObjCObjectPointer:
3544 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003545 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003546 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
3547
3548 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3549 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3550
3551 case clang::Type::Pointer:
3552 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003553 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003554 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3555
3556 case clang::Type::Record:
3557 if (qual_type->getAsCXXRecordDecl())
3558 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3559 else
3560 return eTypeHasChildren | eTypeIsStructUnion;
3561 break;
3562 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
3563 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
3564 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
3565
3566 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003567 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 +00003568 case clang::Type::TypeOfExpr: return 0;
3569 case clang::Type::TypeOf: return 0;
3570 case clang::Type::UnresolvedUsing: return 0;
3571
3572 case clang::Type::ExtVector:
3573 case clang::Type::Vector:
3574 {
3575 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
3576 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal());
3577 if (vector_type)
3578 {
3579 if (vector_type->isIntegerType())
3580 vector_type_flags |= eTypeIsFloat;
3581 else if (vector_type->isFloatingType())
3582 vector_type_flags |= eTypeIsInteger;
3583 }
3584 return vector_type_flags;
3585 }
3586 default: return 0;
3587 }
3588 return 0;
3589}
3590
3591
3592
3593lldb::LanguageType
3594ClangASTContext::GetMinimumLanguage (void* type)
3595{
3596 if (!type)
3597 return lldb::eLanguageTypeC;
3598
3599 // If the type is a reference, then resolve it to what it refers to first:
3600 clang::QualType qual_type (GetCanonicalQualType(type).getNonReferenceType());
3601 if (qual_type->isAnyPointerType())
3602 {
3603 if (qual_type->isObjCObjectPointerType())
3604 return lldb::eLanguageTypeObjC;
3605
3606 clang::QualType pointee_type (qual_type->getPointeeType());
3607 if (pointee_type->getPointeeCXXRecordDecl() != nullptr)
3608 return lldb::eLanguageTypeC_plus_plus;
3609 if (pointee_type->isObjCObjectOrInterfaceType())
3610 return lldb::eLanguageTypeObjC;
3611 if (pointee_type->isObjCClassType())
3612 return lldb::eLanguageTypeObjC;
3613 if (pointee_type.getTypePtr() == getASTContext()->ObjCBuiltinIdTy.getTypePtr())
3614 return lldb::eLanguageTypeObjC;
3615 }
3616 else
3617 {
3618 if (qual_type->isObjCObjectOrInterfaceType())
3619 return lldb::eLanguageTypeObjC;
3620 if (qual_type->getAsCXXRecordDecl())
3621 return lldb::eLanguageTypeC_plus_plus;
3622 switch (qual_type->getTypeClass())
3623 {
3624 default:
3625 break;
3626 case clang::Type::Builtin:
3627 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3628 {
3629 default:
3630 case clang::BuiltinType::Void:
3631 case clang::BuiltinType::Bool:
3632 case clang::BuiltinType::Char_U:
3633 case clang::BuiltinType::UChar:
3634 case clang::BuiltinType::WChar_U:
3635 case clang::BuiltinType::Char16:
3636 case clang::BuiltinType::Char32:
3637 case clang::BuiltinType::UShort:
3638 case clang::BuiltinType::UInt:
3639 case clang::BuiltinType::ULong:
3640 case clang::BuiltinType::ULongLong:
3641 case clang::BuiltinType::UInt128:
3642 case clang::BuiltinType::Char_S:
3643 case clang::BuiltinType::SChar:
3644 case clang::BuiltinType::WChar_S:
3645 case clang::BuiltinType::Short:
3646 case clang::BuiltinType::Int:
3647 case clang::BuiltinType::Long:
3648 case clang::BuiltinType::LongLong:
3649 case clang::BuiltinType::Int128:
3650 case clang::BuiltinType::Float:
3651 case clang::BuiltinType::Double:
3652 case clang::BuiltinType::LongDouble:
3653 break;
3654
3655 case clang::BuiltinType::NullPtr:
3656 return eLanguageTypeC_plus_plus;
3657
3658 case clang::BuiltinType::ObjCId:
3659 case clang::BuiltinType::ObjCClass:
3660 case clang::BuiltinType::ObjCSel:
3661 return eLanguageTypeObjC;
3662
3663 case clang::BuiltinType::Dependent:
3664 case clang::BuiltinType::Overload:
3665 case clang::BuiltinType::BoundMember:
3666 case clang::BuiltinType::UnknownAny:
3667 break;
3668 }
3669 break;
3670 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003671 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
Greg Claytond8d4a572015-08-11 21:38:15 +00003672 }
3673 }
3674 return lldb::eLanguageTypeC;
3675}
3676
3677lldb::TypeClass
3678ClangASTContext::GetTypeClass (void* type)
3679{
3680 if (!type)
3681 return lldb::eTypeClassInvalid;
3682
3683 clang::QualType qual_type(GetQualType(type));
3684
3685 switch (qual_type->getTypeClass())
3686 {
3687 case clang::Type::UnaryTransform: break;
3688 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
3689 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
3690 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
3691 case clang::Type::VariableArray: return lldb::eTypeClassArray;
3692 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
3693 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
3694 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
3695 case clang::Type::ExtVector: return lldb::eTypeClassVector;
3696 case clang::Type::Vector: return lldb::eTypeClassVector;
3697 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
3698 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
3699 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
3700 case clang::Type::Pointer: return lldb::eTypeClassPointer;
3701 case clang::Type::LValueReference: return lldb::eTypeClassReference;
3702 case clang::Type::RValueReference: return lldb::eTypeClassReference;
3703 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
3704 case clang::Type::Complex:
3705 if (qual_type->isComplexType())
3706 return lldb::eTypeClassComplexFloat;
3707 else
3708 return lldb::eTypeClassComplexInteger;
3709 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
3710 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
3711 case clang::Type::Record:
3712 {
3713 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3714 const clang::RecordDecl *record_decl = record_type->getDecl();
3715 if (record_decl->isUnion())
3716 return lldb::eTypeClassUnion;
3717 else if (record_decl->isStruct())
3718 return lldb::eTypeClassStruct;
3719 else
3720 return lldb::eTypeClassClass;
3721 }
3722 break;
3723 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
3724 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
3725 case clang::Type::UnresolvedUsing: break;
3726 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003727 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003728 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003729 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003730
3731 case clang::Type::Attributed: break;
3732 case clang::Type::TemplateTypeParm: break;
3733 case clang::Type::SubstTemplateTypeParm: break;
3734 case clang::Type::SubstTemplateTypeParmPack:break;
3735 case clang::Type::Auto: break;
3736 case clang::Type::InjectedClassName: break;
3737 case clang::Type::DependentName: break;
3738 case clang::Type::DependentTemplateSpecialization: break;
3739 case clang::Type::PackExpansion: break;
3740
3741 case clang::Type::TypeOfExpr: break;
3742 case clang::Type::TypeOf: break;
3743 case clang::Type::Decltype: break;
3744 case clang::Type::TemplateSpecialization: break;
3745 case clang::Type::Atomic: break;
3746
3747 // pointer type decayed from an array or function type.
3748 case clang::Type::Decayed: break;
3749 case clang::Type::Adjusted: break;
3750 }
3751 // We don't know hot to display this type...
3752 return lldb::eTypeClassOther;
3753
3754}
3755
3756unsigned
3757ClangASTContext::GetTypeQualifiers(void* type)
3758{
3759 if (type)
3760 return GetQualType(type).getQualifiers().getCVRQualifiers();
3761 return 0;
3762}
3763
3764//----------------------------------------------------------------------
3765// Creating related types
3766//----------------------------------------------------------------------
3767
Greg Claytona1e5dc82015-08-11 22:53:00 +00003768CompilerType
3769ClangASTContext::AddConstModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003770{
Greg Claytonf73034f2015-09-08 18:15:05 +00003771 if (type && llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()))
Greg Claytond8d4a572015-08-11 21:38:15 +00003772 {
Greg Claytonf73034f2015-09-08 18:15:05 +00003773 // Make sure this type is a clang AST type
Greg Claytond8d4a572015-08-11 21:38:15 +00003774 clang::QualType result(GetQualType(type));
3775 result.addConst();
Greg Claytona1e5dc82015-08-11 22:53:00 +00003776 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003777 }
Greg Claytonf73034f2015-09-08 18:15:05 +00003778
Greg Claytona1e5dc82015-08-11 22:53:00 +00003779 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003780}
3781
Greg Claytona1e5dc82015-08-11 22:53:00 +00003782CompilerType
3783ClangASTContext::AddRestrictModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003784{
Greg Claytonf73034f2015-09-08 18:15:05 +00003785 if (type && llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()))
Greg Claytond8d4a572015-08-11 21:38:15 +00003786 {
3787 clang::QualType result(GetQualType(type));
3788 result.getQualifiers().setRestrict (true);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003789 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003790 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003791 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003792}
3793
Greg Claytona1e5dc82015-08-11 22:53:00 +00003794CompilerType
3795ClangASTContext::AddVolatileModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003796{
Greg Claytonf73034f2015-09-08 18:15:05 +00003797 if (type && llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()))
Greg Claytond8d4a572015-08-11 21:38:15 +00003798 {
3799 clang::QualType result(GetQualType(type));
3800 result.getQualifiers().setVolatile (true);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003801 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003802 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003803 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003804}
3805
Greg Claytona1e5dc82015-08-11 22:53:00 +00003806CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003807ClangASTContext::GetArrayElementType (void* type, uint64_t *stride)
3808{
3809 if (type)
3810 {
3811 clang::QualType qual_type(GetCanonicalQualType(type));
3812
3813 const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
3814
3815 if (!array_eletype)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003816 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003817
Greg Claytona1e5dc82015-08-11 22:53:00 +00003818 CompilerType element_type (getASTContext(), array_eletype->getCanonicalTypeUnqualified());
Greg Claytond8d4a572015-08-11 21:38:15 +00003819
3820 // TODO: the real stride will be >= this value.. find the real one!
3821 if (stride)
3822 *stride = element_type.GetByteSize(nullptr);
3823
3824 return element_type;
3825
3826 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003827 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003828}
3829
Greg Claytona1e5dc82015-08-11 22:53:00 +00003830CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003831ClangASTContext::GetCanonicalType (void* type)
3832{
3833 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003834 return CompilerType (getASTContext(), GetCanonicalQualType(type));
3835 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003836}
3837
3838static clang::QualType
3839GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
3840{
3841 if (qual_type->isPointerType())
3842 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
3843 else
3844 qual_type = qual_type.getUnqualifiedType();
3845 qual_type.removeLocalConst();
3846 qual_type.removeLocalRestrict();
3847 qual_type.removeLocalVolatile();
3848 return qual_type;
3849}
3850
Greg Claytona1e5dc82015-08-11 22:53:00 +00003851CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003852ClangASTContext::GetFullyUnqualifiedType (void* type)
3853{
3854 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003855 return CompilerType(getASTContext(), GetFullyUnqualifiedType_Impl(getASTContext(), GetQualType(type)));
3856 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003857}
3858
3859
3860int
3861ClangASTContext::GetFunctionArgumentCount (void* type)
3862{
3863 if (type)
3864 {
3865 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3866 if (func)
3867 return func->getNumParams();
3868 }
3869 return -1;
3870}
3871
Greg Claytona1e5dc82015-08-11 22:53:00 +00003872CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003873ClangASTContext::GetFunctionArgumentTypeAtIndex (void* type, size_t idx)
3874{
3875 if (type)
3876 {
3877 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3878 if (func)
3879 {
3880 const uint32_t num_args = func->getNumParams();
3881 if (idx < num_args)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003882 return CompilerType(getASTContext(), func->getParamType(idx));
Greg Claytond8d4a572015-08-11 21:38:15 +00003883 }
3884 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003885 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003886}
3887
Greg Claytona1e5dc82015-08-11 22:53:00 +00003888CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003889ClangASTContext::GetFunctionReturnType (void* type)
3890{
3891 if (type)
3892 {
3893 clang::QualType qual_type(GetCanonicalQualType(type));
3894 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3895 if (func)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003896 return CompilerType(getASTContext(), func->getReturnType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003897 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003898 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003899}
3900
3901size_t
3902ClangASTContext::GetNumMemberFunctions (void* type)
3903{
3904 size_t num_functions = 0;
3905 if (type)
3906 {
3907 clang::QualType qual_type(GetCanonicalQualType(type));
3908 switch (qual_type->getTypeClass()) {
3909 case clang::Type::Record:
3910 if (GetCompleteQualType (getASTContext(), qual_type))
3911 {
3912 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3913 const clang::RecordDecl *record_decl = record_type->getDecl();
3914 assert(record_decl);
3915 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3916 if (cxx_record_decl)
3917 num_functions = std::distance(cxx_record_decl->method_begin(), cxx_record_decl->method_end());
3918 }
3919 break;
3920
3921 case clang::Type::ObjCObjectPointer:
3922 if (GetCompleteType(type))
3923 {
3924 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
3925 if (objc_class_type)
3926 {
3927 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
3928 if (class_interface_decl)
3929 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
3930 }
3931 }
3932 break;
3933
3934 case clang::Type::ObjCObject:
3935 case clang::Type::ObjCInterface:
3936 if (GetCompleteType(type))
3937 {
3938 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
3939 if (objc_class_type)
3940 {
3941 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3942 if (class_interface_decl)
3943 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
3944 }
3945 }
3946 break;
3947
3948
3949 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003950 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00003951
3952 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003953 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00003954
3955 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003956 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00003957
3958 default:
3959 break;
3960 }
3961 }
3962 return num_functions;
3963}
3964
3965TypeMemberFunctionImpl
3966ClangASTContext::GetMemberFunctionAtIndex (void* type, size_t idx)
3967{
3968 std::string name("");
3969 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003970 CompilerType clang_type{};
Greg Claytond8d4a572015-08-11 21:38:15 +00003971 clang::ObjCMethodDecl *method_decl(nullptr);
3972 if (type)
3973 {
3974 clang::QualType qual_type(GetCanonicalQualType(type));
3975 switch (qual_type->getTypeClass()) {
3976 case clang::Type::Record:
3977 if (GetCompleteQualType (getASTContext(), qual_type))
3978 {
3979 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3980 const clang::RecordDecl *record_decl = record_type->getDecl();
3981 assert(record_decl);
3982 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3983 if (cxx_record_decl)
3984 {
3985 auto method_iter = cxx_record_decl->method_begin();
3986 auto method_end = cxx_record_decl->method_end();
3987 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
3988 {
3989 std::advance(method_iter, idx);
3990 auto method_decl = method_iter->getCanonicalDecl();
3991 if (method_decl)
3992 {
3993 if (!method_decl->getName().empty())
3994 name.assign(method_decl->getName().data());
3995 else
3996 name.clear();
3997 if (method_decl->isStatic())
3998 kind = lldb::eMemberFunctionKindStaticMethod;
3999 else if (llvm::isa<clang::CXXConstructorDecl>(method_decl))
4000 kind = lldb::eMemberFunctionKindConstructor;
4001 else if (llvm::isa<clang::CXXDestructorDecl>(method_decl))
4002 kind = lldb::eMemberFunctionKindDestructor;
4003 else
4004 kind = lldb::eMemberFunctionKindInstanceMethod;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004005 clang_type = CompilerType(getASTContext(),method_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004006 }
4007 }
4008 }
4009 }
4010 break;
4011
4012 case clang::Type::ObjCObjectPointer:
4013 if (GetCompleteType(type))
4014 {
4015 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4016 if (objc_class_type)
4017 {
4018 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4019 if (class_interface_decl)
4020 {
4021 auto method_iter = class_interface_decl->meth_begin();
4022 auto method_end = class_interface_decl->meth_end();
4023 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4024 {
4025 std::advance(method_iter, idx);
4026 method_decl = method_iter->getCanonicalDecl();
4027 if (method_decl)
4028 {
4029 name = method_decl->getSelector().getAsString();
4030 if (method_decl->isClassMethod())
4031 kind = lldb::eMemberFunctionKindStaticMethod;
4032 else
4033 kind = lldb::eMemberFunctionKindInstanceMethod;
4034 }
4035 }
4036 }
4037 }
4038 }
4039 break;
4040
4041 case clang::Type::ObjCObject:
4042 case clang::Type::ObjCInterface:
4043 if (GetCompleteType(type))
4044 {
4045 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4046 if (objc_class_type)
4047 {
4048 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4049 if (class_interface_decl)
4050 {
4051 auto method_iter = class_interface_decl->meth_begin();
4052 auto method_end = class_interface_decl->meth_end();
4053 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4054 {
4055 std::advance(method_iter, idx);
4056 method_decl = method_iter->getCanonicalDecl();
4057 if (method_decl)
4058 {
4059 name = method_decl->getSelector().getAsString();
4060 if (method_decl->isClassMethod())
4061 kind = lldb::eMemberFunctionKindStaticMethod;
4062 else
4063 kind = lldb::eMemberFunctionKindInstanceMethod;
4064 }
4065 }
4066 }
4067 }
4068 }
4069 break;
4070
4071 case clang::Type::Typedef:
4072 return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx);
4073
4074 case clang::Type::Elaborated:
4075 return GetMemberFunctionAtIndex(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx);
4076
4077 case clang::Type::Paren:
4078 return GetMemberFunctionAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx);
4079
4080 default:
4081 break;
4082 }
4083 }
4084
4085 if (kind == eMemberFunctionKindUnknown)
4086 return TypeMemberFunctionImpl();
4087 if (method_decl)
4088 return TypeMemberFunctionImpl(method_decl, name, kind);
4089 if (type)
4090 return TypeMemberFunctionImpl(clang_type, name, kind);
4091
4092 return TypeMemberFunctionImpl();
4093}
4094
Greg Claytona1e5dc82015-08-11 22:53:00 +00004095CompilerType
4096ClangASTContext::GetLValueReferenceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004097{
4098 if (type)
4099 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004100 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004101 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004102 return CompilerType(ast->getASTContext(), ast->getASTContext()->getLValueReferenceType(GetQualType(type)));
Greg Claytond8d4a572015-08-11 21:38:15 +00004103 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004104 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004105}
4106
Greg Claytona1e5dc82015-08-11 22:53:00 +00004107CompilerType
4108ClangASTContext::GetRValueReferenceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004109{
4110 if (type)
4111 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004112 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004113 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004114 return CompilerType(ast->getASTContext(), ast->getASTContext()->getRValueReferenceType(GetQualType(type)));
Greg Claytond8d4a572015-08-11 21:38:15 +00004115 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004116 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004117}
4118
Greg Claytona1e5dc82015-08-11 22:53:00 +00004119CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004120ClangASTContext::GetNonReferenceType (void* type)
4121{
4122 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004123 return CompilerType(getASTContext(), GetQualType(type).getNonReferenceType());
4124 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004125}
4126
Greg Claytona1e5dc82015-08-11 22:53:00 +00004127CompilerType
4128ClangASTContext::CreateTypedefType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00004129 const char *typedef_name,
Greg Clayton99558cc42015-08-24 23:46:31 +00004130 const CompilerDeclContext &compiler_decl_ctx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004131{
4132 if (type && typedef_name && typedef_name[0])
4133 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004134 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004135 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004136 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004137 clang::ASTContext* clang_ast = ast->getASTContext();
4138 clang::QualType qual_type (GetQualType(type));
Greg Clayton99558cc42015-08-24 23:46:31 +00004139
4140 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004141 if (decl_ctx == nullptr)
4142 decl_ctx = ast->getASTContext()->getTranslationUnitDecl();
Greg Clayton99558cc42015-08-24 23:46:31 +00004143
Greg Claytond8d4a572015-08-11 21:38:15 +00004144 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4145 decl_ctx,
4146 clang::SourceLocation(),
4147 clang::SourceLocation(),
4148 &clang_ast->Idents.get(typedef_name),
4149 clang_ast->getTrivialTypeSourceInfo(qual_type));
4150
4151 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4152
4153 // Get a uniqued clang::QualType for the typedef decl type
Greg Claytona1e5dc82015-08-11 22:53:00 +00004154 return CompilerType (clang_ast, clang_ast->getTypedefType (decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00004155 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004156 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004157
4158}
4159
Greg Claytona1e5dc82015-08-11 22:53:00 +00004160CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004161ClangASTContext::GetPointeeType (void* type)
4162{
4163 if (type)
4164 {
4165 clang::QualType qual_type(GetQualType(type));
Greg Claytona1e5dc82015-08-11 22:53:00 +00004166 return CompilerType (getASTContext(), qual_type.getTypePtr()->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004167 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004168 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004169}
4170
Greg Claytona1e5dc82015-08-11 22:53:00 +00004171CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004172ClangASTContext::GetPointerType (void* type)
4173{
4174 if (type)
4175 {
4176 clang::QualType qual_type (GetQualType(type));
4177
4178 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4179 switch (type_class)
4180 {
4181 case clang::Type::ObjCObject:
4182 case clang::Type::ObjCInterface:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004183 return CompilerType(getASTContext(), getASTContext()->getObjCObjectPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004184
4185 default:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004186 return CompilerType(getASTContext(), getASTContext()->getPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004187 }
4188 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004189 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004190}
4191
Greg Claytona1e5dc82015-08-11 22:53:00 +00004192CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004193ClangASTContext::GetTypedefedType (void* type)
4194{
4195 if (type)
4196 {
4197 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4198 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004199 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004200 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004201 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004202}
4203
Greg Claytona1e5dc82015-08-11 22:53:00 +00004204CompilerType
4205ClangASTContext::RemoveFastQualifiers (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004206{
Greg Claytonf73034f2015-09-08 18:15:05 +00004207 if (type && llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()))
Greg Claytond8d4a572015-08-11 21:38:15 +00004208 {
4209 clang::QualType qual_type(GetQualType(type));
4210 qual_type.getQualifiers().removeFastQualifiers();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004211 return CompilerType (type.GetTypeSystem(), qual_type.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004212 }
4213 return type;
4214}
4215
4216
4217//----------------------------------------------------------------------
4218// Create related types using the current type's AST
4219//----------------------------------------------------------------------
4220
Greg Claytona1e5dc82015-08-11 22:53:00 +00004221CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00004222ClangASTContext::GetBasicTypeFromAST (lldb::BasicType basic_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004223{
Greg Clayton99558cc42015-08-24 23:46:31 +00004224 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004225}
4226//----------------------------------------------------------------------
4227// Exploring the type
4228//----------------------------------------------------------------------
4229
4230uint64_t
4231ClangASTContext::GetBitSize (void* type, ExecutionContextScope *exe_scope)
4232{
4233 if (GetCompleteType (type))
4234 {
4235 clang::QualType qual_type(GetCanonicalQualType(type));
4236 switch (qual_type->getTypeClass())
4237 {
4238 case clang::Type::ObjCInterface:
4239 case clang::Type::ObjCObject:
4240 {
4241 ExecutionContext exe_ctx (exe_scope);
4242 Process *process = exe_ctx.GetProcessPtr();
4243 if (process)
4244 {
4245 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4246 if (objc_runtime)
4247 {
4248 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004249 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00004250 return bit_size;
4251 }
4252 }
4253 else
4254 {
4255 static bool g_printed = false;
4256 if (!g_printed)
4257 {
4258 StreamString s;
4259 DumpTypeDescription(&s);
4260
4261 llvm::outs() << "warning: trying to determine the size of type ";
4262 llvm::outs() << s.GetString() << "\n";
4263 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
4264 llvm::outs() << "backtrace:\n";
4265 llvm::sys::PrintStackTrace(llvm::outs());
4266 llvm::outs() << "\n";
4267 g_printed = true;
4268 }
4269 }
4270 }
4271 // fallthrough
4272 default:
4273 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
4274 if (bit_size == 0)
4275 {
4276 if (qual_type->isIncompleteArrayType())
4277 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
4278 }
4279 if (qual_type->isObjCObjectOrInterfaceType())
4280 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
4281 return bit_size;
4282 }
4283 }
4284 return 0;
4285}
4286
4287size_t
4288ClangASTContext::GetTypeBitAlign (void* type)
4289{
4290 if (GetCompleteType(type))
4291 return getASTContext()->getTypeAlign(GetQualType(type));
4292 return 0;
4293}
4294
4295
4296lldb::Encoding
4297ClangASTContext::GetEncoding (void* type, uint64_t &count)
4298{
4299 if (!type)
4300 return lldb::eEncodingInvalid;
4301
4302 count = 1;
4303 clang::QualType qual_type(GetCanonicalQualType(type));
4304
4305 switch (qual_type->getTypeClass())
4306 {
4307 case clang::Type::UnaryTransform:
4308 break;
4309
4310 case clang::Type::FunctionNoProto:
4311 case clang::Type::FunctionProto:
4312 break;
4313
4314 case clang::Type::IncompleteArray:
4315 case clang::Type::VariableArray:
4316 break;
4317
4318 case clang::Type::ConstantArray:
4319 break;
4320
4321 case clang::Type::ExtVector:
4322 case clang::Type::Vector:
4323 // TODO: Set this to more than one???
4324 break;
4325
4326 case clang::Type::Builtin:
4327 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4328 {
4329 default: assert(0 && "Unknown builtin type!");
4330 case clang::BuiltinType::Void:
4331 break;
4332
4333 case clang::BuiltinType::Bool:
4334 case clang::BuiltinType::Char_S:
4335 case clang::BuiltinType::SChar:
4336 case clang::BuiltinType::WChar_S:
4337 case clang::BuiltinType::Char16:
4338 case clang::BuiltinType::Char32:
4339 case clang::BuiltinType::Short:
4340 case clang::BuiltinType::Int:
4341 case clang::BuiltinType::Long:
4342 case clang::BuiltinType::LongLong:
4343 case clang::BuiltinType::Int128: return lldb::eEncodingSint;
4344
4345 case clang::BuiltinType::Char_U:
4346 case clang::BuiltinType::UChar:
4347 case clang::BuiltinType::WChar_U:
4348 case clang::BuiltinType::UShort:
4349 case clang::BuiltinType::UInt:
4350 case clang::BuiltinType::ULong:
4351 case clang::BuiltinType::ULongLong:
4352 case clang::BuiltinType::UInt128: return lldb::eEncodingUint;
4353
4354 case clang::BuiltinType::Float:
4355 case clang::BuiltinType::Double:
4356 case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
4357
4358 case clang::BuiltinType::ObjCClass:
4359 case clang::BuiltinType::ObjCId:
4360 case clang::BuiltinType::ObjCSel: return lldb::eEncodingUint;
4361
4362 case clang::BuiltinType::NullPtr: return lldb::eEncodingUint;
4363
4364 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4365 case clang::BuiltinType::Kind::BoundMember:
4366 case clang::BuiltinType::Kind::BuiltinFn:
4367 case clang::BuiltinType::Kind::Dependent:
4368 case clang::BuiltinType::Kind::Half:
4369 case clang::BuiltinType::Kind::OCLEvent:
4370 case clang::BuiltinType::Kind::OCLImage1d:
4371 case clang::BuiltinType::Kind::OCLImage1dArray:
4372 case clang::BuiltinType::Kind::OCLImage1dBuffer:
4373 case clang::BuiltinType::Kind::OCLImage2d:
4374 case clang::BuiltinType::Kind::OCLImage2dArray:
4375 case clang::BuiltinType::Kind::OCLImage3d:
4376 case clang::BuiltinType::Kind::OCLSampler:
4377 case clang::BuiltinType::Kind::Overload:
4378 case clang::BuiltinType::Kind::PseudoObject:
4379 case clang::BuiltinType::Kind::UnknownAny:
4380 break;
4381 }
4382 break;
4383 // All pointer types are represented as unsigned integer encodings.
4384 // We may nee to add a eEncodingPointer if we ever need to know the
4385 // difference
4386 case clang::Type::ObjCObjectPointer:
4387 case clang::Type::BlockPointer:
4388 case clang::Type::Pointer:
4389 case clang::Type::LValueReference:
4390 case clang::Type::RValueReference:
4391 case clang::Type::MemberPointer: return lldb::eEncodingUint;
4392 case clang::Type::Complex:
4393 {
4394 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4395 if (qual_type->isComplexType())
4396 encoding = lldb::eEncodingIEEE754;
4397 else
4398 {
4399 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
4400 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004401 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004402 else
4403 encoding = lldb::eEncodingSint;
4404 }
4405 count = 2;
4406 return encoding;
4407 }
4408
4409 case clang::Type::ObjCInterface: break;
4410 case clang::Type::Record: break;
4411 case clang::Type::Enum: return lldb::eEncodingSint;
4412 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004413 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004414
4415 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004416 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004417
4418 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004419 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004420
4421 case clang::Type::DependentSizedArray:
4422 case clang::Type::DependentSizedExtVector:
4423 case clang::Type::UnresolvedUsing:
4424 case clang::Type::Attributed:
4425 case clang::Type::TemplateTypeParm:
4426 case clang::Type::SubstTemplateTypeParm:
4427 case clang::Type::SubstTemplateTypeParmPack:
4428 case clang::Type::Auto:
4429 case clang::Type::InjectedClassName:
4430 case clang::Type::DependentName:
4431 case clang::Type::DependentTemplateSpecialization:
4432 case clang::Type::PackExpansion:
4433 case clang::Type::ObjCObject:
4434
4435 case clang::Type::TypeOfExpr:
4436 case clang::Type::TypeOf:
4437 case clang::Type::Decltype:
4438 case clang::Type::TemplateSpecialization:
4439 case clang::Type::Atomic:
4440 case clang::Type::Adjusted:
4441 break;
4442
4443 // pointer type decayed from an array or function type.
4444 case clang::Type::Decayed:
4445 break;
4446 }
4447 count = 0;
4448 return lldb::eEncodingInvalid;
4449}
4450
4451lldb::Format
4452ClangASTContext::GetFormat (void* type)
4453{
4454 if (!type)
4455 return lldb::eFormatDefault;
4456
4457 clang::QualType qual_type(GetCanonicalQualType(type));
4458
4459 switch (qual_type->getTypeClass())
4460 {
4461 case clang::Type::UnaryTransform:
4462 break;
4463
4464 case clang::Type::FunctionNoProto:
4465 case clang::Type::FunctionProto:
4466 break;
4467
4468 case clang::Type::IncompleteArray:
4469 case clang::Type::VariableArray:
4470 break;
4471
4472 case clang::Type::ConstantArray:
4473 return lldb::eFormatVoid; // no value
4474
4475 case clang::Type::ExtVector:
4476 case clang::Type::Vector:
4477 break;
4478
4479 case clang::Type::Builtin:
4480 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4481 {
4482 //default: assert(0 && "Unknown builtin type!");
4483 case clang::BuiltinType::UnknownAny:
4484 case clang::BuiltinType::Void:
4485 case clang::BuiltinType::BoundMember:
4486 break;
4487
4488 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
4489 case clang::BuiltinType::Char_S:
4490 case clang::BuiltinType::SChar:
4491 case clang::BuiltinType::WChar_S:
4492 case clang::BuiltinType::Char_U:
4493 case clang::BuiltinType::UChar:
4494 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
4495 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
4496 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
4497 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
4498 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
4499 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
4500 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
4501 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
4502 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
4503 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
4504 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
4505 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
4506 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
4507 case clang::BuiltinType::Float: return lldb::eFormatFloat;
4508 case clang::BuiltinType::Double: return lldb::eFormatFloat;
4509 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
4510 case clang::BuiltinType::NullPtr:
4511 case clang::BuiltinType::Overload:
4512 case clang::BuiltinType::Dependent:
4513 case clang::BuiltinType::ObjCId:
4514 case clang::BuiltinType::ObjCClass:
4515 case clang::BuiltinType::ObjCSel:
4516 case clang::BuiltinType::Half:
4517 case clang::BuiltinType::ARCUnbridgedCast:
4518 case clang::BuiltinType::PseudoObject:
4519 case clang::BuiltinType::BuiltinFn:
4520 case clang::BuiltinType::OCLEvent:
4521 case clang::BuiltinType::OCLImage1d:
4522 case clang::BuiltinType::OCLImage1dArray:
4523 case clang::BuiltinType::OCLImage1dBuffer:
4524 case clang::BuiltinType::OCLImage2d:
4525 case clang::BuiltinType::OCLImage2dArray:
4526 case clang::BuiltinType::OCLImage3d:
4527 case clang::BuiltinType::OCLSampler:
4528 return lldb::eFormatHex;
4529 }
4530 break;
4531 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
4532 case clang::Type::BlockPointer: return lldb::eFormatHex;
4533 case clang::Type::Pointer: return lldb::eFormatHex;
4534 case clang::Type::LValueReference:
4535 case clang::Type::RValueReference: return lldb::eFormatHex;
4536 case clang::Type::MemberPointer: break;
4537 case clang::Type::Complex:
4538 {
4539 if (qual_type->isComplexType())
4540 return lldb::eFormatComplex;
4541 else
4542 return lldb::eFormatComplexInteger;
4543 }
4544 case clang::Type::ObjCInterface: break;
4545 case clang::Type::Record: break;
4546 case clang::Type::Enum: return lldb::eFormatEnum;
4547 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004548 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004549 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004550 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004551 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004552 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004553 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004554 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004555 case clang::Type::DependentSizedArray:
4556 case clang::Type::DependentSizedExtVector:
4557 case clang::Type::UnresolvedUsing:
4558 case clang::Type::Attributed:
4559 case clang::Type::TemplateTypeParm:
4560 case clang::Type::SubstTemplateTypeParm:
4561 case clang::Type::SubstTemplateTypeParmPack:
4562 case clang::Type::InjectedClassName:
4563 case clang::Type::DependentName:
4564 case clang::Type::DependentTemplateSpecialization:
4565 case clang::Type::PackExpansion:
4566 case clang::Type::ObjCObject:
4567
4568 case clang::Type::TypeOfExpr:
4569 case clang::Type::TypeOf:
4570 case clang::Type::Decltype:
4571 case clang::Type::TemplateSpecialization:
4572 case clang::Type::Atomic:
4573 case clang::Type::Adjusted:
4574 break;
4575
4576 // pointer type decayed from an array or function type.
4577 case clang::Type::Decayed:
4578 break;
4579 }
4580 // We don't know hot to display this type...
4581 return lldb::eFormatBytes;
4582}
4583
4584static bool
4585ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
4586{
4587 while (class_interface_decl)
4588 {
4589 if (class_interface_decl->ivar_size() > 0)
4590 return true;
4591
4592 if (check_superclass)
4593 class_interface_decl = class_interface_decl->getSuperClass();
4594 else
4595 break;
4596 }
4597 return false;
4598}
4599
4600uint32_t
4601ClangASTContext::GetNumChildren (void* type, bool omit_empty_base_classes)
4602{
4603 if (!type)
4604 return 0;
4605
4606 uint32_t num_children = 0;
4607 clang::QualType qual_type(GetQualType(type));
4608 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4609 switch (type_class)
4610 {
4611 case clang::Type::Builtin:
4612 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4613 {
4614 case clang::BuiltinType::ObjCId: // child is Class
4615 case clang::BuiltinType::ObjCClass: // child is Class
4616 num_children = 1;
4617 break;
4618
4619 default:
4620 break;
4621 }
4622 break;
4623
4624 case clang::Type::Complex: return 0;
4625
4626 case clang::Type::Record:
4627 if (GetCompleteQualType (getASTContext(), qual_type))
4628 {
4629 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4630 const clang::RecordDecl *record_decl = record_type->getDecl();
4631 assert(record_decl);
4632 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4633 if (cxx_record_decl)
4634 {
4635 if (omit_empty_base_classes)
4636 {
4637 // Check each base classes to see if it or any of its
4638 // base classes contain any fields. This can help
4639 // limit the noise in variable views by not having to
4640 // show base classes that contain no members.
4641 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4642 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4643 base_class != base_class_end;
4644 ++base_class)
4645 {
4646 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
4647
4648 // Skip empty base classes
4649 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
4650 continue;
4651
4652 num_children++;
4653 }
4654 }
4655 else
4656 {
4657 // Include all base classes
4658 num_children += cxx_record_decl->getNumBases();
4659 }
4660
4661 }
4662 clang::RecordDecl::field_iterator field, field_end;
4663 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
4664 ++num_children;
4665 }
4666 break;
4667
4668 case clang::Type::ObjCObject:
4669 case clang::Type::ObjCInterface:
4670 if (GetCompleteQualType (getASTContext(), qual_type))
4671 {
4672 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4673 assert (objc_class_type);
4674 if (objc_class_type)
4675 {
4676 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4677
4678 if (class_interface_decl)
4679 {
4680
4681 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4682 if (superclass_interface_decl)
4683 {
4684 if (omit_empty_base_classes)
4685 {
4686 if (ObjCDeclHasIVars (superclass_interface_decl, true))
4687 ++num_children;
4688 }
4689 else
4690 ++num_children;
4691 }
4692
4693 num_children += class_interface_decl->ivar_size();
4694 }
4695 }
4696 }
4697 break;
4698
4699 case clang::Type::ObjCObjectPointer:
4700 {
4701 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
4702 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004703 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004704 // If this type points to a simple type, then it has 1 child
4705 if (num_pointee_children == 0)
4706 num_children = 1;
4707 else
4708 num_children = num_pointee_children;
4709 }
4710 break;
4711
4712 case clang::Type::Vector:
4713 case clang::Type::ExtVector:
4714 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
4715 break;
4716
4717 case clang::Type::ConstantArray:
4718 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4719 break;
4720
4721 case clang::Type::Pointer:
4722 {
4723 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
4724 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00004725 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004726 if (num_pointee_children == 0)
4727 {
4728 // We have a pointer to a pointee type that claims it has no children.
4729 // We will want to look at
4730 num_children = GetNumPointeeChildren (pointee_type);
4731 }
4732 else
4733 num_children = num_pointee_children;
4734 }
4735 break;
4736
4737 case clang::Type::LValueReference:
4738 case clang::Type::RValueReference:
4739 {
4740 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
4741 clang::QualType pointee_type = reference_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004742 uint32_t num_pointee_children = CompilerType (getASTContext(), pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004743 // If this type points to a simple type, then it has 1 child
4744 if (num_pointee_children == 0)
4745 num_children = 1;
4746 else
4747 num_children = num_pointee_children;
4748 }
4749 break;
4750
4751
4752 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004753 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004754 break;
4755
4756 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004757 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004758 break;
4759
4760 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004761 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004762 break;
4763 default:
4764 break;
4765 }
4766 return num_children;
4767}
4768
4769lldb::BasicType
4770ClangASTContext::GetBasicTypeEnumeration (void* type)
4771{
4772 if (type)
4773 {
4774 clang::QualType qual_type(GetQualType(type));
4775 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4776 if (type_class == clang::Type::Builtin)
4777 {
4778 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4779 {
4780 case clang::BuiltinType::Void: return eBasicTypeVoid;
4781 case clang::BuiltinType::Bool: return eBasicTypeBool;
4782 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
4783 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
4784 case clang::BuiltinType::Char16: return eBasicTypeChar16;
4785 case clang::BuiltinType::Char32: return eBasicTypeChar32;
4786 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
4787 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
4788 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
4789 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
4790 case clang::BuiltinType::Short: return eBasicTypeShort;
4791 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
4792 case clang::BuiltinType::Int: return eBasicTypeInt;
4793 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
4794 case clang::BuiltinType::Long: return eBasicTypeLong;
4795 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
4796 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
4797 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
4798 case clang::BuiltinType::Int128: return eBasicTypeInt128;
4799 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
4800
4801 case clang::BuiltinType::Half: return eBasicTypeHalf;
4802 case clang::BuiltinType::Float: return eBasicTypeFloat;
4803 case clang::BuiltinType::Double: return eBasicTypeDouble;
4804 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
4805
4806 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
4807 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
4808 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
4809 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
4810 case clang::BuiltinType::Dependent:
4811 case clang::BuiltinType::Overload:
4812 case clang::BuiltinType::BoundMember:
4813 case clang::BuiltinType::PseudoObject:
4814 case clang::BuiltinType::UnknownAny:
4815 case clang::BuiltinType::BuiltinFn:
4816 case clang::BuiltinType::ARCUnbridgedCast:
4817 case clang::BuiltinType::OCLEvent:
4818 case clang::BuiltinType::OCLImage1d:
4819 case clang::BuiltinType::OCLImage1dArray:
4820 case clang::BuiltinType::OCLImage1dBuffer:
4821 case clang::BuiltinType::OCLImage2d:
4822 case clang::BuiltinType::OCLImage2dArray:
4823 case clang::BuiltinType::OCLImage3d:
4824 case clang::BuiltinType::OCLSampler:
4825 return eBasicTypeOther;
4826 }
4827 }
4828 }
4829 return eBasicTypeInvalid;
4830}
4831
Greg Clayton99558cc42015-08-24 23:46:31 +00004832void
4833ClangASTContext::ForEachEnumerator (void* type, std::function <bool (const CompilerType &integer_type, const ConstString &name, const llvm::APSInt &value)> const &callback)
4834{
4835 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
4836 if (enum_type)
4837 {
4838 const clang::EnumDecl *enum_decl = enum_type->getDecl();
4839 if (enum_decl)
4840 {
4841 CompilerType integer_type(this, enum_decl->getIntegerType().getAsOpaquePtr());
4842
4843 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
4844 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
4845 {
4846 ConstString name(enum_pos->getNameAsString().c_str());
4847 if (!callback (integer_type, name, enum_pos->getInitVal()))
4848 break;
4849 }
4850 }
4851 }
4852}
4853
Greg Claytond8d4a572015-08-11 21:38:15 +00004854
4855#pragma mark Aggregate Types
4856
4857uint32_t
Greg Claytond8d4a572015-08-11 21:38:15 +00004858ClangASTContext::GetNumFields (void* type)
4859{
4860 if (!type)
4861 return 0;
4862
4863 uint32_t count = 0;
4864 clang::QualType qual_type(GetCanonicalQualType(type));
4865 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4866 switch (type_class)
4867 {
4868 case clang::Type::Record:
4869 if (GetCompleteType(type))
4870 {
4871 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
4872 if (record_type)
4873 {
4874 clang::RecordDecl *record_decl = record_type->getDecl();
4875 if (record_decl)
4876 {
4877 uint32_t field_idx = 0;
4878 clang::RecordDecl::field_iterator field, field_end;
4879 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
4880 ++field_idx;
4881 count = field_idx;
4882 }
4883 }
4884 }
4885 break;
4886
4887 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004888 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00004889 break;
4890
4891 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004892 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00004893 break;
4894
4895 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004896 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00004897 break;
4898
4899 case clang::Type::ObjCObjectPointer:
4900 if (GetCompleteType(type))
4901 {
4902 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4903 if (objc_class_type)
4904 {
4905 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4906
4907 if (class_interface_decl)
4908 count = class_interface_decl->ivar_size();
4909 }
4910 }
4911 break;
4912
4913 case clang::Type::ObjCObject:
4914 case clang::Type::ObjCInterface:
4915 if (GetCompleteType(type))
4916 {
4917 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4918 if (objc_class_type)
4919 {
4920 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4921
4922 if (class_interface_decl)
4923 count = class_interface_decl->ivar_size();
4924 }
4925 }
4926 break;
4927
4928 default:
4929 break;
4930 }
4931 return count;
4932}
4933
Greg Claytond8d4a572015-08-11 21:38:15 +00004934static clang_type_t
4935GetObjCFieldAtIndex (clang::ASTContext *ast,
4936 clang::ObjCInterfaceDecl *class_interface_decl,
4937 size_t idx,
4938 std::string& name,
4939 uint64_t *bit_offset_ptr,
4940 uint32_t *bitfield_bit_size_ptr,
4941 bool *is_bitfield_ptr)
4942{
4943 if (class_interface_decl)
4944 {
4945 if (idx < (class_interface_decl->ivar_size()))
4946 {
4947 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4948 uint32_t ivar_idx = 0;
4949
4950 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
4951 {
4952 if (ivar_idx == idx)
4953 {
4954 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
4955
4956 clang::QualType ivar_qual_type(ivar_decl->getType());
4957
4958 name.assign(ivar_decl->getNameAsString());
4959
4960 if (bit_offset_ptr)
4961 {
4962 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
4963 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
4964 }
4965
4966 const bool is_bitfield = ivar_pos->isBitField();
4967
4968 if (bitfield_bit_size_ptr)
4969 {
4970 *bitfield_bit_size_ptr = 0;
4971
4972 if (is_bitfield && ast)
4973 {
4974 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
4975 llvm::APSInt bitfield_apsint;
4976 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
4977 {
4978 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
4979 }
4980 }
4981 }
4982 if (is_bitfield_ptr)
4983 *is_bitfield_ptr = is_bitfield;
4984
4985 return ivar_qual_type.getAsOpaquePtr();
4986 }
4987 }
4988 }
4989 }
4990 return nullptr;
4991}
4992
Greg Claytona1e5dc82015-08-11 22:53:00 +00004993CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004994ClangASTContext::GetFieldAtIndex (void* type, size_t idx,
4995 std::string& name,
4996 uint64_t *bit_offset_ptr,
4997 uint32_t *bitfield_bit_size_ptr,
4998 bool *is_bitfield_ptr)
4999{
5000 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005001 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005002
5003 clang::QualType qual_type(GetCanonicalQualType(type));
5004 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5005 switch (type_class)
5006 {
5007 case clang::Type::Record:
5008 if (GetCompleteType(type))
5009 {
5010 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5011 const clang::RecordDecl *record_decl = record_type->getDecl();
5012 uint32_t field_idx = 0;
5013 clang::RecordDecl::field_iterator field, field_end;
5014 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
5015 {
5016 if (idx == field_idx)
5017 {
5018 // Print the member type if requested
5019 // Print the member name and equal sign
5020 name.assign(field->getNameAsString());
5021
5022 // Figure out the type byte size (field_type_info.first) and
5023 // alignment (field_type_info.second) from the AST context.
5024 if (bit_offset_ptr)
5025 {
5026 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5027 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5028 }
5029
5030 const bool is_bitfield = field->isBitField();
5031
5032 if (bitfield_bit_size_ptr)
5033 {
5034 *bitfield_bit_size_ptr = 0;
5035
5036 if (is_bitfield)
5037 {
5038 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5039 llvm::APSInt bitfield_apsint;
5040 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5041 {
5042 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5043 }
5044 }
5045 }
5046 if (is_bitfield_ptr)
5047 *is_bitfield_ptr = is_bitfield;
5048
Greg Claytona1e5dc82015-08-11 22:53:00 +00005049 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005050 }
5051 }
5052 }
5053 break;
5054
5055 case clang::Type::ObjCObjectPointer:
5056 if (GetCompleteType(type))
5057 {
5058 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5059 if (objc_class_type)
5060 {
5061 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005062 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 +00005063 }
5064 }
5065 break;
5066
5067 case clang::Type::ObjCObject:
5068 case clang::Type::ObjCInterface:
5069 if (GetCompleteType(type))
5070 {
5071 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5072 assert (objc_class_type);
5073 if (objc_class_type)
5074 {
5075 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005076 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 +00005077 }
5078 }
5079 break;
5080
5081
5082 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005083 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005084 GetFieldAtIndex (idx,
5085 name,
5086 bit_offset_ptr,
5087 bitfield_bit_size_ptr,
5088 is_bitfield_ptr);
5089
5090 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005091 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005092 GetFieldAtIndex (idx,
5093 name,
5094 bit_offset_ptr,
5095 bitfield_bit_size_ptr,
5096 is_bitfield_ptr);
5097
5098 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005099 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005100 GetFieldAtIndex (idx,
5101 name,
5102 bit_offset_ptr,
5103 bitfield_bit_size_ptr,
5104 is_bitfield_ptr);
5105
5106 default:
5107 break;
5108 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005109 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005110}
5111
Greg Clayton99558cc42015-08-24 23:46:31 +00005112uint32_t
5113ClangASTContext::GetNumDirectBaseClasses (void *type)
5114{
5115 uint32_t count = 0;
5116 clang::QualType qual_type(GetCanonicalQualType(type));
5117 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5118 switch (type_class)
5119 {
5120 case clang::Type::Record:
5121 if (GetCompleteType(type))
5122 {
5123 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5124 if (cxx_record_decl)
5125 count = cxx_record_decl->getNumBases();
5126 }
5127 break;
5128
5129 case clang::Type::ObjCObjectPointer:
5130 count = GetPointeeType(type).GetNumDirectBaseClasses();
5131 break;
5132
5133 case clang::Type::ObjCObject:
5134 if (GetCompleteType(type))
5135 {
5136 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5137 if (objc_class_type)
5138 {
5139 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5140
5141 if (class_interface_decl && class_interface_decl->getSuperClass())
5142 count = 1;
5143 }
5144 }
5145 break;
5146 case clang::Type::ObjCInterface:
5147 if (GetCompleteType(type))
5148 {
5149 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5150 if (objc_interface_type)
5151 {
5152 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5153
5154 if (class_interface_decl && class_interface_decl->getSuperClass())
5155 count = 1;
5156 }
5157 }
5158 break;
5159
5160
5161 case clang::Type::Typedef:
5162 count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5163 break;
5164
5165 case clang::Type::Elaborated:
5166 count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5167 break;
5168
5169 case clang::Type::Paren:
5170 return GetNumDirectBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5171
5172 default:
5173 break;
5174 }
5175 return count;
5176
5177}
5178
5179uint32_t
5180ClangASTContext::GetNumVirtualBaseClasses (void *type)
5181{
5182 uint32_t count = 0;
5183 clang::QualType qual_type(GetCanonicalQualType(type));
5184 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5185 switch (type_class)
5186 {
5187 case clang::Type::Record:
5188 if (GetCompleteType(type))
5189 {
5190 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5191 if (cxx_record_decl)
5192 count = cxx_record_decl->getNumVBases();
5193 }
5194 break;
5195
5196 case clang::Type::Typedef:
5197 count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5198 break;
5199
5200 case clang::Type::Elaborated:
5201 count = GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5202 break;
5203
5204 case clang::Type::Paren:
5205 count = GetNumVirtualBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5206 break;
5207
5208 default:
5209 break;
5210 }
5211 return count;
5212
5213}
5214
5215CompilerType
5216ClangASTContext::GetDirectBaseClassAtIndex (void *type, size_t idx, uint32_t *bit_offset_ptr)
5217{
5218 clang::QualType qual_type(GetCanonicalQualType(type));
5219 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5220 switch (type_class)
5221 {
5222 case clang::Type::Record:
5223 if (GetCompleteType(type))
5224 {
5225 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5226 if (cxx_record_decl)
5227 {
5228 uint32_t curr_idx = 0;
5229 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5230 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5231 base_class != base_class_end;
5232 ++base_class, ++curr_idx)
5233 {
5234 if (curr_idx == idx)
5235 {
5236 if (bit_offset_ptr)
5237 {
5238 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5239 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5240 if (base_class->isVirtual())
5241 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5242 else
5243 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5244 }
5245 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5246 }
5247 }
5248 }
5249 }
5250 break;
5251
5252 case clang::Type::ObjCObjectPointer:
5253 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
5254
5255 case clang::Type::ObjCObject:
5256 if (idx == 0 && GetCompleteType(type))
5257 {
5258 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5259 if (objc_class_type)
5260 {
5261 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5262
5263 if (class_interface_decl)
5264 {
5265 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5266 if (superclass_interface_decl)
5267 {
5268 if (bit_offset_ptr)
5269 *bit_offset_ptr = 0;
5270 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5271 }
5272 }
5273 }
5274 }
5275 break;
5276 case clang::Type::ObjCInterface:
5277 if (idx == 0 && GetCompleteType(type))
5278 {
5279 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5280 if (objc_interface_type)
5281 {
5282 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5283
5284 if (class_interface_decl)
5285 {
5286 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5287 if (superclass_interface_decl)
5288 {
5289 if (bit_offset_ptr)
5290 *bit_offset_ptr = 0;
5291 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5292 }
5293 }
5294 }
5295 }
5296 break;
5297
5298
5299 case clang::Type::Typedef:
5300 return GetDirectBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5301
5302 case clang::Type::Elaborated:
5303 return GetDirectBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5304
5305 case clang::Type::Paren:
5306 return GetDirectBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5307
5308 default:
5309 break;
5310 }
5311 return CompilerType();
5312}
5313
5314CompilerType
5315ClangASTContext::GetVirtualBaseClassAtIndex (void *type,
5316 size_t idx,
5317 uint32_t *bit_offset_ptr)
5318{
5319 clang::QualType qual_type(GetCanonicalQualType(type));
5320 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5321 switch (type_class)
5322 {
5323 case clang::Type::Record:
5324 if (GetCompleteType(type))
5325 {
5326 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5327 if (cxx_record_decl)
5328 {
5329 uint32_t curr_idx = 0;
5330 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5331 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
5332 base_class != base_class_end;
5333 ++base_class, ++curr_idx)
5334 {
5335 if (curr_idx == idx)
5336 {
5337 if (bit_offset_ptr)
5338 {
5339 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5340 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5341 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5342
5343 }
5344 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5345 }
5346 }
5347 }
5348 }
5349 break;
5350
5351 case clang::Type::Typedef:
5352 return GetVirtualBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5353
5354 case clang::Type::Elaborated:
5355 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5356
5357 case clang::Type::Paren:
5358 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5359
5360 default:
5361 break;
5362 }
5363 return CompilerType();
5364
5365}
5366
Greg Claytond8d4a572015-08-11 21:38:15 +00005367// If a pointer to a pointee type (the clang_type arg) says that it has no
5368// children, then we either need to trust it, or override it and return a
5369// different result. For example, an "int *" has one child that is an integer,
5370// but a function pointer doesn't have any children. Likewise if a Record type
5371// claims it has no children, then there really is nothing to show.
5372uint32_t
5373ClangASTContext::GetNumPointeeChildren (clang::QualType type)
5374{
5375 if (type.isNull())
5376 return 0;
5377
5378 clang::QualType qual_type(type.getCanonicalType());
5379 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5380 switch (type_class)
5381 {
5382 case clang::Type::Builtin:
5383 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5384 {
5385 case clang::BuiltinType::UnknownAny:
5386 case clang::BuiltinType::Void:
5387 case clang::BuiltinType::NullPtr:
5388 case clang::BuiltinType::OCLEvent:
5389 case clang::BuiltinType::OCLImage1d:
5390 case clang::BuiltinType::OCLImage1dArray:
5391 case clang::BuiltinType::OCLImage1dBuffer:
5392 case clang::BuiltinType::OCLImage2d:
5393 case clang::BuiltinType::OCLImage2dArray:
5394 case clang::BuiltinType::OCLImage3d:
5395 case clang::BuiltinType::OCLSampler:
5396 return 0;
5397 case clang::BuiltinType::Bool:
5398 case clang::BuiltinType::Char_U:
5399 case clang::BuiltinType::UChar:
5400 case clang::BuiltinType::WChar_U:
5401 case clang::BuiltinType::Char16:
5402 case clang::BuiltinType::Char32:
5403 case clang::BuiltinType::UShort:
5404 case clang::BuiltinType::UInt:
5405 case clang::BuiltinType::ULong:
5406 case clang::BuiltinType::ULongLong:
5407 case clang::BuiltinType::UInt128:
5408 case clang::BuiltinType::Char_S:
5409 case clang::BuiltinType::SChar:
5410 case clang::BuiltinType::WChar_S:
5411 case clang::BuiltinType::Short:
5412 case clang::BuiltinType::Int:
5413 case clang::BuiltinType::Long:
5414 case clang::BuiltinType::LongLong:
5415 case clang::BuiltinType::Int128:
5416 case clang::BuiltinType::Float:
5417 case clang::BuiltinType::Double:
5418 case clang::BuiltinType::LongDouble:
5419 case clang::BuiltinType::Dependent:
5420 case clang::BuiltinType::Overload:
5421 case clang::BuiltinType::ObjCId:
5422 case clang::BuiltinType::ObjCClass:
5423 case clang::BuiltinType::ObjCSel:
5424 case clang::BuiltinType::BoundMember:
5425 case clang::BuiltinType::Half:
5426 case clang::BuiltinType::ARCUnbridgedCast:
5427 case clang::BuiltinType::PseudoObject:
5428 case clang::BuiltinType::BuiltinFn:
5429 return 1;
5430 }
5431 break;
5432
5433 case clang::Type::Complex: return 1;
5434 case clang::Type::Pointer: return 1;
5435 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
5436 case clang::Type::LValueReference: return 1;
5437 case clang::Type::RValueReference: return 1;
5438 case clang::Type::MemberPointer: return 0;
5439 case clang::Type::ConstantArray: return 0;
5440 case clang::Type::IncompleteArray: return 0;
5441 case clang::Type::VariableArray: return 0;
5442 case clang::Type::DependentSizedArray: return 0;
5443 case clang::Type::DependentSizedExtVector: return 0;
5444 case clang::Type::Vector: return 0;
5445 case clang::Type::ExtVector: return 0;
5446 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
5447 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
5448 case clang::Type::UnresolvedUsing: return 0;
5449 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
5450 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
5451 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
5452 case clang::Type::TypeOfExpr: return 0;
5453 case clang::Type::TypeOf: return 0;
5454 case clang::Type::Decltype: return 0;
5455 case clang::Type::Record: return 0;
5456 case clang::Type::Enum: return 1;
5457 case clang::Type::TemplateTypeParm: return 1;
5458 case clang::Type::SubstTemplateTypeParm: return 1;
5459 case clang::Type::TemplateSpecialization: return 1;
5460 case clang::Type::InjectedClassName: return 0;
5461 case clang::Type::DependentName: return 1;
5462 case clang::Type::DependentTemplateSpecialization: return 1;
5463 case clang::Type::ObjCObject: return 0;
5464 case clang::Type::ObjCInterface: return 0;
5465 case clang::Type::ObjCObjectPointer: return 1;
5466 default:
5467 break;
5468 }
5469 return 0;
5470}
5471
5472
Greg Claytona1e5dc82015-08-11 22:53:00 +00005473CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00005474ClangASTContext::GetChildClangTypeAtIndex (void* type,
5475 ExecutionContext *exe_ctx,
5476 size_t idx,
5477 bool transparent_pointers,
5478 bool omit_empty_base_classes,
5479 bool ignore_array_bounds,
5480 std::string& child_name,
5481 uint32_t &child_byte_size,
5482 int32_t &child_byte_offset,
5483 uint32_t &child_bitfield_bit_size,
5484 uint32_t &child_bitfield_bit_offset,
5485 bool &child_is_base_class,
5486 bool &child_is_deref_of_parent,
5487 ValueObject *valobj)
Greg Claytond8d4a572015-08-11 21:38:15 +00005488{
5489 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005490 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005491
5492 clang::QualType parent_qual_type(GetCanonicalQualType(type));
5493 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
5494 child_bitfield_bit_size = 0;
5495 child_bitfield_bit_offset = 0;
5496 child_is_base_class = false;
5497
5498 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
5499 uint32_t bit_offset;
5500 switch (parent_type_class)
5501 {
5502 case clang::Type::Builtin:
5503 if (idx_is_valid)
5504 {
5505 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
5506 {
5507 case clang::BuiltinType::ObjCId:
5508 case clang::BuiltinType::ObjCClass:
5509 child_name = "isa";
5510 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005511 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00005512
5513 default:
5514 break;
5515 }
5516 }
5517 break;
5518
5519 case clang::Type::Record:
5520 if (idx_is_valid && GetCompleteType(type))
5521 {
5522 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
5523 const clang::RecordDecl *record_decl = record_type->getDecl();
5524 assert(record_decl);
5525 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5526 uint32_t child_idx = 0;
5527
5528 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5529 if (cxx_record_decl)
5530 {
5531 // We might have base classes to print out first
5532 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5533 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5534 base_class != base_class_end;
5535 ++base_class)
5536 {
5537 const clang::CXXRecordDecl *base_class_decl = nullptr;
5538
5539 // Skip empty base classes
5540 if (omit_empty_base_classes)
5541 {
5542 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5543 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5544 continue;
5545 }
5546
5547 if (idx == child_idx)
5548 {
5549 if (base_class_decl == nullptr)
5550 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5551
5552
5553 if (base_class->isVirtual())
5554 {
5555 bool handled = false;
5556 if (valobj)
5557 {
5558 Error err;
5559 AddressType addr_type = eAddressTypeInvalid;
5560 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
5561
5562 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
5563 {
5564
5565 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
5566 Process *process = exe_ctx.GetProcessPtr();
5567 if (process)
5568 {
5569 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
5570 if (vtable_ctx)
5571 {
5572 if (vtable_ctx->isMicrosoft())
5573 {
5574 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
5575
5576 if (vtable_ptr_addr)
5577 {
5578 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
5579
5580 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
5581 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
5582 {
5583 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
5584 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
5585 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
5586 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5587 if (base_offset != UINT32_MAX)
5588 {
5589 handled = true;
5590 bit_offset = base_offset * 8;
5591 }
5592 }
5593 }
5594 }
5595 else
5596 {
5597 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
5598 if (vtable_ptr_addr)
5599 {
5600 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
5601 if (vtable_ptr != LLDB_INVALID_ADDRESS)
5602 {
5603 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
5604 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
5605 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5606 if (base_offset != UINT32_MAX)
5607 {
5608 handled = true;
5609 bit_offset = base_offset * 8;
5610 }
5611 }
5612 }
5613 }
5614 }
5615 }
5616 }
5617
5618 }
5619 if (!handled)
5620 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5621 }
5622 else
5623 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5624
5625 // Base classes should be a multiple of 8 bits in size
5626 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005627 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005628 child_name = base_class_clang_type.GetTypeName().AsCString("");
5629 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5630
5631 // Base classes bit sizes should be a multiple of 8 bits in size
5632 assert (base_class_clang_type_bit_size % 8 == 0);
5633 child_byte_size = base_class_clang_type_bit_size / 8;
5634 child_is_base_class = true;
5635 return base_class_clang_type;
5636 }
5637 // We don't increment the child index in the for loop since we might
5638 // be skipping empty base classes
5639 ++child_idx;
5640 }
5641 }
5642 // Make sure index is in range...
5643 uint32_t field_idx = 0;
5644 clang::RecordDecl::field_iterator field, field_end;
5645 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
5646 {
5647 if (idx == child_idx)
5648 {
5649 // Print the member type if requested
5650 // Print the member name and equal sign
5651 child_name.assign(field->getNameAsString().c_str());
5652
5653 // Figure out the type byte size (field_type_info.first) and
5654 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00005655 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005656 assert(field_idx < record_layout.getFieldCount());
5657 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5658
5659 // Figure out the field offset within the current struct/union/class type
5660 bit_offset = record_layout.getFieldOffset (field_idx);
5661 child_byte_offset = bit_offset / 8;
5662 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
5663 child_bitfield_bit_offset = bit_offset % 8;
5664
5665 return field_clang_type;
5666 }
5667 }
5668 }
5669 break;
5670
5671 case clang::Type::ObjCObject:
5672 case clang::Type::ObjCInterface:
5673 if (idx_is_valid && GetCompleteType(type))
5674 {
5675 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
5676 assert (objc_class_type);
5677 if (objc_class_type)
5678 {
5679 uint32_t child_idx = 0;
5680 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5681
5682 if (class_interface_decl)
5683 {
5684
5685 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
5686 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5687 if (superclass_interface_decl)
5688 {
5689 if (omit_empty_base_classes)
5690 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005691 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00005692 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
5693 {
5694 if (idx == 0)
5695 {
5696 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5697
5698
5699 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
5700
5701 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5702
5703 child_byte_size = ivar_type_info.Width / 8;
5704 child_byte_offset = 0;
5705 child_is_base_class = true;
5706
Greg Claytona1e5dc82015-08-11 22:53:00 +00005707 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005708 }
5709
5710 ++child_idx;
5711 }
5712 }
5713 else
5714 ++child_idx;
5715 }
5716
5717 const uint32_t superclass_idx = child_idx;
5718
5719 if (idx < (child_idx + class_interface_decl->ivar_size()))
5720 {
5721 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5722
5723 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
5724 {
5725 if (child_idx == idx)
5726 {
5727 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5728
5729 clang::QualType ivar_qual_type(ivar_decl->getType());
5730
5731 child_name.assign(ivar_decl->getNameAsString().c_str());
5732
5733 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5734
5735 child_byte_size = ivar_type_info.Width / 8;
5736
5737 // Figure out the field offset within the current struct/union/class type
5738 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
5739 // that doesn't account for the space taken up by unbacked properties, or from
5740 // the changing size of base classes that are newer than this class.
5741 // So if we have a process around that we can ask about this object, do so.
5742 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
5743 Process *process = nullptr;
5744 if (exe_ctx)
5745 process = exe_ctx->GetProcessPtr();
5746 if (process)
5747 {
5748 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
5749 if (objc_runtime != nullptr)
5750 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005751 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005752 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
5753 }
5754 }
5755
5756 // Setting this to UINT32_MAX to make sure we don't compute it twice...
5757 bit_offset = UINT32_MAX;
5758
5759 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
5760 {
5761 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5762 child_byte_offset = bit_offset / 8;
5763 }
5764
5765 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
5766 // of a bitfield within its containing object. So regardless of where we get the byte
5767 // offset from, we still need to get the bit offset for bitfields from the layout.
5768
5769 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
5770 {
5771 if (bit_offset == UINT32_MAX)
5772 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5773
5774 child_bitfield_bit_offset = bit_offset % 8;
5775 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005776 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005777 }
5778 ++child_idx;
5779 }
5780 }
5781 }
5782 }
5783 }
5784 break;
5785
5786 case clang::Type::ObjCObjectPointer:
5787 if (idx_is_valid)
5788 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005789 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00005790
5791 if (transparent_pointers && pointee_clang_type.IsAggregateType())
5792 {
5793 child_is_deref_of_parent = false;
5794 bool tmp_child_is_deref_of_parent = false;
5795 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5796 idx,
5797 transparent_pointers,
5798 omit_empty_base_classes,
5799 ignore_array_bounds,
5800 child_name,
5801 child_byte_size,
5802 child_byte_offset,
5803 child_bitfield_bit_size,
5804 child_bitfield_bit_offset,
5805 child_is_base_class,
5806 tmp_child_is_deref_of_parent,
5807 valobj);
5808 }
5809 else
5810 {
5811 child_is_deref_of_parent = true;
5812 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5813 if (parent_name)
5814 {
5815 child_name.assign(1, '*');
5816 child_name += parent_name;
5817 }
5818
5819 // We have a pointer to an simple type
5820 if (idx == 0 && pointee_clang_type.GetCompleteType())
5821 {
5822 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5823 child_byte_offset = 0;
5824 return pointee_clang_type;
5825 }
5826 }
5827 }
5828 break;
5829
5830 case clang::Type::Vector:
5831 case clang::Type::ExtVector:
5832 if (idx_is_valid)
5833 {
5834 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
5835 if (array)
5836 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005837 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005838 if (element_type.GetCompleteType())
5839 {
5840 char element_name[64];
5841 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
5842 child_name.assign(element_name);
5843 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5844 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
5845 return element_type;
5846 }
5847 }
5848 }
5849 break;
5850
5851 case clang::Type::ConstantArray:
5852 case clang::Type::IncompleteArray:
5853 if (ignore_array_bounds || idx_is_valid)
5854 {
5855 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
5856 if (array)
5857 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005858 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005859 if (element_type.GetCompleteType())
5860 {
5861 char element_name[64];
5862 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
5863 child_name.assign(element_name);
5864 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5865 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
5866 return element_type;
5867 }
5868 }
5869 }
5870 break;
5871
5872
5873 case clang::Type::Pointer:
5874 if (idx_is_valid)
5875 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005876 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00005877
5878 // Don't dereference "void *" pointers
5879 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00005880 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005881
5882 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
5883 {
5884 child_is_deref_of_parent = false;
5885 bool tmp_child_is_deref_of_parent = false;
5886 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5887 idx,
5888 transparent_pointers,
5889 omit_empty_base_classes,
5890 ignore_array_bounds,
5891 child_name,
5892 child_byte_size,
5893 child_byte_offset,
5894 child_bitfield_bit_size,
5895 child_bitfield_bit_offset,
5896 child_is_base_class,
5897 tmp_child_is_deref_of_parent,
5898 valobj);
5899 }
5900 else
5901 {
5902 child_is_deref_of_parent = true;
5903
5904 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5905 if (parent_name)
5906 {
5907 child_name.assign(1, '*');
5908 child_name += parent_name;
5909 }
5910
5911 // We have a pointer to an simple type
5912 if (idx == 0)
5913 {
5914 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5915 child_byte_offset = 0;
5916 return pointee_clang_type;
5917 }
5918 }
5919 }
5920 break;
5921
5922 case clang::Type::LValueReference:
5923 case clang::Type::RValueReference:
5924 if (idx_is_valid)
5925 {
5926 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00005927 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005928 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
5929 {
5930 child_is_deref_of_parent = false;
5931 bool tmp_child_is_deref_of_parent = false;
5932 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5933 idx,
5934 transparent_pointers,
5935 omit_empty_base_classes,
5936 ignore_array_bounds,
5937 child_name,
5938 child_byte_size,
5939 child_byte_offset,
5940 child_bitfield_bit_size,
5941 child_bitfield_bit_offset,
5942 child_is_base_class,
5943 tmp_child_is_deref_of_parent,
5944 valobj);
5945 }
5946 else
5947 {
5948 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5949 if (parent_name)
5950 {
5951 child_name.assign(1, '&');
5952 child_name += parent_name;
5953 }
5954
5955 // We have a pointer to an simple type
5956 if (idx == 0)
5957 {
5958 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5959 child_byte_offset = 0;
5960 return pointee_clang_type;
5961 }
5962 }
5963 }
5964 break;
5965
5966 case clang::Type::Typedef:
5967 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005968 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005969 return typedefed_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5970 idx,
5971 transparent_pointers,
5972 omit_empty_base_classes,
5973 ignore_array_bounds,
5974 child_name,
5975 child_byte_size,
5976 child_byte_offset,
5977 child_bitfield_bit_size,
5978 child_bitfield_bit_offset,
5979 child_is_base_class,
5980 child_is_deref_of_parent,
5981 valobj);
5982 }
5983 break;
5984
5985 case clang::Type::Elaborated:
5986 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005987 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005988 return elaborated_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5989 idx,
5990 transparent_pointers,
5991 omit_empty_base_classes,
5992 ignore_array_bounds,
5993 child_name,
5994 child_byte_size,
5995 child_byte_offset,
5996 child_bitfield_bit_size,
5997 child_bitfield_bit_offset,
5998 child_is_base_class,
5999 child_is_deref_of_parent,
6000 valobj);
6001 }
6002
6003 case clang::Type::Paren:
6004 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006005 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00006006 return paren_clang_type.GetChildClangTypeAtIndex (exe_ctx,
6007 idx,
6008 transparent_pointers,
6009 omit_empty_base_classes,
6010 ignore_array_bounds,
6011 child_name,
6012 child_byte_size,
6013 child_byte_offset,
6014 child_bitfield_bit_size,
6015 child_bitfield_bit_offset,
6016 child_is_base_class,
6017 child_is_deref_of_parent,
6018 valobj);
6019 }
6020
6021
6022 default:
6023 break;
6024 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006025 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006026}
6027
6028static uint32_t
6029GetIndexForRecordBase
6030(
6031 const clang::RecordDecl *record_decl,
6032 const clang::CXXBaseSpecifier *base_spec,
6033 bool omit_empty_base_classes
6034 )
6035{
6036 uint32_t child_idx = 0;
6037
6038 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6039
6040 // const char *super_name = record_decl->getNameAsCString();
6041 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6042 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6043 //
6044 if (cxx_record_decl)
6045 {
6046 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6047 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6048 base_class != base_class_end;
6049 ++base_class)
6050 {
6051 if (omit_empty_base_classes)
6052 {
6053 if (BaseSpecifierIsEmpty (base_class))
6054 continue;
6055 }
6056
6057 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6058 // child_idx,
6059 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6060 //
6061 //
6062 if (base_class == base_spec)
6063 return child_idx;
6064 ++child_idx;
6065 }
6066 }
6067
6068 return UINT32_MAX;
6069}
6070
6071
6072static uint32_t
6073GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6074 clang::NamedDecl *canonical_decl,
6075 bool omit_empty_base_classes)
6076{
6077 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6078 omit_empty_base_classes);
6079
6080 clang::RecordDecl::field_iterator field, field_end;
6081 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6082 field != field_end;
6083 ++field, ++child_idx)
6084 {
6085 if (field->getCanonicalDecl() == canonical_decl)
6086 return child_idx;
6087 }
6088
6089 return UINT32_MAX;
6090}
6091
6092// Look for a child member (doesn't include base classes, but it does include
6093// their members) in the type hierarchy. Returns an index path into "clang_type"
6094// on how to reach the appropriate member.
6095//
6096// class A
6097// {
6098// public:
6099// int m_a;
6100// int m_b;
6101// };
6102//
6103// class B
6104// {
6105// };
6106//
6107// class C :
6108// public B,
6109// public A
6110// {
6111// };
6112//
6113// If we have a clang type that describes "class C", and we wanted to looked
6114// "m_b" in it:
6115//
6116// With omit_empty_base_classes == false we would get an integer array back with:
6117// { 1, 1 }
6118// The first index 1 is the child index for "class A" within class C
6119// The second index 1 is the child index for "m_b" within class A
6120//
6121// With omit_empty_base_classes == true we would get an integer array back with:
6122// { 0, 1 }
6123// 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)
6124// The second index 1 is the child index for "m_b" within class A
6125
6126size_t
6127ClangASTContext::GetIndexOfChildMemberWithName (void* type, const char *name,
6128 bool omit_empty_base_classes,
6129 std::vector<uint32_t>& child_indexes)
6130{
6131 if (type && name && name[0])
6132 {
6133 clang::QualType qual_type(GetCanonicalQualType(type));
6134 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6135 switch (type_class)
6136 {
6137 case clang::Type::Record:
6138 if (GetCompleteType(type))
6139 {
6140 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6141 const clang::RecordDecl *record_decl = record_type->getDecl();
6142
6143 assert(record_decl);
6144 uint32_t child_idx = 0;
6145
6146 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6147
6148 // Try and find a field that matches NAME
6149 clang::RecordDecl::field_iterator field, field_end;
6150 llvm::StringRef name_sref(name);
6151 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6152 field != field_end;
6153 ++field, ++child_idx)
6154 {
6155 llvm::StringRef field_name = field->getName();
6156 if (field_name.empty())
6157 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006158 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006159 child_indexes.push_back(child_idx);
6160 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
6161 return child_indexes.size();
6162 child_indexes.pop_back();
6163
6164 }
6165 else if (field_name.equals (name_sref))
6166 {
6167 // We have to add on the number of base classes to this index!
6168 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
6169 return child_indexes.size();
6170 }
6171 }
6172
6173 if (cxx_record_decl)
6174 {
6175 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6176
6177 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6178
6179 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6180 // Didn't find things easily, lets let clang do its thang...
6181 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
6182 clang::DeclarationName decl_name(&ident_ref);
6183
6184 clang::CXXBasePaths paths;
6185 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
6186 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
6187 },
6188 paths))
6189 {
6190 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
6191 for (path = paths.begin(); path != path_end; ++path)
6192 {
6193 const size_t num_path_elements = path->size();
6194 for (size_t e=0; e<num_path_elements; ++e)
6195 {
6196 clang::CXXBasePathElement elem = (*path)[e];
6197
6198 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
6199 if (child_idx == UINT32_MAX)
6200 {
6201 child_indexes.clear();
6202 return 0;
6203 }
6204 else
6205 {
6206 child_indexes.push_back (child_idx);
6207 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
6208 }
6209 }
6210 for (clang::NamedDecl *path_decl : path->Decls)
6211 {
6212 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
6213 if (child_idx == UINT32_MAX)
6214 {
6215 child_indexes.clear();
6216 return 0;
6217 }
6218 else
6219 {
6220 child_indexes.push_back (child_idx);
6221 }
6222 }
6223 }
6224 return child_indexes.size();
6225 }
6226 }
6227
6228 }
6229 break;
6230
6231 case clang::Type::ObjCObject:
6232 case clang::Type::ObjCInterface:
6233 if (GetCompleteType(type))
6234 {
6235 llvm::StringRef name_sref(name);
6236 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6237 assert (objc_class_type);
6238 if (objc_class_type)
6239 {
6240 uint32_t child_idx = 0;
6241 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6242
6243 if (class_interface_decl)
6244 {
6245 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6246 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6247
6248 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6249 {
6250 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6251
6252 if (ivar_decl->getName().equals (name_sref))
6253 {
6254 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6255 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6256 ++child_idx;
6257
6258 child_indexes.push_back (child_idx);
6259 return child_indexes.size();
6260 }
6261 }
6262
6263 if (superclass_interface_decl)
6264 {
6265 // The super class index is always zero for ObjC classes,
6266 // so we push it onto the child indexes in case we find
6267 // an ivar in our superclass...
6268 child_indexes.push_back (0);
6269
Greg Claytona1e5dc82015-08-11 22:53:00 +00006270 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006271 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
6272 omit_empty_base_classes,
6273 child_indexes))
6274 {
6275 // We did find an ivar in a superclass so just
6276 // return the results!
6277 return child_indexes.size();
6278 }
6279
6280 // We didn't find an ivar matching "name" in our
6281 // superclass, pop the superclass zero index that
6282 // we pushed on above.
6283 child_indexes.pop_back();
6284 }
6285 }
6286 }
6287 }
6288 break;
6289
6290 case clang::Type::ObjCObjectPointer:
6291 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006292 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006293 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
6294 omit_empty_base_classes,
6295 child_indexes);
6296 }
6297 break;
6298
6299
6300 case clang::Type::ConstantArray:
6301 {
6302 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6303 // const uint64_t element_count = array->getSize().getLimitedValue();
6304 //
6305 // if (idx < element_count)
6306 // {
6307 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6308 //
6309 // char element_name[32];
6310 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6311 //
6312 // child_name.assign(element_name);
6313 // assert(field_type_info.first % 8 == 0);
6314 // child_byte_size = field_type_info.first / 8;
6315 // child_byte_offset = idx * child_byte_size;
6316 // return array->getElementType().getAsOpaquePtr();
6317 // }
6318 }
6319 break;
6320
6321 // case clang::Type::MemberPointerType:
6322 // {
6323 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6324 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6325 //
6326 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6327 // {
6328 // return GetIndexOfChildWithName (ast,
6329 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6330 // name);
6331 // }
6332 // }
6333 // break;
6334 //
6335 case clang::Type::LValueReference:
6336 case clang::Type::RValueReference:
6337 {
6338 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6339 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006340 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006341
6342 if (pointee_clang_type.IsAggregateType ())
6343 {
6344 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6345 omit_empty_base_classes,
6346 child_indexes);
6347 }
6348 }
6349 break;
6350
6351 case clang::Type::Pointer:
6352 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006353 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006354
6355 if (pointee_clang_type.IsAggregateType ())
6356 {
6357 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6358 omit_empty_base_classes,
6359 child_indexes);
6360 }
6361 }
6362 break;
6363
6364 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006365 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006366 omit_empty_base_classes,
6367 child_indexes);
6368
6369 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006370 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006371 omit_empty_base_classes,
6372 child_indexes);
6373
6374 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006375 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006376 omit_empty_base_classes,
6377 child_indexes);
6378
6379 default:
6380 break;
6381 }
6382 }
6383 return 0;
6384}
6385
6386
6387// Get the index of the child of "clang_type" whose name matches. This function
6388// doesn't descend into the children, but only looks one level deep and name
6389// matches can include base class names.
6390
6391uint32_t
6392ClangASTContext::GetIndexOfChildWithName (void* type, const char *name, bool omit_empty_base_classes)
6393{
6394 if (type && name && name[0])
6395 {
6396 clang::QualType qual_type(GetCanonicalQualType(type));
6397
6398 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6399
6400 switch (type_class)
6401 {
6402 case clang::Type::Record:
6403 if (GetCompleteType(type))
6404 {
6405 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6406 const clang::RecordDecl *record_decl = record_type->getDecl();
6407
6408 assert(record_decl);
6409 uint32_t child_idx = 0;
6410
6411 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6412
6413 if (cxx_record_decl)
6414 {
6415 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6416 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6417 base_class != base_class_end;
6418 ++base_class)
6419 {
6420 // Skip empty base classes
6421 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6422 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
6423 continue;
6424
Greg Claytona1e5dc82015-08-11 22:53:00 +00006425 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006426 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
6427 if (base_class_type_name.compare (name) == 0)
6428 return child_idx;
6429 ++child_idx;
6430 }
6431 }
6432
6433 // Try and find a field that matches NAME
6434 clang::RecordDecl::field_iterator field, field_end;
6435 llvm::StringRef name_sref(name);
6436 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6437 field != field_end;
6438 ++field, ++child_idx)
6439 {
6440 if (field->getName().equals (name_sref))
6441 return child_idx;
6442 }
6443
6444 }
6445 break;
6446
6447 case clang::Type::ObjCObject:
6448 case clang::Type::ObjCInterface:
6449 if (GetCompleteType(type))
6450 {
6451 llvm::StringRef name_sref(name);
6452 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6453 assert (objc_class_type);
6454 if (objc_class_type)
6455 {
6456 uint32_t child_idx = 0;
6457 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6458
6459 if (class_interface_decl)
6460 {
6461 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6462 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6463
6464 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6465 {
6466 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6467
6468 if (ivar_decl->getName().equals (name_sref))
6469 {
6470 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6471 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6472 ++child_idx;
6473
6474 return child_idx;
6475 }
6476 }
6477
6478 if (superclass_interface_decl)
6479 {
6480 if (superclass_interface_decl->getName().equals (name_sref))
6481 return 0;
6482 }
6483 }
6484 }
6485 }
6486 break;
6487
6488 case clang::Type::ObjCObjectPointer:
6489 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006490 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006491 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6492 }
6493 break;
6494
6495 case clang::Type::ConstantArray:
6496 {
6497 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6498 // const uint64_t element_count = array->getSize().getLimitedValue();
6499 //
6500 // if (idx < element_count)
6501 // {
6502 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6503 //
6504 // char element_name[32];
6505 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6506 //
6507 // child_name.assign(element_name);
6508 // assert(field_type_info.first % 8 == 0);
6509 // child_byte_size = field_type_info.first / 8;
6510 // child_byte_offset = idx * child_byte_size;
6511 // return array->getElementType().getAsOpaquePtr();
6512 // }
6513 }
6514 break;
6515
6516 // case clang::Type::MemberPointerType:
6517 // {
6518 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6519 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6520 //
6521 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6522 // {
6523 // return GetIndexOfChildWithName (ast,
6524 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6525 // name);
6526 // }
6527 // }
6528 // break;
6529 //
6530 case clang::Type::LValueReference:
6531 case clang::Type::RValueReference:
6532 {
6533 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006534 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006535
6536 if (pointee_type.IsAggregateType ())
6537 {
6538 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6539 }
6540 }
6541 break;
6542
6543 case clang::Type::Pointer:
6544 {
6545 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006546 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006547
6548 if (pointee_type.IsAggregateType ())
6549 {
6550 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6551 }
6552 else
6553 {
6554 // if (parent_name)
6555 // {
6556 // child_name.assign(1, '*');
6557 // child_name += parent_name;
6558 // }
6559 //
6560 // // We have a pointer to an simple type
6561 // if (idx == 0)
6562 // {
6563 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
6564 // assert(clang_type_info.first % 8 == 0);
6565 // child_byte_size = clang_type_info.first / 8;
6566 // child_byte_offset = 0;
6567 // return pointee_type.getAsOpaquePtr();
6568 // }
6569 }
6570 }
6571 break;
6572
6573 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006574 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006575
6576 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006577 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006578
6579 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006580 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006581
6582 default:
6583 break;
6584 }
6585 }
6586 return UINT32_MAX;
6587}
6588
6589
6590size_t
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006591ClangASTContext::GetNumTemplateArguments (void* type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006592{
6593 if (!type)
6594 return 0;
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006595
6596 clang::QualType qual_type (GetCanonicalQualType(type));
6597 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6598 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00006599 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006600 case clang::Type::Record:
6601 if (GetCompleteType(type))
6602 {
6603 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6604 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00006605 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006606 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6607 if (template_decl)
6608 return template_decl->getTemplateArgs().size();
Greg Claytond8d4a572015-08-11 21:38:15 +00006609 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006610 }
6611 break;
6612
6613 case clang::Type::Typedef:
6614 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
6615
6616 case clang::Type::Elaborated:
6617 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
6618
6619 case clang::Type::Paren:
6620 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
6621
6622 default:
6623 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006624 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006625
Greg Claytond8d4a572015-08-11 21:38:15 +00006626 return 0;
6627}
6628
Greg Claytona1e5dc82015-08-11 22:53:00 +00006629CompilerType
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006630ClangASTContext::GetTemplateArgument (void* type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00006631{
6632 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00006633 return CompilerType();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006634
6635 clang::QualType qual_type (GetCanonicalQualType(type));
6636 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6637 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00006638 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006639 case clang::Type::Record:
6640 if (GetCompleteType(type))
6641 {
6642 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6643 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00006644 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006645 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6646 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
Greg Claytond8d4a572015-08-11 21:38:15 +00006647 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006648 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
6649 switch (template_arg.getKind())
Greg Claytond8d4a572015-08-11 21:38:15 +00006650 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006651 case clang::TemplateArgument::Null:
6652 kind = eTemplateArgumentKindNull;
6653 return CompilerType();
6654
6655 case clang::TemplateArgument::Type:
6656 kind = eTemplateArgumentKindType;
6657 return CompilerType(getASTContext(), template_arg.getAsType());
6658
6659 case clang::TemplateArgument::Declaration:
6660 kind = eTemplateArgumentKindDeclaration;
6661 return CompilerType();
6662
6663 case clang::TemplateArgument::Integral:
6664 kind = eTemplateArgumentKindIntegral;
6665 return CompilerType(getASTContext(), template_arg.getIntegralType());
6666
6667 case clang::TemplateArgument::Template:
6668 kind = eTemplateArgumentKindTemplate;
6669 return CompilerType();
6670
6671 case clang::TemplateArgument::TemplateExpansion:
6672 kind = eTemplateArgumentKindTemplateExpansion;
6673 return CompilerType();
6674
6675 case clang::TemplateArgument::Expression:
6676 kind = eTemplateArgumentKindExpression;
6677 return CompilerType();
6678
6679 case clang::TemplateArgument::Pack:
6680 kind = eTemplateArgumentKindPack;
6681 return CompilerType();
6682
6683 default:
6684 assert (!"Unhandled clang::TemplateArgument::ArgKind");
6685 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006686 }
6687 }
6688 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006689 }
6690 break;
6691
6692 case clang::Type::Typedef:
6693 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
6694
6695 case clang::Type::Elaborated:
6696 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
6697
6698 case clang::Type::Paren:
6699 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
6700
6701 default:
6702 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006703 }
6704 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006705 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00006706}
6707
6708static bool
6709IsOperator (const char *name, clang::OverloadedOperatorKind &op_kind)
6710{
6711 if (name == nullptr || name[0] == '\0')
6712 return false;
6713
6714#define OPERATOR_PREFIX "operator"
6715#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
6716
6717 const char *post_op_name = nullptr;
6718
6719 bool no_space = true;
6720
6721 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
6722 return false;
6723
6724 post_op_name = name + OPERATOR_PREFIX_LENGTH;
6725
6726 if (post_op_name[0] == ' ')
6727 {
6728 post_op_name++;
6729 no_space = false;
6730 }
6731
6732#undef OPERATOR_PREFIX
6733#undef OPERATOR_PREFIX_LENGTH
6734
6735 // This is an operator, set the overloaded operator kind to invalid
6736 // in case this is a conversion operator...
6737 op_kind = clang::NUM_OVERLOADED_OPERATORS;
6738
6739 switch (post_op_name[0])
6740 {
6741 default:
6742 if (no_space)
6743 return false;
6744 break;
6745 case 'n':
6746 if (no_space)
6747 return false;
6748 if (strcmp (post_op_name, "new") == 0)
6749 op_kind = clang::OO_New;
6750 else if (strcmp (post_op_name, "new[]") == 0)
6751 op_kind = clang::OO_Array_New;
6752 break;
6753
6754 case 'd':
6755 if (no_space)
6756 return false;
6757 if (strcmp (post_op_name, "delete") == 0)
6758 op_kind = clang::OO_Delete;
6759 else if (strcmp (post_op_name, "delete[]") == 0)
6760 op_kind = clang::OO_Array_Delete;
6761 break;
6762
6763 case '+':
6764 if (post_op_name[1] == '\0')
6765 op_kind = clang::OO_Plus;
6766 else if (post_op_name[2] == '\0')
6767 {
6768 if (post_op_name[1] == '=')
6769 op_kind = clang::OO_PlusEqual;
6770 else if (post_op_name[1] == '+')
6771 op_kind = clang::OO_PlusPlus;
6772 }
6773 break;
6774
6775 case '-':
6776 if (post_op_name[1] == '\0')
6777 op_kind = clang::OO_Minus;
6778 else if (post_op_name[2] == '\0')
6779 {
6780 switch (post_op_name[1])
6781 {
6782 case '=': op_kind = clang::OO_MinusEqual; break;
6783 case '-': op_kind = clang::OO_MinusMinus; break;
6784 case '>': op_kind = clang::OO_Arrow; break;
6785 }
6786 }
6787 else if (post_op_name[3] == '\0')
6788 {
6789 if (post_op_name[2] == '*')
6790 op_kind = clang::OO_ArrowStar; break;
6791 }
6792 break;
6793
6794 case '*':
6795 if (post_op_name[1] == '\0')
6796 op_kind = clang::OO_Star;
6797 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6798 op_kind = clang::OO_StarEqual;
6799 break;
6800
6801 case '/':
6802 if (post_op_name[1] == '\0')
6803 op_kind = clang::OO_Slash;
6804 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6805 op_kind = clang::OO_SlashEqual;
6806 break;
6807
6808 case '%':
6809 if (post_op_name[1] == '\0')
6810 op_kind = clang::OO_Percent;
6811 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6812 op_kind = clang::OO_PercentEqual;
6813 break;
6814
6815
6816 case '^':
6817 if (post_op_name[1] == '\0')
6818 op_kind = clang::OO_Caret;
6819 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6820 op_kind = clang::OO_CaretEqual;
6821 break;
6822
6823 case '&':
6824 if (post_op_name[1] == '\0')
6825 op_kind = clang::OO_Amp;
6826 else if (post_op_name[2] == '\0')
6827 {
6828 switch (post_op_name[1])
6829 {
6830 case '=': op_kind = clang::OO_AmpEqual; break;
6831 case '&': op_kind = clang::OO_AmpAmp; break;
6832 }
6833 }
6834 break;
6835
6836 case '|':
6837 if (post_op_name[1] == '\0')
6838 op_kind = clang::OO_Pipe;
6839 else if (post_op_name[2] == '\0')
6840 {
6841 switch (post_op_name[1])
6842 {
6843 case '=': op_kind = clang::OO_PipeEqual; break;
6844 case '|': op_kind = clang::OO_PipePipe; break;
6845 }
6846 }
6847 break;
6848
6849 case '~':
6850 if (post_op_name[1] == '\0')
6851 op_kind = clang::OO_Tilde;
6852 break;
6853
6854 case '!':
6855 if (post_op_name[1] == '\0')
6856 op_kind = clang::OO_Exclaim;
6857 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6858 op_kind = clang::OO_ExclaimEqual;
6859 break;
6860
6861 case '=':
6862 if (post_op_name[1] == '\0')
6863 op_kind = clang::OO_Equal;
6864 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6865 op_kind = clang::OO_EqualEqual;
6866 break;
6867
6868 case '<':
6869 if (post_op_name[1] == '\0')
6870 op_kind = clang::OO_Less;
6871 else if (post_op_name[2] == '\0')
6872 {
6873 switch (post_op_name[1])
6874 {
6875 case '<': op_kind = clang::OO_LessLess; break;
6876 case '=': op_kind = clang::OO_LessEqual; break;
6877 }
6878 }
6879 else if (post_op_name[3] == '\0')
6880 {
6881 if (post_op_name[2] == '=')
6882 op_kind = clang::OO_LessLessEqual;
6883 }
6884 break;
6885
6886 case '>':
6887 if (post_op_name[1] == '\0')
6888 op_kind = clang::OO_Greater;
6889 else if (post_op_name[2] == '\0')
6890 {
6891 switch (post_op_name[1])
6892 {
6893 case '>': op_kind = clang::OO_GreaterGreater; break;
6894 case '=': op_kind = clang::OO_GreaterEqual; break;
6895 }
6896 }
6897 else if (post_op_name[1] == '>' &&
6898 post_op_name[2] == '=' &&
6899 post_op_name[3] == '\0')
6900 {
6901 op_kind = clang::OO_GreaterGreaterEqual;
6902 }
6903 break;
6904
6905 case ',':
6906 if (post_op_name[1] == '\0')
6907 op_kind = clang::OO_Comma;
6908 break;
6909
6910 case '(':
6911 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
6912 op_kind = clang::OO_Call;
6913 break;
6914
6915 case '[':
6916 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
6917 op_kind = clang::OO_Subscript;
6918 break;
6919 }
6920
6921 return true;
6922}
6923
6924clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006925ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006926{
6927 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
6928 if (enutype)
6929 return enutype->getDecl();
6930 return NULL;
6931}
6932
6933clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006934ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006935{
6936 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(GetCanonicalQualType(type));
6937 if (record_type)
6938 return record_type->getDecl();
6939 return nullptr;
6940}
6941
6942clang::CXXRecordDecl *
6943ClangASTContext::GetAsCXXRecordDecl (void* type)
6944{
6945 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
6946}
6947
6948clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006949ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006950{
6951 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(GetCanonicalQualType(type));
6952 if (objc_class_type)
6953 return objc_class_type->getInterface();
6954 return nullptr;
6955}
6956
6957clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006958ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
6959 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00006960 AccessType access,
6961 uint32_t bitfield_bit_size)
6962{
6963 if (!type.IsValid() || !field_clang_type.IsValid())
6964 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00006965 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00006966 if (!ast)
6967 return nullptr;
6968 clang::ASTContext* clang_ast = ast->getASTContext();
6969
6970 clang::FieldDecl *field = nullptr;
6971
6972 clang::Expr *bit_width = nullptr;
6973 if (bitfield_bit_size != 0)
6974 {
6975 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
6976 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
6977 }
6978
6979 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
6980 if (record_decl)
6981 {
6982 field = clang::FieldDecl::Create (*clang_ast,
6983 record_decl,
6984 clang::SourceLocation(),
6985 clang::SourceLocation(),
6986 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
6987 GetQualType(field_clang_type), // Field type
6988 nullptr, // TInfo *
6989 bit_width, // BitWidth
6990 false, // Mutable
6991 clang::ICIS_NoInit); // HasInit
6992
6993 if (!name)
6994 {
6995 // Determine whether this field corresponds to an anonymous
6996 // struct or union.
6997 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
6998 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
6999 if (!Rec->getDeclName()) {
7000 Rec->setAnonymousStructOrUnion(true);
7001 field->setImplicit();
7002
7003 }
7004 }
7005 }
7006
7007 if (field)
7008 {
7009 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7010
7011 record_decl->addDecl(field);
7012
7013#ifdef LLDB_CONFIGURATION_DEBUG
7014 VerifyDecl(field);
7015#endif
7016 }
7017 }
7018 else
7019 {
7020 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7021
7022 if (class_interface_decl)
7023 {
7024 const bool is_synthesized = false;
7025
7026 field_clang_type.GetCompleteType();
7027
7028 field = clang::ObjCIvarDecl::Create (*clang_ast,
7029 class_interface_decl,
7030 clang::SourceLocation(),
7031 clang::SourceLocation(),
7032 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7033 GetQualType(field_clang_type), // Field type
7034 nullptr, // TypeSourceInfo *
7035 ConvertAccessTypeToObjCIvarAccessControl (access),
7036 bit_width,
7037 is_synthesized);
7038
7039 if (field)
7040 {
7041 class_interface_decl->addDecl(field);
7042
7043#ifdef LLDB_CONFIGURATION_DEBUG
7044 VerifyDecl(field);
7045#endif
7046 }
7047 }
7048 }
7049 return field;
7050}
7051
7052void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007053ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007054{
Greg Claytonf73034f2015-09-08 18:15:05 +00007055 if (!type)
7056 return;
7057
7058 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007059 if (!ast)
7060 return;
7061
7062 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7063
7064 if (!record_decl)
7065 return;
7066
7067 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7068
7069 IndirectFieldVector indirect_fields;
7070 clang::RecordDecl::field_iterator field_pos;
7071 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7072 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7073 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7074 {
7075 if (field_pos->isAnonymousStructOrUnion())
7076 {
7077 clang::QualType field_qual_type = field_pos->getType();
7078
7079 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7080
7081 if (!field_record_type)
7082 continue;
7083
7084 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7085
7086 if (!field_record_decl)
7087 continue;
7088
7089 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7090 di != de;
7091 ++di)
7092 {
7093 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7094 {
7095 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7096 chain[0] = *field_pos;
7097 chain[1] = nested_field_decl;
7098 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7099 record_decl,
7100 clang::SourceLocation(),
7101 nested_field_decl->getIdentifier(),
7102 nested_field_decl->getType(),
7103 chain,
7104 2);
7105
7106 indirect_field->setImplicit();
7107
7108 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7109 nested_field_decl->getAccess()));
7110
7111 indirect_fields.push_back(indirect_field);
7112 }
7113 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7114 {
7115 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
7116 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7117 chain[0] = *field_pos;
7118
7119 int chain_index = 1;
7120 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7121 nce = nested_indirect_field_decl->chain_end();
7122 nci < nce;
7123 ++nci)
7124 {
7125 chain[chain_index] = *nci;
7126 chain_index++;
7127 }
7128
7129 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7130 record_decl,
7131 clang::SourceLocation(),
7132 nested_indirect_field_decl->getIdentifier(),
7133 nested_indirect_field_decl->getType(),
7134 chain,
7135 nested_chain_size + 1);
7136
7137 indirect_field->setImplicit();
7138
7139 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7140 nested_indirect_field_decl->getAccess()));
7141
7142 indirect_fields.push_back(indirect_field);
7143 }
7144 }
7145 }
7146 }
7147
7148 // Check the last field to see if it has an incomplete array type as its
7149 // last member and if it does, the tell the record decl about it
7150 if (last_field_pos != field_end_pos)
7151 {
7152 if (last_field_pos->getType()->isIncompleteArrayType())
7153 record_decl->hasFlexibleArrayMember();
7154 }
7155
7156 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7157 ifi < ife;
7158 ++ifi)
7159 {
7160 record_decl->addDecl(*ifi);
7161 }
7162}
7163
7164void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007165ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007166{
Greg Claytonf73034f2015-09-08 18:15:05 +00007167 if (type)
7168 {
7169 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7170 if (ast)
7171 {
7172 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007173
Greg Claytonf73034f2015-09-08 18:15:05 +00007174 if (!record_decl)
7175 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00007176
Greg Claytonf73034f2015-09-08 18:15:05 +00007177 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*ast->getASTContext()));
7178 }
7179 }
Greg Claytond8d4a572015-08-11 21:38:15 +00007180}
7181
7182clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007183ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7184 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007185 AccessType access)
7186{
7187 clang::VarDecl *var_decl = nullptr;
7188
7189 if (!type.IsValid() || !var_type.IsValid())
7190 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007191 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007192 if (!ast)
7193 return nullptr;
7194
7195 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7196 if (record_decl)
7197 {
7198 var_decl = clang::VarDecl::Create (*ast->getASTContext(), // ASTContext &
7199 record_decl, // DeclContext *
7200 clang::SourceLocation(), // clang::SourceLocation StartLoc
7201 clang::SourceLocation(), // clang::SourceLocation IdLoc
7202 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7203 GetQualType(var_type), // Variable clang::QualType
7204 nullptr, // TypeSourceInfo *
7205 clang::SC_Static); // StorageClass
7206 if (var_decl)
7207 {
7208 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7209 record_decl->addDecl(var_decl);
7210
7211#ifdef LLDB_CONFIGURATION_DEBUG
7212 VerifyDecl(var_decl);
7213#endif
7214 }
7215 }
7216 return var_decl;
7217}
7218
7219
7220clang::CXXMethodDecl *
7221ClangASTContext::AddMethodToCXXRecordType (void* type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007222 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007223 lldb::AccessType access,
7224 bool is_virtual,
7225 bool is_static,
7226 bool is_inline,
7227 bool is_explicit,
7228 bool is_attr_used,
7229 bool is_artificial)
7230{
7231 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7232 return nullptr;
7233
7234 clang::QualType record_qual_type(GetCanonicalQualType(type));
7235
7236 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7237
7238 if (cxx_record_decl == nullptr)
7239 return nullptr;
7240
7241 clang::QualType method_qual_type (GetQualType(method_clang_type));
7242
7243 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7244
7245 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7246
7247 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7248
7249 if (function_type == nullptr)
7250 return nullptr;
7251
7252 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7253
7254 if (!method_function_prototype)
7255 return nullptr;
7256
7257 unsigned int num_params = method_function_prototype->getNumParams();
7258
7259 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7260 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7261
7262 if (is_artificial)
7263 return nullptr; // skip everything artificial
7264
7265 if (name[0] == '~')
7266 {
7267 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7268 cxx_record_decl,
7269 clang::SourceLocation(),
7270 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7271 method_qual_type,
7272 nullptr,
7273 is_inline,
7274 is_artificial);
7275 cxx_method_decl = cxx_dtor_decl;
7276 }
7277 else if (decl_name == cxx_record_decl->getDeclName())
7278 {
7279 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
7280 cxx_record_decl,
7281 clang::SourceLocation(),
7282 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7283 method_qual_type,
7284 nullptr, // TypeSourceInfo *
7285 is_explicit,
7286 is_inline,
7287 is_artificial,
7288 false /*is_constexpr*/);
7289 cxx_method_decl = cxx_ctor_decl;
7290 }
7291 else
7292 {
7293 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7294 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7295
7296 if (IsOperator (name, op_kind))
7297 {
7298 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
7299 {
7300 // Check the number of operator parameters. Sometimes we have
7301 // seen bad DWARF that doesn't correctly describe operators and
7302 // if we try to create a method and add it to the class, clang
7303 // will assert and crash, so we need to make sure things are
7304 // acceptable.
7305 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
7306 return nullptr;
7307 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7308 cxx_record_decl,
7309 clang::SourceLocation(),
7310 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
7311 method_qual_type,
7312 nullptr, // TypeSourceInfo *
7313 SC,
7314 is_inline,
7315 false /*is_constexpr*/,
7316 clang::SourceLocation());
7317 }
7318 else if (num_params == 0)
7319 {
7320 // Conversion operators don't take params...
7321 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
7322 cxx_record_decl,
7323 clang::SourceLocation(),
7324 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
7325 method_qual_type,
7326 nullptr, // TypeSourceInfo *
7327 is_inline,
7328 is_explicit,
7329 false /*is_constexpr*/,
7330 clang::SourceLocation());
7331 }
7332 }
7333
7334 if (cxx_method_decl == nullptr)
7335 {
7336 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7337 cxx_record_decl,
7338 clang::SourceLocation(),
7339 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
7340 method_qual_type,
7341 nullptr, // TypeSourceInfo *
7342 SC,
7343 is_inline,
7344 false /*is_constexpr*/,
7345 clang::SourceLocation());
7346 }
7347 }
7348
7349 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
7350
7351 cxx_method_decl->setAccess (access_specifier);
7352 cxx_method_decl->setVirtualAsWritten (is_virtual);
7353
7354 if (is_attr_used)
7355 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
7356
7357 // Populate the method decl with parameter decls
7358
7359 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7360
7361 for (unsigned param_index = 0;
7362 param_index < num_params;
7363 ++param_index)
7364 {
7365 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
7366 cxx_method_decl,
7367 clang::SourceLocation(),
7368 clang::SourceLocation(),
7369 nullptr, // anonymous
7370 method_function_prototype->getParamType(param_index),
7371 nullptr,
7372 clang::SC_None,
7373 nullptr));
7374 }
7375
7376 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
7377
7378 cxx_record_decl->addDecl (cxx_method_decl);
7379
7380 // Sometimes the debug info will mention a constructor (default/copy/move),
7381 // destructor, or assignment operator (copy/move) but there won't be any
7382 // version of this in the code. So we check if the function was artificially
7383 // generated and if it is trivial and this lets the compiler/backend know
7384 // that it can inline the IR for these when it needs to and we can avoid a
7385 // "missing function" error when running expressions.
7386
7387 if (is_artificial)
7388 {
7389 if (cxx_ctor_decl &&
7390 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
7391 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
7392 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
7393 {
7394 cxx_ctor_decl->setDefaulted();
7395 cxx_ctor_decl->setTrivial(true);
7396 }
7397 else if (cxx_dtor_decl)
7398 {
7399 if (cxx_record_decl->hasTrivialDestructor())
7400 {
7401 cxx_dtor_decl->setDefaulted();
7402 cxx_dtor_decl->setTrivial(true);
7403 }
7404 }
7405 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
7406 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
7407 {
7408 cxx_method_decl->setDefaulted();
7409 cxx_method_decl->setTrivial(true);
7410 }
7411 }
7412
7413#ifdef LLDB_CONFIGURATION_DEBUG
7414 VerifyDecl(cxx_method_decl);
7415#endif
7416
7417 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
7418 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
7419 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
7420 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
7421 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
7422 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
7423 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
7424 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
7425 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
7426 return cxx_method_decl;
7427}
7428
7429
7430#pragma mark C++ Base Classes
7431
7432clang::CXXBaseSpecifier *
7433ClangASTContext::CreateBaseClassSpecifier (void* type, AccessType access, bool is_virtual, bool base_of_class)
7434{
7435 if (type)
7436 return new clang::CXXBaseSpecifier (clang::SourceRange(),
7437 is_virtual,
7438 base_of_class,
7439 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
7440 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
7441 clang::SourceLocation());
7442 return nullptr;
7443}
7444
7445void
7446ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
7447{
7448 for (unsigned i=0; i<num_base_classes; ++i)
7449 {
7450 delete base_classes[i];
7451 base_classes[i] = nullptr;
7452 }
7453}
7454
7455bool
7456ClangASTContext::SetBaseClassesForClassType (void* type, clang::CXXBaseSpecifier const * const *base_classes,
7457 unsigned num_base_classes)
7458{
7459 if (type)
7460 {
7461 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
7462 if (cxx_record_decl)
7463 {
7464 cxx_record_decl->setBases(base_classes, num_base_classes);
7465 return true;
7466 }
7467 }
7468 return false;
7469}
7470
7471bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007472ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007473{
Greg Claytonf73034f2015-09-08 18:15:05 +00007474 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007475 if (!ast)
7476 return false;
7477 clang::ASTContext* clang_ast = ast->getASTContext();
7478
7479 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
7480 {
7481 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7482 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
7483 if (class_interface_decl && super_interface_decl)
7484 {
7485 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
7486 return true;
7487 }
7488 }
7489 return false;
7490}
7491
7492bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007493ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007494 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007495 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007496 clang::ObjCIvarDecl *ivar_decl,
7497 const char *property_setter_name,
7498 const char *property_getter_name,
7499 uint32_t property_attributes,
7500 ClangASTMetadata *metadata)
7501{
7502 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
7503 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00007504 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007505 if (!ast)
7506 return false;
7507 clang::ASTContext* clang_ast = ast->getASTContext();
7508
7509 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7510
7511 if (class_interface_decl)
7512 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007513 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00007514
7515 if (property_clang_type.IsValid())
7516 property_clang_type_to_access = property_clang_type;
7517 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007518 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007519
7520 if (class_interface_decl && property_clang_type_to_access.IsValid())
7521 {
7522 clang::TypeSourceInfo *prop_type_source;
7523 if (ivar_decl)
7524 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
7525 else
7526 prop_type_source = clang_ast->getTrivialTypeSourceInfo (GetQualType(property_clang_type));
7527
7528 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create (*clang_ast,
7529 class_interface_decl,
7530 clang::SourceLocation(), // Source Location
7531 &clang_ast->Idents.get(property_name),
7532 clang::SourceLocation(), //Source Location for AT
7533 clang::SourceLocation(), //Source location for (
7534 ivar_decl ? ivar_decl->getType() : ClangASTContext::GetQualType(property_clang_type),
7535 prop_type_source);
7536
7537 if (property_decl)
7538 {
7539 if (metadata)
7540 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
7541
7542 class_interface_decl->addDecl (property_decl);
7543
7544 clang::Selector setter_sel, getter_sel;
7545
7546 if (property_setter_name != nullptr)
7547 {
7548 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
7549 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
7550 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7551 }
7552 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
7553 {
7554 std::string setter_sel_string("set");
7555 setter_sel_string.push_back(::toupper(property_name[0]));
7556 setter_sel_string.append(&property_name[1]);
7557 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
7558 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7559 }
7560 property_decl->setSetterName(setter_sel);
7561 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
7562
7563 if (property_getter_name != nullptr)
7564 {
7565 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
7566 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7567 }
7568 else
7569 {
7570 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
7571 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7572 }
7573 property_decl->setGetterName(getter_sel);
7574 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
7575
7576 if (ivar_decl)
7577 property_decl->setPropertyIvarDecl (ivar_decl);
7578
7579 if (property_attributes & DW_APPLE_PROPERTY_readonly)
7580 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
7581 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
7582 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
7583 if (property_attributes & DW_APPLE_PROPERTY_assign)
7584 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
7585 if (property_attributes & DW_APPLE_PROPERTY_retain)
7586 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
7587 if (property_attributes & DW_APPLE_PROPERTY_copy)
7588 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
7589 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
7590 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
7591
7592 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
7593 {
7594 const bool isInstance = true;
7595 const bool isVariadic = false;
7596 const bool isSynthesized = false;
7597 const bool isImplicitlyDeclared = true;
7598 const bool isDefined = false;
7599 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7600 const bool HasRelatedResultType = false;
7601
7602 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create (*clang_ast,
7603 clang::SourceLocation(),
7604 clang::SourceLocation(),
7605 getter_sel,
7606 GetQualType(property_clang_type_to_access),
7607 nullptr,
7608 class_interface_decl,
7609 isInstance,
7610 isVariadic,
7611 isSynthesized,
7612 isImplicitlyDeclared,
7613 isDefined,
7614 impControl,
7615 HasRelatedResultType);
7616
7617 if (getter && metadata)
7618 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
7619
7620 if (getter)
7621 {
7622 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
7623
7624 class_interface_decl->addDecl(getter);
7625 }
7626 }
7627
7628 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
7629 {
7630 clang::QualType result_type = clang_ast->VoidTy;
7631
7632 const bool isInstance = true;
7633 const bool isVariadic = false;
7634 const bool isSynthesized = false;
7635 const bool isImplicitlyDeclared = true;
7636 const bool isDefined = false;
7637 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7638 const bool HasRelatedResultType = false;
7639
7640 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
7641 clang::SourceLocation(),
7642 clang::SourceLocation(),
7643 setter_sel,
7644 result_type,
7645 nullptr,
7646 class_interface_decl,
7647 isInstance,
7648 isVariadic,
7649 isSynthesized,
7650 isImplicitlyDeclared,
7651 isDefined,
7652 impControl,
7653 HasRelatedResultType);
7654
7655 if (setter && metadata)
7656 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
7657
7658 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
7659
7660 params.push_back (clang::ParmVarDecl::Create (*clang_ast,
7661 setter,
7662 clang::SourceLocation(),
7663 clang::SourceLocation(),
7664 nullptr, // anonymous
7665 GetQualType(property_clang_type_to_access),
7666 nullptr,
7667 clang::SC_Auto,
7668 nullptr));
7669
7670 if (setter)
7671 {
7672 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7673
7674 class_interface_decl->addDecl(setter);
7675 }
7676 }
7677
7678 return true;
7679 }
7680 }
7681 }
7682 return false;
7683}
7684
7685bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007686ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00007687{
7688 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7689 if (class_interface_decl)
7690 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
7691 return false;
7692}
7693
7694
7695clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007696ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007697 const char *name, // the full symbol name as seen in the symbol table (void* type, "-[NString stringWithCString:]")
Greg Claytona1e5dc82015-08-11 22:53:00 +00007698 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007699 lldb::AccessType access,
7700 bool is_artificial)
7701{
7702 if (!type || !method_clang_type.IsValid())
7703 return nullptr;
7704
7705 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
7706
7707 if (class_interface_decl == nullptr)
7708 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007709 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7710 if (lldb_ast == nullptr)
7711 return nullptr;
7712 clang::ASTContext *ast = lldb_ast->getASTContext();
7713
Greg Claytond8d4a572015-08-11 21:38:15 +00007714 const char *selector_start = ::strchr (name, ' ');
7715 if (selector_start == nullptr)
7716 return nullptr;
7717
7718 selector_start++;
7719 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
7720
7721 size_t len = 0;
7722 const char *start;
7723 //printf ("name = '%s'\n", name);
7724
7725 unsigned num_selectors_with_args = 0;
7726 for (start = selector_start;
7727 start && *start != '\0' && *start != ']';
7728 start += len)
7729 {
7730 len = ::strcspn(start, ":]");
7731 bool has_arg = (start[len] == ':');
7732 if (has_arg)
7733 ++num_selectors_with_args;
7734 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
7735 if (has_arg)
7736 len += 1;
7737 }
7738
7739
7740 if (selector_idents.size() == 0)
7741 return nullptr;
7742
7743 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
7744 selector_idents.data());
7745
7746 clang::QualType method_qual_type (GetQualType(method_clang_type));
7747
7748 // Populate the method decl with parameter decls
7749 const clang::Type *method_type(method_qual_type.getTypePtr());
7750
7751 if (method_type == nullptr)
7752 return nullptr;
7753
7754 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
7755
7756 if (!method_function_prototype)
7757 return nullptr;
7758
7759
7760 bool is_variadic = false;
7761 bool is_synthesized = false;
7762 bool is_defined = false;
7763 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
7764
7765 const unsigned num_args = method_function_prototype->getNumParams();
7766
7767 if (num_args != num_selectors_with_args)
7768 return nullptr; // some debug information is corrupt. We are not going to deal with it.
7769
7770 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create (*ast,
7771 clang::SourceLocation(), // beginLoc,
7772 clang::SourceLocation(), // endLoc,
7773 method_selector,
7774 method_function_prototype->getReturnType(),
7775 nullptr, // TypeSourceInfo *ResultTInfo,
7776 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(GetQualType(type)),
7777 name[0] == '-',
7778 is_variadic,
7779 is_synthesized,
7780 true, // is_implicitly_declared; we force this to true because we don't have source locations
7781 is_defined,
7782 imp_control,
7783 false /*has_related_result_type*/);
7784
7785
7786 if (objc_method_decl == nullptr)
7787 return nullptr;
7788
7789 if (num_args > 0)
7790 {
7791 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7792
7793 for (unsigned param_index = 0; param_index < num_args; ++param_index)
7794 {
7795 params.push_back (clang::ParmVarDecl::Create (*ast,
7796 objc_method_decl,
7797 clang::SourceLocation(),
7798 clang::SourceLocation(),
7799 nullptr, // anonymous
7800 method_function_prototype->getParamType(param_index),
7801 nullptr,
7802 clang::SC_Auto,
7803 nullptr));
7804 }
7805
7806 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7807 }
7808
7809 class_interface_decl->addDecl (objc_method_decl);
7810
7811#ifdef LLDB_CONFIGURATION_DEBUG
7812 VerifyDecl(objc_method_decl);
7813#endif
7814
7815 return objc_method_decl;
7816}
7817
7818bool
7819ClangASTContext::SetHasExternalStorage (void* type, bool has_extern)
7820{
7821 if (!type)
7822 return false;
7823
7824 clang::QualType qual_type (GetCanonicalQualType(type));
7825
7826 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7827 switch (type_class)
7828 {
7829 case clang::Type::Record:
7830 {
7831 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7832 if (cxx_record_decl)
7833 {
7834 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
7835 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
7836 return true;
7837 }
7838 }
7839 break;
7840
7841 case clang::Type::Enum:
7842 {
7843 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
7844 if (enum_decl)
7845 {
7846 enum_decl->setHasExternalLexicalStorage (has_extern);
7847 enum_decl->setHasExternalVisibleStorage (has_extern);
7848 return true;
7849 }
7850 }
7851 break;
7852
7853 case clang::Type::ObjCObject:
7854 case clang::Type::ObjCInterface:
7855 {
7856 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
7857 assert (objc_class_type);
7858 if (objc_class_type)
7859 {
7860 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
7861
7862 if (class_interface_decl)
7863 {
7864 class_interface_decl->setHasExternalLexicalStorage (has_extern);
7865 class_interface_decl->setHasExternalVisibleStorage (has_extern);
7866 return true;
7867 }
7868 }
7869 }
7870 break;
7871
7872 case clang::Type::Typedef:
7873 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
7874
7875 case clang::Type::Elaborated:
7876 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
7877
7878 case clang::Type::Paren:
7879 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
7880
7881 default:
7882 break;
7883 }
7884 return false;
7885}
7886
7887
7888#pragma mark TagDecl
7889
7890bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007891ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007892{
7893 if (type)
7894 {
7895
7896 clang::QualType qual_type (GetQualType(type));
7897 const clang::Type *t = qual_type.getTypePtr();
7898 if (t)
7899 {
7900 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(t);
7901 if (tag_type)
7902 {
7903 clang::TagDecl *tag_decl = tag_type->getDecl();
7904 if (tag_decl)
7905 {
7906 tag_decl->startDefinition();
7907 return true;
7908 }
7909 }
7910
7911 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(t);
7912 if (object_type)
7913 {
7914 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
7915 if (interface_decl)
7916 {
7917 interface_decl->startDefinition();
7918 return true;
7919 }
7920 }
7921 }
7922 }
7923 return false;
7924}
7925
7926bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007927ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007928{
7929 if (type)
7930 {
7931 clang::QualType qual_type (GetQualType(type));
7932 if (qual_type.isNull())
7933 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00007934 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7935 if (lldb_ast == nullptr)
7936 return false;
7937 clang::ASTContext *ast = lldb_ast->getASTContext();
7938
Greg Claytond8d4a572015-08-11 21:38:15 +00007939 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7940
7941 if (cxx_record_decl)
7942 {
7943 cxx_record_decl->completeDefinition();
7944
7945 return true;
7946 }
7947
7948 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(qual_type.getTypePtr());
7949
7950 if (enutype)
7951 {
7952 clang::EnumDecl *enum_decl = enutype->getDecl();
7953
7954 if (enum_decl)
7955 {
7956 /// TODO This really needs to be fixed.
7957
7958 unsigned NumPositiveBits = 1;
7959 unsigned NumNegativeBits = 0;
7960
7961 clang::QualType promotion_qual_type;
7962 // If the enum integer type is less than an integer in bit width,
7963 // then we must promote it to an integer size.
7964 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
7965 {
7966 if (enum_decl->getIntegerType()->isSignedIntegerType())
7967 promotion_qual_type = ast->IntTy;
7968 else
7969 promotion_qual_type = ast->UnsignedIntTy;
7970 }
7971 else
7972 promotion_qual_type = enum_decl->getIntegerType();
7973
7974 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
7975 return true;
7976 }
7977 }
7978 }
7979 return false;
7980}
7981
Greg Claytond8d4a572015-08-11 21:38:15 +00007982bool
Greg Clayton8b4edba2015-08-14 20:02:05 +00007983ClangASTContext::AddEnumerationValueToEnumerationType (void* type,
7984 const CompilerType &enumerator_clang_type,
7985 const Declaration &decl,
7986 const char *name,
7987 int64_t enum_value,
7988 uint32_t enum_value_bit_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00007989{
7990 if (type && enumerator_clang_type.IsValid() && name && name[0])
7991 {
7992 clang::QualType enum_qual_type (GetCanonicalQualType(type));
7993
7994 bool is_signed = false;
7995 enumerator_clang_type.IsIntegerType (is_signed);
7996 const clang::Type *clang_type = enum_qual_type.getTypePtr();
7997 if (clang_type)
7998 {
7999 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8000
8001 if (enutype)
8002 {
8003 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
8004 enum_llvm_apsint = enum_value;
8005 clang::EnumConstantDecl *enumerator_decl =
8006 clang::EnumConstantDecl::Create (*getASTContext(),
8007 enutype->getDecl(),
8008 clang::SourceLocation(),
8009 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
8010 GetQualType(enumerator_clang_type),
8011 nullptr,
8012 enum_llvm_apsint);
8013
8014 if (enumerator_decl)
8015 {
8016 enutype->getDecl()->addDecl(enumerator_decl);
8017
8018#ifdef LLDB_CONFIGURATION_DEBUG
8019 VerifyDecl(enumerator_decl);
8020#endif
8021
8022 return true;
8023 }
8024 }
8025 }
8026 }
8027 return false;
8028}
8029
Greg Claytona1e5dc82015-08-11 22:53:00 +00008030CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00008031ClangASTContext::GetEnumerationIntegerType (void* type)
8032{
8033 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8034 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8035 if (clang_type)
8036 {
8037 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8038 if (enutype)
8039 {
8040 clang::EnumDecl *enum_decl = enutype->getDecl();
8041 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008042 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008043 }
8044 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008045 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008046}
8047
Greg Claytona1e5dc82015-08-11 22:53:00 +00008048CompilerType
8049ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008050{
8051 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8052 {
Greg Claytonf73034f2015-09-08 18:15:05 +00008053 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008054 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008055 return CompilerType();
8056 return CompilerType (ast->getASTContext(),
Greg Claytond8d4a572015-08-11 21:38:15 +00008057 ast->getASTContext()->getMemberPointerType (GetQualType(pointee_type),
8058 GetQualType(type).getTypePtr()));
8059 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008060 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008061}
8062
8063
8064size_t
8065ClangASTContext::ConvertStringToFloatValue (void* type, const char *s, uint8_t *dst, size_t dst_size)
8066{
8067 if (type)
8068 {
8069 clang::QualType qual_type (GetCanonicalQualType(type));
8070 uint32_t count = 0;
8071 bool is_complex = false;
8072 if (IsFloatingPointType (type, count, is_complex))
8073 {
8074 // TODO: handle complex and vector types
8075 if (count != 1)
8076 return false;
8077
8078 llvm::StringRef s_sref(s);
8079 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8080
8081 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8082 const uint64_t byte_size = bit_size / 8;
8083 if (dst_size >= byte_size)
8084 {
8085 if (bit_size == sizeof(float)*8)
8086 {
8087 float float32 = ap_float.convertToFloat();
8088 ::memcpy (dst, &float32, byte_size);
8089 return byte_size;
8090 }
8091 else if (bit_size >= 64)
8092 {
8093 llvm::APInt ap_int(ap_float.bitcastToAPInt());
8094 ::memcpy (dst, ap_int.getRawData(), byte_size);
8095 return byte_size;
8096 }
8097 }
8098 }
8099 }
8100 return 0;
8101}
8102
8103
8104
8105//----------------------------------------------------------------------
8106// Dumping types
8107//----------------------------------------------------------------------
8108#define DEPTH_INCREMENT 2
8109
8110void
8111ClangASTContext::DumpValue (void* type, ExecutionContext *exe_ctx,
8112 Stream *s,
8113 lldb::Format format,
8114 const lldb_private::DataExtractor &data,
8115 lldb::offset_t data_byte_offset,
8116 size_t data_byte_size,
8117 uint32_t bitfield_bit_size,
8118 uint32_t bitfield_bit_offset,
8119 bool show_types,
8120 bool show_summary,
8121 bool verbose,
8122 uint32_t depth)
8123{
8124 if (!type)
8125 return;
8126
8127 clang::QualType qual_type(GetQualType(type));
8128 switch (qual_type->getTypeClass())
8129 {
8130 case clang::Type::Record:
8131 if (GetCompleteType(type))
8132 {
8133 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8134 const clang::RecordDecl *record_decl = record_type->getDecl();
8135 assert(record_decl);
8136 uint32_t field_bit_offset = 0;
8137 uint32_t field_byte_offset = 0;
8138 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8139 uint32_t child_idx = 0;
8140
8141 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8142 if (cxx_record_decl)
8143 {
8144 // We might have base classes to print out first
8145 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8146 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8147 base_class != base_class_end;
8148 ++base_class)
8149 {
8150 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8151
8152 // Skip empty base classes
8153 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8154 continue;
8155
8156 if (base_class->isVirtual())
8157 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8158 else
8159 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8160 field_byte_offset = field_bit_offset / 8;
8161 assert (field_bit_offset % 8 == 0);
8162 if (child_idx == 0)
8163 s->PutChar('{');
8164 else
8165 s->PutChar(',');
8166
8167 clang::QualType base_class_qual_type = base_class->getType();
8168 std::string base_class_type_name(base_class_qual_type.getAsString());
8169
8170 // Indent and print the base class type name
8171 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8172
8173 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8174
8175 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008176 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008177 base_clang_type.DumpValue (exe_ctx,
8178 s, // Stream to dump to
8179 base_clang_type.GetFormat(), // The format with which to display the member
8180 data, // Data buffer containing all bytes for this type
8181 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8182 base_class_type_info.Width / 8, // Size of this type in bytes
8183 0, // Bitfield bit size
8184 0, // Bitfield bit offset
8185 show_types, // Boolean indicating if we should show the variable types
8186 show_summary, // Boolean indicating if we should show a summary for the current type
8187 verbose, // Verbose output?
8188 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8189
8190 ++child_idx;
8191 }
8192 }
8193 uint32_t field_idx = 0;
8194 clang::RecordDecl::field_iterator field, field_end;
8195 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8196 {
8197 // Print the starting squiggly bracket (if this is the
8198 // first member) or comma (for member 2 and beyond) for
8199 // the struct/union/class member.
8200 if (child_idx == 0)
8201 s->PutChar('{');
8202 else
8203 s->PutChar(',');
8204
8205 // Indent
8206 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8207
8208 clang::QualType field_type = field->getType();
8209 // Print the member type if requested
8210 // Figure out the type byte size (field_type_info.first) and
8211 // alignment (field_type_info.second) from the AST context.
8212 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8213 assert(field_idx < record_layout.getFieldCount());
8214 // Figure out the field offset within the current struct/union/class type
8215 field_bit_offset = record_layout.getFieldOffset (field_idx);
8216 field_byte_offset = field_bit_offset / 8;
8217 uint32_t field_bitfield_bit_size = 0;
8218 uint32_t field_bitfield_bit_offset = 0;
8219 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8220 field_bitfield_bit_offset = field_bit_offset % 8;
8221
8222 if (show_types)
8223 {
8224 std::string field_type_name(field_type.getAsString());
8225 if (field_bitfield_bit_size > 0)
8226 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
8227 else
8228 s->Printf("(%s) ", field_type_name.c_str());
8229 }
8230 // Print the member name and equal sign
8231 s->Printf("%s = ", field->getNameAsString().c_str());
8232
8233
8234 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008235 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008236 field_clang_type.DumpValue (exe_ctx,
8237 s, // Stream to dump to
8238 field_clang_type.GetFormat(), // The format with which to display the member
8239 data, // Data buffer containing all bytes for this type
8240 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8241 field_type_info.Width / 8, // Size of this type in bytes
8242 field_bitfield_bit_size, // Bitfield bit size
8243 field_bitfield_bit_offset, // Bitfield bit offset
8244 show_types, // Boolean indicating if we should show the variable types
8245 show_summary, // Boolean indicating if we should show a summary for the current type
8246 verbose, // Verbose output?
8247 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8248 }
8249
8250 // Indent the trailing squiggly bracket
8251 if (child_idx > 0)
8252 s->Printf("\n%*s}", depth, "");
8253 }
8254 return;
8255
8256 case clang::Type::Enum:
8257 if (GetCompleteType(type))
8258 {
8259 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8260 const clang::EnumDecl *enum_decl = enutype->getDecl();
8261 assert(enum_decl);
8262 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8263 lldb::offset_t offset = data_byte_offset;
8264 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
8265 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8266 {
8267 if (enum_pos->getInitVal() == enum_value)
8268 {
8269 s->Printf("%s", enum_pos->getNameAsString().c_str());
8270 return;
8271 }
8272 }
8273 // If we have gotten here we didn't get find the enumerator in the
8274 // enum decl, so just print the integer.
8275 s->Printf("%" PRIi64, enum_value);
8276 }
8277 return;
8278
8279 case clang::Type::ConstantArray:
8280 {
8281 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
8282 bool is_array_of_characters = false;
8283 clang::QualType element_qual_type = array->getElementType();
8284
8285 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
8286 if (canonical_type)
8287 is_array_of_characters = canonical_type->isCharType();
8288
8289 const uint64_t element_count = array->getSize().getLimitedValue();
8290
8291 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
8292
8293 uint32_t element_idx = 0;
8294 uint32_t element_offset = 0;
8295 uint64_t element_byte_size = field_type_info.Width / 8;
8296 uint32_t element_stride = element_byte_size;
8297
8298 if (is_array_of_characters)
8299 {
8300 s->PutChar('"');
8301 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8302 s->PutChar('"');
8303 return;
8304 }
8305 else
8306 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008307 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008308 lldb::Format element_format = element_clang_type.GetFormat();
8309
8310 for (element_idx = 0; element_idx < element_count; ++element_idx)
8311 {
8312 // Print the starting squiggly bracket (if this is the
8313 // first member) or comman (for member 2 and beyong) for
8314 // the struct/union/class member.
8315 if (element_idx == 0)
8316 s->PutChar('{');
8317 else
8318 s->PutChar(',');
8319
8320 // Indent and print the index
8321 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
8322
8323 // Figure out the field offset within the current struct/union/class type
8324 element_offset = element_idx * element_stride;
8325
8326 // Dump the value of the member
8327 element_clang_type.DumpValue (exe_ctx,
8328 s, // Stream to dump to
8329 element_format, // The format with which to display the element
8330 data, // Data buffer containing all bytes for this type
8331 data_byte_offset + element_offset,// Offset into "data" where to grab value from
8332 element_byte_size, // Size of this type in bytes
8333 0, // Bitfield bit size
8334 0, // Bitfield bit offset
8335 show_types, // Boolean indicating if we should show the variable types
8336 show_summary, // Boolean indicating if we should show a summary for the current type
8337 verbose, // Verbose output?
8338 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8339 }
8340
8341 // Indent the trailing squiggly bracket
8342 if (element_idx > 0)
8343 s->Printf("\n%*s}", depth, "");
8344 }
8345 }
8346 return;
8347
8348 case clang::Type::Typedef:
8349 {
8350 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
8351
Greg Claytona1e5dc82015-08-11 22:53:00 +00008352 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008353 lldb::Format typedef_format = typedef_clang_type.GetFormat();
8354 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8355 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8356
8357 return typedef_clang_type.DumpValue (exe_ctx,
8358 s, // Stream to dump to
8359 typedef_format, // The format with which to display the element
8360 data, // Data buffer containing all bytes for this type
8361 data_byte_offset, // Offset into "data" where to grab value from
8362 typedef_byte_size, // Size of this type in bytes
8363 bitfield_bit_size, // Bitfield bit size
8364 bitfield_bit_offset,// Bitfield bit offset
8365 show_types, // Boolean indicating if we should show the variable types
8366 show_summary, // Boolean indicating if we should show a summary for the current type
8367 verbose, // Verbose output?
8368 depth); // Scope depth for any types that have children
8369 }
8370 break;
8371
8372 case clang::Type::Elaborated:
8373 {
8374 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008375 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008376 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
8377 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
8378 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
8379
8380 return elaborated_clang_type.DumpValue (exe_ctx,
8381 s, // Stream to dump to
8382 elaborated_format, // The format with which to display the element
8383 data, // Data buffer containing all bytes for this type
8384 data_byte_offset, // Offset into "data" where to grab value from
8385 elaborated_byte_size, // Size of this type in bytes
8386 bitfield_bit_size, // Bitfield bit size
8387 bitfield_bit_offset,// Bitfield bit offset
8388 show_types, // Boolean indicating if we should show the variable types
8389 show_summary, // Boolean indicating if we should show a summary for the current type
8390 verbose, // Verbose output?
8391 depth); // Scope depth for any types that have children
8392 }
8393 break;
8394
8395 case clang::Type::Paren:
8396 {
8397 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008398 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008399
8400 lldb::Format desugar_format = desugar_clang_type.GetFormat();
8401 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
8402 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
8403
8404 return desugar_clang_type.DumpValue (exe_ctx,
8405 s, // Stream to dump to
8406 desugar_format, // The format with which to display the element
8407 data, // Data buffer containing all bytes for this type
8408 data_byte_offset, // Offset into "data" where to grab value from
8409 desugar_byte_size, // Size of this type in bytes
8410 bitfield_bit_size, // Bitfield bit size
8411 bitfield_bit_offset,// Bitfield bit offset
8412 show_types, // Boolean indicating if we should show the variable types
8413 show_summary, // Boolean indicating if we should show a summary for the current type
8414 verbose, // Verbose output?
8415 depth); // Scope depth for any types that have children
8416 }
8417 break;
8418
8419 default:
8420 // We are down to a scalar type that we just need to display.
8421 data.Dump(s,
8422 data_byte_offset,
8423 format,
8424 data_byte_size,
8425 1,
8426 UINT32_MAX,
8427 LLDB_INVALID_ADDRESS,
8428 bitfield_bit_size,
8429 bitfield_bit_offset);
8430
8431 if (show_summary)
8432 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
8433 break;
8434 }
8435}
8436
8437
8438
8439
8440bool
8441ClangASTContext::DumpTypeValue (void* type, Stream *s,
8442 lldb::Format format,
8443 const lldb_private::DataExtractor &data,
8444 lldb::offset_t byte_offset,
8445 size_t byte_size,
8446 uint32_t bitfield_bit_size,
8447 uint32_t bitfield_bit_offset,
8448 ExecutionContextScope *exe_scope)
8449{
8450 if (!type)
8451 return false;
8452 if (IsAggregateType(type))
8453 {
8454 return false;
8455 }
8456 else
8457 {
8458 clang::QualType qual_type(GetQualType(type));
8459
8460 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8461 switch (type_class)
8462 {
8463 case clang::Type::Typedef:
8464 {
8465 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008466 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008467 if (format == eFormatDefault)
8468 format = typedef_clang_type.GetFormat();
8469 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8470 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8471
8472 return typedef_clang_type.DumpTypeValue (s,
8473 format, // The format with which to display the element
8474 data, // Data buffer containing all bytes for this type
8475 byte_offset, // Offset into "data" where to grab value from
8476 typedef_byte_size, // Size of this type in bytes
8477 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
8478 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
8479 exe_scope);
8480 }
8481 break;
8482
8483 case clang::Type::Enum:
8484 // If our format is enum or default, show the enumeration value as
8485 // its enumeration string value, else just display it as requested.
8486 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
8487 {
8488 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8489 const clang::EnumDecl *enum_decl = enutype->getDecl();
8490 assert(enum_decl);
8491 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8492 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
8493 lldb::offset_t offset = byte_offset;
8494 if (is_signed)
8495 {
8496 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8497 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8498 {
8499 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
8500 {
8501 s->PutCString (enum_pos->getNameAsString().c_str());
8502 return true;
8503 }
8504 }
8505 // If we have gotten here we didn't get find the enumerator in the
8506 // enum decl, so just print the integer.
8507 s->Printf("%" PRIi64, enum_svalue);
8508 }
8509 else
8510 {
8511 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8512 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8513 {
8514 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
8515 {
8516 s->PutCString (enum_pos->getNameAsString().c_str());
8517 return true;
8518 }
8519 }
8520 // If we have gotten here we didn't get find the enumerator in the
8521 // enum decl, so just print the integer.
8522 s->Printf("%" PRIu64, enum_uvalue);
8523 }
8524 return true;
8525 }
8526 // format was not enum, just fall through and dump the value as requested....
8527
8528 default:
8529 // We are down to a scalar type that we just need to display.
8530 {
8531 uint32_t item_count = 1;
8532 // A few formats, we might need to modify our size and count for depending
8533 // on how we are trying to display the value...
8534 switch (format)
8535 {
8536 default:
8537 case eFormatBoolean:
8538 case eFormatBinary:
8539 case eFormatComplex:
8540 case eFormatCString: // NULL terminated C strings
8541 case eFormatDecimal:
8542 case eFormatEnum:
8543 case eFormatHex:
8544 case eFormatHexUppercase:
8545 case eFormatFloat:
8546 case eFormatOctal:
8547 case eFormatOSType:
8548 case eFormatUnsigned:
8549 case eFormatPointer:
8550 case eFormatVectorOfChar:
8551 case eFormatVectorOfSInt8:
8552 case eFormatVectorOfUInt8:
8553 case eFormatVectorOfSInt16:
8554 case eFormatVectorOfUInt16:
8555 case eFormatVectorOfSInt32:
8556 case eFormatVectorOfUInt32:
8557 case eFormatVectorOfSInt64:
8558 case eFormatVectorOfUInt64:
8559 case eFormatVectorOfFloat32:
8560 case eFormatVectorOfFloat64:
8561 case eFormatVectorOfUInt128:
8562 break;
8563
8564 case eFormatChar:
8565 case eFormatCharPrintable:
8566 case eFormatCharArray:
8567 case eFormatBytes:
8568 case eFormatBytesWithASCII:
8569 item_count = byte_size;
8570 byte_size = 1;
8571 break;
8572
8573 case eFormatUnicode16:
8574 item_count = byte_size / 2;
8575 byte_size = 2;
8576 break;
8577
8578 case eFormatUnicode32:
8579 item_count = byte_size / 4;
8580 byte_size = 4;
8581 break;
8582 }
8583 return data.Dump (s,
8584 byte_offset,
8585 format,
8586 byte_size,
8587 item_count,
8588 UINT32_MAX,
8589 LLDB_INVALID_ADDRESS,
8590 bitfield_bit_size,
8591 bitfield_bit_offset,
8592 exe_scope);
8593 }
8594 break;
8595 }
8596 }
8597 return 0;
8598}
8599
8600
8601
8602void
8603ClangASTContext::DumpSummary (void* type, ExecutionContext *exe_ctx,
8604 Stream *s,
8605 const lldb_private::DataExtractor &data,
8606 lldb::offset_t data_byte_offset,
8607 size_t data_byte_size)
8608{
8609 uint32_t length = 0;
8610 if (IsCStringType (type, length))
8611 {
8612 if (exe_ctx)
8613 {
8614 Process *process = exe_ctx->GetProcessPtr();
8615 if (process)
8616 {
8617 lldb::offset_t offset = data_byte_offset;
8618 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
8619 std::vector<uint8_t> buf;
8620 if (length > 0)
8621 buf.resize (length);
8622 else
8623 buf.resize (256);
8624
8625 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
8626 buf.back() = '\0';
8627 size_t bytes_read;
8628 size_t total_cstr_len = 0;
8629 Error error;
8630 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
8631 {
8632 const size_t len = strlen((const char *)&buf.front());
8633 if (len == 0)
8634 break;
8635 if (total_cstr_len == 0)
8636 s->PutCString (" \"");
8637 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8638 total_cstr_len += len;
8639 if (len < buf.size())
8640 break;
8641 pointer_address += total_cstr_len;
8642 }
8643 if (total_cstr_len > 0)
8644 s->PutChar ('"');
8645 }
8646 }
8647 }
8648}
8649
8650void
8651ClangASTContext::DumpTypeDescription (void* type)
8652{
8653 StreamFile s (stdout, false);
8654 DumpTypeDescription (&s);
8655 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
8656 if (metadata)
8657 {
8658 metadata->Dump (&s);
8659 }
8660}
8661
8662void
8663ClangASTContext::DumpTypeDescription (void* type, Stream *s)
8664{
8665 if (type)
8666 {
8667 clang::QualType qual_type(GetQualType(type));
8668
8669 llvm::SmallVector<char, 1024> buf;
8670 llvm::raw_svector_ostream llvm_ostrm (buf);
8671
8672 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8673 switch (type_class)
8674 {
8675 case clang::Type::ObjCObject:
8676 case clang::Type::ObjCInterface:
8677 {
8678 GetCompleteType(type);
8679
8680 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8681 assert (objc_class_type);
8682 if (objc_class_type)
8683 {
8684 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8685 if (class_interface_decl)
8686 {
8687 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
8688 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
8689 }
8690 }
8691 }
8692 break;
8693
8694 case clang::Type::Typedef:
8695 {
8696 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
8697 if (typedef_type)
8698 {
8699 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
8700 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
8701 if (!clang_typedef_name.empty())
8702 {
8703 s->PutCString ("typedef ");
8704 s->PutCString (clang_typedef_name.c_str());
8705 }
8706 }
8707 }
8708 break;
8709
8710 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008711 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008712 return;
8713
8714 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008715 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008716 return;
8717
8718 case clang::Type::Record:
8719 {
8720 GetCompleteType(type);
8721
8722 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8723 const clang::RecordDecl *record_decl = record_type->getDecl();
8724 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8725
8726 if (cxx_record_decl)
8727 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8728 else
8729 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8730 }
8731 break;
8732
8733 default:
8734 {
8735 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
8736 if (tag_type)
8737 {
8738 clang::TagDecl *tag_decl = tag_type->getDecl();
8739 if (tag_decl)
8740 tag_decl->print(llvm_ostrm, 0);
8741 }
8742 else
8743 {
8744 std::string clang_type_name(qual_type.getAsString());
8745 if (!clang_type_name.empty())
8746 s->PutCString (clang_type_name.c_str());
8747 }
8748 }
8749 }
8750
Greg Claytond8d4a572015-08-11 21:38:15 +00008751 if (buf.size() > 0)
8752 {
8753 s->Write (buf.data(), buf.size());
8754 }
8755 }
8756}
Greg Clayton8b4edba2015-08-14 20:02:05 +00008757
Greg Clayton8b4edba2015-08-14 20:02:05 +00008758clang::ClassTemplateDecl *
Greg Clayton6071e6f2015-08-26 22:57:51 +00008759ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008760 lldb::AccessType access_type,
8761 const char *parent_name,
8762 int tag_decl_kind,
8763 const ClangASTContext::TemplateParameterInfos &template_param_infos)
8764{
8765 if (template_param_infos.IsValid())
8766 {
8767 std::string template_basename(parent_name);
8768 template_basename.erase (template_basename.find('<'));
8769
8770 return CreateClassTemplateDecl (decl_ctx,
8771 access_type,
8772 template_basename.c_str(),
8773 tag_decl_kind,
8774 template_param_infos);
8775 }
8776 return NULL;
8777}
8778
Greg Clayton6dc8d582015-08-18 22:32:36 +00008779void
8780ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl)
8781{
8782 ClangASTContext *ast = (ClangASTContext *)baton;
8783 SymbolFile *sym_file = ast->GetSymbolFile();
8784 if (sym_file)
8785 {
8786 CompilerType clang_type = GetTypeForDecl (decl);
8787 if (clang_type)
8788 sym_file->CompleteType (clang_type);
8789 }
8790}
8791
8792void
8793ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
8794{
8795 ClangASTContext *ast = (ClangASTContext *)baton;
8796 SymbolFile *sym_file = ast->GetSymbolFile();
8797 if (sym_file)
8798 {
8799 CompilerType clang_type = GetTypeForDecl (decl);
8800 if (clang_type)
8801 sym_file->CompleteType (clang_type);
8802 }
8803}
Greg Clayton8b4edba2015-08-14 20:02:05 +00008804
Greg Clayton261ac3f2015-08-28 01:01:03 +00008805
8806DWARFASTParser *
8807ClangASTContext::GetDWARFParser ()
8808{
8809 if (!m_dwarf_ast_parser_ap)
8810 m_dwarf_ast_parser_ap.reset(new DWARFASTParserClang(*this));
8811 return m_dwarf_ast_parser_ap.get();
8812}
8813
8814
Greg Clayton8b4edba2015-08-14 20:02:05 +00008815bool
Greg Clayton6dc8d582015-08-18 22:32:36 +00008816ClangASTContext::LayoutRecordType(void *baton,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008817 const clang::RecordDecl *record_decl,
8818 uint64_t &bit_size,
8819 uint64_t &alignment,
8820 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
8821 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
8822 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
8823{
Greg Clayton6dc8d582015-08-18 22:32:36 +00008824 ClangASTContext *ast = (ClangASTContext *)baton;
Greg Clayton261ac3f2015-08-28 01:01:03 +00008825 DWARFASTParserClang *dwarf_ast_parser = (DWARFASTParserClang *)ast->GetDWARFParser();
8826 return dwarf_ast_parser->LayoutRecordType(record_decl, bit_size, alignment, field_offsets, base_offsets, vbase_offsets);
Greg Clayton8b4edba2015-08-14 20:02:05 +00008827}
8828
Greg Clayton99558cc42015-08-24 23:46:31 +00008829//----------------------------------------------------------------------
8830// CompilerDeclContext functions
8831//----------------------------------------------------------------------
8832
8833bool
8834ClangASTContext::DeclContextIsStructUnionOrClass (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00008835{
Greg Clayton99558cc42015-08-24 23:46:31 +00008836 if (opaque_decl_ctx)
8837 return ((clang::DeclContext *)opaque_decl_ctx)->isRecord();
8838 else
8839 return false;
Greg Clayton8b4edba2015-08-14 20:02:05 +00008840}
8841
Greg Clayton99558cc42015-08-24 23:46:31 +00008842ConstString
8843ClangASTContext::DeclContextGetName (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00008844{
Greg Clayton99558cc42015-08-24 23:46:31 +00008845 if (opaque_decl_ctx)
8846 {
8847 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
8848 if (named_decl)
8849 return ConstString(named_decl->getName());
8850 }
8851 return ConstString();
8852}
8853
8854bool
8855ClangASTContext::DeclContextIsClassMethod (void *opaque_decl_ctx,
8856 lldb::LanguageType *language_ptr,
8857 bool *is_instance_method_ptr,
8858 ConstString *language_object_name_ptr)
8859{
8860 if (opaque_decl_ctx)
8861 {
8862 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
8863 if (ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
8864 {
8865 if (is_instance_method_ptr)
8866 *is_instance_method_ptr = objc_method->isInstanceMethod();
8867 if (language_ptr)
8868 *language_ptr = eLanguageTypeObjC;
8869 if (language_object_name_ptr)
8870 language_object_name_ptr->SetCString("self");
8871 return true;
8872 }
8873 else if (CXXMethodDecl *cxx_method = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
8874 {
8875 if (is_instance_method_ptr)
8876 *is_instance_method_ptr = cxx_method->isInstance();
8877 if (language_ptr)
8878 *language_ptr = eLanguageTypeC_plus_plus;
8879 if (language_object_name_ptr)
8880 language_object_name_ptr->SetCString("this");
8881 return true;
8882 }
8883 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
8884 {
8885 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
8886 if (metadata && metadata->HasObjectPtr())
8887 {
8888 if (is_instance_method_ptr)
8889 *is_instance_method_ptr = true;
8890 if (language_ptr)
8891 *language_ptr = eLanguageTypeObjC;
8892 if (language_object_name_ptr)
8893 language_object_name_ptr->SetCString (metadata->GetObjectPtrName());
8894 return true;
8895 }
8896 }
8897 }
8898 return false;
8899}
8900
8901clang::DeclContext *
8902ClangASTContext::DeclContextGetAsDeclContext (const CompilerDeclContext &dc)
8903{
8904 if (dc.IsClang())
8905 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
8906 return nullptr;
8907}
8908
8909
8910ObjCMethodDecl *
8911ClangASTContext::DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc)
8912{
8913 if (dc.IsClang())
8914 return llvm::dyn_cast<clang::ObjCMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8915 return nullptr;
8916}
8917
8918CXXMethodDecl *
8919ClangASTContext::DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc)
8920{
8921 if (dc.IsClang())
8922 return llvm::dyn_cast<clang::CXXMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8923 return nullptr;
8924}
8925
8926clang::FunctionDecl *
8927ClangASTContext::DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc)
8928{
8929 if (dc.IsClang())
8930 return llvm::dyn_cast<clang::FunctionDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8931 return nullptr;
8932}
8933
8934clang::NamespaceDecl *
8935ClangASTContext::DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc)
8936{
8937 if (dc.IsClang())
8938 return llvm::dyn_cast<clang::NamespaceDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8939 return nullptr;
8940}
8941
8942ClangASTMetadata *
8943ClangASTContext::DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object)
8944{
8945 clang::ASTContext *ast = DeclContextGetClangASTContext (dc);
8946 if (ast)
8947 return ClangASTContext::GetMetadata (ast, object);
8948 return nullptr;
8949}
8950
8951clang::ASTContext *
8952ClangASTContext::DeclContextGetClangASTContext (const CompilerDeclContext &dc)
8953{
Greg Claytonf73034f2015-09-08 18:15:05 +00008954 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
8955 if (ast)
8956 return ast->getASTContext();
Greg Clayton99558cc42015-08-24 23:46:31 +00008957 return nullptr;
Greg Clayton8b4edba2015-08-14 20:02:05 +00008958}
8959