blob: b7157bd9aac58d62457b756ac97dd576f1783f33 [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 Clayton526e5af2010-11-13 03:52:47 +00001117clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001118ClangASTContext::CopyDecl (ASTContext *dst_ast,
1119 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001120 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001121{
Sean Callanan79439e82010-11-18 02:56:27 +00001122 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001123 FileManager file_manager (file_system_options);
1124 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001125 *src_ast, file_manager,
1126 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001127
1128 return importer.Import(source_decl);
1129}
1130
Sean Callanan23a30272010-07-16 00:00:27 +00001131bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00001132ClangASTContext::AreTypesSame (CompilerType type1,
1133 CompilerType type2,
Greg Clayton84db9102012-03-26 23:03:23 +00001134 bool ignore_qualifiers)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001135{
Greg Claytonf73034f2015-09-08 18:15:05 +00001136 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type1.GetTypeSystem());
1137 if (!ast || ast != type2.GetTypeSystem())
Greg Clayton57ee3062013-07-11 22:46:58 +00001138 return false;
1139
1140 if (type1.GetOpaqueQualType() == type2.GetOpaqueQualType())
Greg Clayton55995eb2012-04-06 17:38:55 +00001141 return true;
1142
Greg Claytond8d4a572015-08-11 21:38:15 +00001143 QualType type1_qual = GetQualType(type1);
1144 QualType type2_qual = GetQualType(type2);
Sean Callanan5056ab02012-02-18 02:01:03 +00001145
1146 if (ignore_qualifiers)
1147 {
1148 type1_qual = type1_qual.getUnqualifiedType();
1149 type2_qual = type2_qual.getUnqualifiedType();
1150 }
1151
Greg Claytonf73034f2015-09-08 18:15:05 +00001152 return ast->getASTContext()->hasSameType (type1_qual, type2_qual);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001153}
1154
Greg Claytona1e5dc82015-08-11 22:53:00 +00001155CompilerType
Sean Callanan9998acd2014-12-05 01:21:59 +00001156ClangASTContext::GetTypeForDecl (clang::NamedDecl *decl)
1157{
1158 if (clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
1159 return GetTypeForDecl(interface_decl);
1160 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
1161 return GetTypeForDecl(tag_decl);
Greg Claytona1e5dc82015-08-11 22:53:00 +00001162 return CompilerType();
Sean Callanan9998acd2014-12-05 01:21:59 +00001163}
1164
Greg Clayton6beaaa62011-01-17 03:46:26 +00001165
Greg Claytona1e5dc82015-08-11 22:53:00 +00001166CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001167ClangASTContext::GetTypeForDecl (TagDecl *decl)
1168{
1169 // No need to call the getASTContext() accessor (which can create the AST
1170 // if it isn't created yet, because we can't have created a decl in this
1171 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001172 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001173 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001174 return CompilerType (ast, ast->getTagDeclType(decl));
1175 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001176}
1177
Greg Claytona1e5dc82015-08-11 22:53:00 +00001178CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001179ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1180{
1181 // No need to call the getASTContext() accessor (which can create the AST
1182 // if it isn't created yet, because we can't have created a decl in this
1183 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001184 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001185 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001186 return CompilerType (ast, ast->getObjCInterfaceType(decl));
1187 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001188}
1189
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001190#pragma mark Structure, Unions, Classes
1191
Greg Claytona1e5dc82015-08-11 22:53:00 +00001192CompilerType
Greg Claytonc4ffd662013-03-08 01:37:30 +00001193ClangASTContext::CreateRecordType (DeclContext *decl_ctx,
1194 AccessType access_type,
1195 const char *name,
1196 int kind,
1197 LanguageType language,
1198 ClangASTMetadata *metadata)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001199{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001200 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001201 assert (ast != nullptr);
Sean Callananad880762012-04-18 01:06:17 +00001202
Ed Masted4612ad2014-04-20 13:17:36 +00001203 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001204 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001205
Greg Clayton9e409562010-07-28 02:04:09 +00001206
Greg Claytone1be9962011-08-24 23:50:00 +00001207 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001208 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001209 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001210 bool isInternal = false;
Sean Callananad880762012-04-18 01:06:17 +00001211 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
Greg Clayton9e409562010-07-28 02:04:09 +00001212 }
1213
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001214 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1215 // we will need to update this code. I was told to currently always use
1216 // the CXXRecordDecl class since we often don't know from debug information
1217 // if something is struct or a class, so we default to always use the more
1218 // complete definition just in case.
Sean Callanan11e32d32014-02-18 00:31:38 +00001219
1220 bool is_anonymous = (!name) || (!name[0]);
1221
Greg Claytonf0705c82011-10-22 03:33:13 +00001222 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1223 (TagDecl::TagKind)kind,
1224 decl_ctx,
1225 SourceLocation(),
1226 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001227 is_anonymous ? nullptr : &ast->Idents.get(name));
Sean Callanan11e32d32014-02-18 00:31:38 +00001228
1229 if (is_anonymous)
1230 decl->setAnonymousStructOrUnion(true);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001231
Greg Claytonc4ffd662013-03-08 01:37:30 +00001232 if (decl)
Greg Clayton55561e92011-10-26 03:31:36 +00001233 {
Greg Claytonc4ffd662013-03-08 01:37:30 +00001234 if (metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001235 SetMetadata(ast, decl, *metadata);
Greg Claytonc4ffd662013-03-08 01:37:30 +00001236
Greg Clayton55561e92011-10-26 03:31:36 +00001237 if (access_type != eAccessNone)
1238 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Claytonc4ffd662013-03-08 01:37:30 +00001239
1240 if (decl_ctx)
1241 decl_ctx->addDecl (decl);
1242
Greg Claytona1e5dc82015-08-11 22:53:00 +00001243 return CompilerType(ast, ast->getTagDeclType(decl));
Greg Clayton55561e92011-10-26 03:31:36 +00001244 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001245 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001246}
1247
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001248static TemplateParameterList *
1249CreateTemplateParameterList (ASTContext *ast,
Sean Callanan3d654b32012-09-24 22:25:51 +00001250 const ClangASTContext::TemplateParameterInfos &template_param_infos,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001251 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1252{
1253 const bool parameter_pack = false;
1254 const bool is_typename = false;
1255 const unsigned depth = 0;
1256 const size_t num_template_params = template_param_infos.GetSize();
1257 for (size_t i=0; i<num_template_params; ++i)
1258 {
1259 const char *name = template_param_infos.names[i];
Greg Clayton283b2652013-04-23 22:38:02 +00001260
Ed Masted4612ad2014-04-20 13:17:36 +00001261 IdentifierInfo *identifier_info = nullptr;
Greg Clayton283b2652013-04-23 22:38:02 +00001262 if (name && name[0])
1263 identifier_info = &ast->Idents.get(name);
Sean Callanan3d654b32012-09-24 22:25:51 +00001264 if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001265 {
1266 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1267 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1268 SourceLocation(),
1269 SourceLocation(),
1270 depth,
1271 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001272 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001273 template_param_infos.args[i].getIntegralType(),
1274 parameter_pack,
Ed Masted4612ad2014-04-20 13:17:36 +00001275 nullptr));
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001276
1277 }
1278 else
1279 {
1280 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1281 ast->getTranslationUnitDecl(), // Is this the right decl context?
1282 SourceLocation(),
1283 SourceLocation(),
1284 depth,
1285 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001286 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001287 is_typename,
1288 parameter_pack));
1289 }
1290 }
1291
1292 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1293 SourceLocation(),
1294 SourceLocation(),
1295 &template_param_decls.front(),
1296 template_param_decls.size(),
1297 SourceLocation());
1298 return template_param_list;
1299}
1300
1301clang::FunctionTemplateDecl *
1302ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1303 clang::FunctionDecl *func_decl,
1304 const char *name,
1305 const TemplateParameterInfos &template_param_infos)
1306{
1307// /// \brief Create a function template node.
1308 ASTContext *ast = getASTContext();
1309
1310 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1311
1312 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1313 template_param_infos,
1314 template_param_decls);
1315 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1316 decl_ctx,
1317 func_decl->getLocation(),
1318 func_decl->getDeclName(),
1319 template_param_list,
1320 func_decl);
1321
1322 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1323 i < template_param_decl_count;
1324 ++i)
1325 {
1326 // TODO: verify which decl context we should put template_param_decls into..
1327 template_param_decls[i]->setDeclContext (func_decl);
1328 }
1329
1330 return func_tmpl_decl;
1331}
1332
1333void
1334ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1335 clang::FunctionTemplateDecl *func_tmpl_decl,
1336 const TemplateParameterInfos &infos)
1337{
1338 TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1339 infos.args.data(),
1340 infos.args.size());
1341
1342 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1343 &template_args,
Ed Masted4612ad2014-04-20 13:17:36 +00001344 nullptr);
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001345}
1346
1347
Greg Claytonf0705c82011-10-22 03:33:13 +00001348ClassTemplateDecl *
1349ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001350 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001351 const char *class_name,
1352 int kind,
1353 const TemplateParameterInfos &template_param_infos)
1354{
1355 ASTContext *ast = getASTContext();
1356
Ed Masted4612ad2014-04-20 13:17:36 +00001357 ClassTemplateDecl *class_template_decl = nullptr;
1358 if (decl_ctx == nullptr)
Greg Claytonf0705c82011-10-22 03:33:13 +00001359 decl_ctx = ast->getTranslationUnitDecl();
1360
1361 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1362 DeclarationName decl_name (&identifier_info);
1363
1364 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001365
1366 for (NamedDecl *decl : result)
Greg Claytonf0705c82011-10-22 03:33:13 +00001367 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001368 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
Greg Claytonf0705c82011-10-22 03:33:13 +00001369 if (class_template_decl)
1370 return class_template_decl;
1371 }
1372
1373 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf0705c82011-10-22 03:33:13 +00001374
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001375 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1376 template_param_infos,
1377 template_param_decls);
Greg Claytonf0705c82011-10-22 03:33:13 +00001378
1379 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1380 (TagDecl::TagKind)kind,
1381 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1382 SourceLocation(),
1383 SourceLocation(),
1384 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001385
1386 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1387 i < template_param_decl_count;
1388 ++i)
1389 {
1390 template_param_decls[i]->setDeclContext (template_cxx_decl);
1391 }
1392
Sean Callananb5c79622011-11-19 01:35:08 +00001393 // With templated classes, we say that a class is templated with
1394 // specializations, but that the bare class has no functions.
Sean Callananfa4fab72013-02-01 06:55:48 +00001395 //template_cxx_decl->startDefinition();
1396 //template_cxx_decl->completeDefinition();
Sean Callananb5c79622011-11-19 01:35:08 +00001397
Greg Claytonf0705c82011-10-22 03:33:13 +00001398 class_template_decl = ClassTemplateDecl::Create (*ast,
1399 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1400 SourceLocation(),
1401 decl_name,
1402 template_param_list,
1403 template_cxx_decl,
Ed Masted4612ad2014-04-20 13:17:36 +00001404 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001405
1406 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001407 {
Greg Clayton55561e92011-10-26 03:31:36 +00001408 if (access_type != eAccessNone)
1409 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan5b26f272012-02-04 08:49:35 +00001410
1411 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1412 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1413
Greg Claytonf0705c82011-10-22 03:33:13 +00001414 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001415
1416#ifdef LLDB_CONFIGURATION_DEBUG
1417 VerifyDecl(class_template_decl);
1418#endif
1419 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001420
1421 return class_template_decl;
1422}
1423
1424
1425ClassTemplateSpecializationDecl *
1426ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1427 ClassTemplateDecl *class_template_decl,
1428 int kind,
1429 const TemplateParameterInfos &template_param_infos)
1430{
1431 ASTContext *ast = getASTContext();
1432 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1433 (TagDecl::TagKind)kind,
1434 decl_ctx,
1435 SourceLocation(),
1436 SourceLocation(),
1437 class_template_decl,
1438 &template_param_infos.args.front(),
1439 template_param_infos.args.size(),
Ed Masted4612ad2014-04-20 13:17:36 +00001440 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001441
Sean Callananfa4fab72013-02-01 06:55:48 +00001442 class_template_specialization_decl->setSpecializationKind(TSK_ExplicitSpecialization);
1443
Greg Claytonf0705c82011-10-22 03:33:13 +00001444 return class_template_specialization_decl;
1445}
1446
Greg Claytona1e5dc82015-08-11 22:53:00 +00001447CompilerType
Greg Claytonf0705c82011-10-22 03:33:13 +00001448ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1449{
1450 if (class_template_specialization_decl)
1451 {
1452 ASTContext *ast = getASTContext();
1453 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001454 return CompilerType(ast, ast->getTagDeclType(class_template_specialization_decl));
Greg Claytonf0705c82011-10-22 03:33:13 +00001455 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001456 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001457}
1458
Greg Clayton090d0982011-06-19 03:43:27 +00001459static inline bool
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001460check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001461{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001462 // Special-case call since it can take any number of operands
1463 if(op_kind == OO_Call)
1464 return true;
1465
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001466 // The parameter count doesn't include "this"
Greg Clayton090d0982011-06-19 03:43:27 +00001467 if (num_params == 0)
1468 return unary;
1469 if (num_params == 1)
1470 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001471 else
Greg Clayton090d0982011-06-19 03:43:27 +00001472 return false;
1473}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001474
Greg Clayton090d0982011-06-19 03:43:27 +00001475bool
1476ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1477{
Sean Callanan5b26f272012-02-04 08:49:35 +00001478 switch (op_kind)
1479 {
1480 default:
1481 break;
1482 // C++ standard allows any number of arguments to new/delete
1483 case OO_New:
1484 case OO_Array_New:
1485 case OO_Delete:
1486 case OO_Array_Delete:
1487 return true;
1488 }
1489
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001490#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 +00001491 switch (op_kind)
1492 {
1493#include "clang/Basic/OperatorKinds.def"
1494 default: break;
1495 }
1496 return false;
1497}
1498
Greg Clayton57ee3062013-07-11 22:46:58 +00001499clang::AccessSpecifier
1500ClangASTContext::UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs)
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001501{
1502 clang::AccessSpecifier ret = lhs;
1503
1504 // Make the access equal to the stricter of the field and the nested field's access
1505 switch (ret)
1506 {
1507 case clang::AS_none:
1508 break;
1509 case clang::AS_private:
1510 break;
1511 case clang::AS_protected:
1512 if (rhs == AS_private)
1513 ret = AS_private;
1514 break;
1515 case clang::AS_public:
1516 ret = rhs;
1517 break;
1518 }
1519
1520 return ret;
1521}
1522
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001523bool
1524ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1525{
1526 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1527}
1528
1529bool
1530ClangASTContext::FieldIsBitfield
1531(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001532 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001533 FieldDecl* field,
1534 uint32_t& bitfield_bit_size
1535)
1536{
Ed Masted4612ad2014-04-20 13:17:36 +00001537 if (ast == nullptr || field == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001538 return false;
1539
1540 if (field->isBitField())
1541 {
1542 Expr* bit_width_expr = field->getBitWidth();
1543 if (bit_width_expr)
1544 {
1545 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001546 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001547 {
1548 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1549 return true;
1550 }
1551 }
1552 }
1553 return false;
1554}
1555
1556bool
1557ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1558{
Ed Masted4612ad2014-04-20 13:17:36 +00001559 if (record_decl == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001560 return false;
1561
1562 if (!record_decl->field_empty())
1563 return true;
1564
1565 // No fields, lets check this is a CXX record and check the base classes
1566 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1567 if (cxx_record_decl)
1568 {
1569 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1570 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1571 base_class != base_class_end;
1572 ++base_class)
1573 {
1574 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1575 if (RecordHasFields(base_class_decl))
1576 return true;
1577 }
1578 }
1579 return false;
1580}
1581
Greg Clayton8cf05932010-07-22 18:30:50 +00001582#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001583
Greg Claytona1e5dc82015-08-11 22:53:00 +00001584CompilerType
Sean Callananad880762012-04-18 01:06:17 +00001585ClangASTContext::CreateObjCClass
Greg Clayton8cf05932010-07-22 18:30:50 +00001586(
1587 const char *name,
1588 DeclContext *decl_ctx,
1589 bool isForwardDecl,
Sean Callananad880762012-04-18 01:06:17 +00001590 bool isInternal,
Jim Ingham379397632012-10-27 02:54:13 +00001591 ClangASTMetadata *metadata
Greg Clayton8cf05932010-07-22 18:30:50 +00001592)
1593{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001594 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001595 assert (ast != nullptr);
Greg Clayton8cf05932010-07-22 18:30:50 +00001596 assert (name && name[0]);
Ed Masted4612ad2014-04-20 13:17:36 +00001597 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001598 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00001599
Greg Clayton6beaaa62011-01-17 03:46:26 +00001600 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001601 decl_ctx,
1602 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001603 &ast->Idents.get(name),
Ed Masted4612ad2014-04-20 13:17:36 +00001604 nullptr,
Pavel Labath67add942015-07-07 10:11:16 +00001605 nullptr,
Greg Clayton8cf05932010-07-22 18:30:50 +00001606 SourceLocation(),
Sean Callanan5b26f272012-02-04 08:49:35 +00001607 /*isForwardDecl,*/
Greg Clayton8cf05932010-07-22 18:30:50 +00001608 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00001609
Jim Ingham379397632012-10-27 02:54:13 +00001610 if (decl && metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001611 SetMetadata(ast, decl, *metadata);
Sean Callananad880762012-04-18 01:06:17 +00001612
Greg Claytona1e5dc82015-08-11 22:53:00 +00001613 return CompilerType (ast, ast->getObjCInterfaceType(decl));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001614}
1615
1616static inline bool
1617BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
1618{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001619 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001620}
1621
Greg Clayton57ee3062013-07-11 22:46:58 +00001622uint32_t
1623ClangASTContext::GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001624{
1625 uint32_t num_bases = 0;
1626 if (cxx_record_decl)
1627 {
1628 if (omit_empty_base_classes)
1629 {
1630 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1631 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1632 base_class != base_class_end;
1633 ++base_class)
1634 {
1635 // Skip empty base classes
1636 if (omit_empty_base_classes)
1637 {
1638 if (BaseSpecifierIsEmpty (base_class))
1639 continue;
1640 }
1641 ++num_bases;
1642 }
1643 }
1644 else
1645 num_bases = cxx_record_decl->getNumBases();
1646 }
1647 return num_bases;
1648}
1649
1650
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001651#pragma mark Namespace Declarations
1652
1653NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00001654ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001655{
Ed Masted4612ad2014-04-20 13:17:36 +00001656 NamespaceDecl *namespace_decl = nullptr;
Greg Clayton9d3d6882011-10-31 23:51:19 +00001657 ASTContext *ast = getASTContext();
1658 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
Ed Masted4612ad2014-04-20 13:17:36 +00001659 if (decl_ctx == nullptr)
Greg Clayton9d3d6882011-10-31 23:51:19 +00001660 decl_ctx = translation_unit_decl;
1661
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001662 if (name)
1663 {
Greg Clayton030a2042011-10-14 21:34:45 +00001664 IdentifierInfo &identifier_info = ast->Idents.get(name);
1665 DeclarationName decl_name (&identifier_info);
1666 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001667 for (NamedDecl *decl : result)
Greg Clayton030a2042011-10-14 21:34:45 +00001668 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001669 namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
Greg Clayton030a2042011-10-14 21:34:45 +00001670 if (namespace_decl)
1671 return namespace_decl;
1672 }
1673
Sean Callanan5b26f272012-02-04 08:49:35 +00001674 namespace_decl = NamespaceDecl::Create(*ast,
1675 decl_ctx,
1676 false,
1677 SourceLocation(),
1678 SourceLocation(),
1679 &identifier_info,
Ed Masted4612ad2014-04-20 13:17:36 +00001680 nullptr);
Greg Clayton030a2042011-10-14 21:34:45 +00001681
Greg Clayton9d3d6882011-10-31 23:51:19 +00001682 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001683 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001684 else
1685 {
1686 if (decl_ctx == translation_unit_decl)
1687 {
1688 namespace_decl = translation_unit_decl->getAnonymousNamespace();
1689 if (namespace_decl)
1690 return namespace_decl;
1691
Sean Callanan5b26f272012-02-04 08:49:35 +00001692 namespace_decl = NamespaceDecl::Create(*ast,
1693 decl_ctx,
1694 false,
1695 SourceLocation(),
1696 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001697 nullptr,
1698 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001699 translation_unit_decl->setAnonymousNamespace (namespace_decl);
1700 translation_unit_decl->addDecl (namespace_decl);
1701 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
1702 }
1703 else
1704 {
1705 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
1706 if (parent_namespace_decl)
1707 {
1708 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
1709 if (namespace_decl)
1710 return namespace_decl;
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 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
1719 parent_namespace_decl->addDecl (namespace_decl);
1720 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
1721 }
1722 else
1723 {
1724 // BAD!!!
1725 }
1726 }
1727
1728
1729 if (namespace_decl)
1730 {
1731 // If we make it here, we are creating the anonymous namespace decl
1732 // for the first time, so we need to do the using directive magic
1733 // like SEMA does
1734 UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast,
1735 decl_ctx,
1736 SourceLocation(),
1737 SourceLocation(),
1738 NestedNameSpecifierLoc(),
1739 SourceLocation(),
1740 namespace_decl,
1741 decl_ctx);
1742 using_directive_decl->setImplicit();
1743 decl_ctx->addDecl(using_directive_decl);
1744 }
1745 }
1746#ifdef LLDB_CONFIGURATION_DEBUG
1747 VerifyDecl(namespace_decl);
1748#endif
Greg Clayton030a2042011-10-14 21:34:45 +00001749 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001750}
1751
1752
1753#pragma mark Function Types
1754
1755FunctionDecl *
Greg Clayton57ee3062013-07-11 22:46:58 +00001756ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx,
1757 const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001758 const CompilerType &function_clang_type,
Greg Clayton57ee3062013-07-11 22:46:58 +00001759 int storage,
1760 bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001761{
Ed Masted4612ad2014-04-20 13:17:36 +00001762 FunctionDecl *func_decl = nullptr;
Greg Clayton147e1fa2011-10-14 22:47:18 +00001763 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001764 if (decl_ctx == nullptr)
Greg Clayton147e1fa2011-10-14 22:47:18 +00001765 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001766
Greg Clayton0d551042013-06-28 21:08:47 +00001767
1768 const bool hasWrittenPrototype = true;
1769 const bool isConstexprSpecified = false;
1770
Greg Clayton147e1fa2011-10-14 22:47:18 +00001771 if (name && name[0])
1772 {
1773 func_decl = FunctionDecl::Create (*ast,
1774 decl_ctx,
1775 SourceLocation(),
1776 SourceLocation(),
1777 DeclarationName (&ast->Idents.get(name)),
Greg Claytond8d4a572015-08-11 21:38:15 +00001778 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001779 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001780 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00001781 is_inline,
1782 hasWrittenPrototype,
1783 isConstexprSpecified);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001784 }
Greg Clayton147e1fa2011-10-14 22:47:18 +00001785 else
1786 {
1787 func_decl = FunctionDecl::Create (*ast,
1788 decl_ctx,
1789 SourceLocation(),
1790 SourceLocation(),
1791 DeclarationName (),
Greg Claytond8d4a572015-08-11 21:38:15 +00001792 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001793 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001794 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00001795 is_inline,
1796 hasWrittenPrototype,
1797 isConstexprSpecified);
Greg Clayton147e1fa2011-10-14 22:47:18 +00001798 }
1799 if (func_decl)
1800 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001801
1802#ifdef LLDB_CONFIGURATION_DEBUG
1803 VerifyDecl(func_decl);
1804#endif
1805
Greg Clayton147e1fa2011-10-14 22:47:18 +00001806 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001807}
1808
Greg Claytona1e5dc82015-08-11 22:53:00 +00001809CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001810ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001811 const CompilerType& result_type,
1812 const CompilerType *args,
Sean Callananc81256a2010-09-16 20:40:25 +00001813 unsigned num_args,
1814 bool is_variadic,
1815 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001816{
Ed Masted4612ad2014-04-20 13:17:36 +00001817 assert (ast != nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001818 std::vector<QualType> qual_type_args;
1819 for (unsigned i=0; i<num_args; ++i)
Greg Claytond8d4a572015-08-11 21:38:15 +00001820 qual_type_args.push_back (GetQualType(args[i]));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001821
1822 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00001823 FunctionProtoType::ExtProtoInfo proto_info;
1824 proto_info.Variadic = is_variadic;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00001825 proto_info.ExceptionSpec = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00001826 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00001827 proto_info.RefQualifier = RQ_None;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00001828
Greg Claytona1e5dc82015-08-11 22:53:00 +00001829 return CompilerType (ast, ast->getFunctionType (GetQualType(result_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00001830 qual_type_args,
Greg Claytond8d4a572015-08-11 21:38:15 +00001831 proto_info));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001832}
1833
1834ParmVarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00001835ClangASTContext::CreateParameterDeclaration (const char *name, const CompilerType &param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001836{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001837 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001838 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001839 return ParmVarDecl::Create(*ast,
1840 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001841 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00001842 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001843 name && name[0] ? &ast->Idents.get(name) : nullptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00001844 GetQualType(param_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001845 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001846 (clang::StorageClass)storage,
Ed Masted4612ad2014-04-20 13:17:36 +00001847 nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001848}
1849
1850void
1851ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
1852{
1853 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00001854 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001855}
1856
1857
1858#pragma mark Array Types
1859
Greg Claytona1e5dc82015-08-11 22:53:00 +00001860CompilerType
1861ClangASTContext::CreateArrayType (const CompilerType &element_type,
Greg Clayton1c8ef472013-04-05 23:27:21 +00001862 size_t element_count,
1863 bool is_vector)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001864{
Greg Clayton57ee3062013-07-11 22:46:58 +00001865 if (element_type.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001866 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00001867 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001868 assert (ast != nullptr);
Greg Clayton4ef877f2012-12-06 02:33:54 +00001869
Greg Clayton1c8ef472013-04-05 23:27:21 +00001870 if (is_vector)
1871 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001872 return CompilerType (ast, ast->getExtVectorType(GetQualType(element_type), element_count));
Greg Clayton4ef877f2012-12-06 02:33:54 +00001873 }
1874 else
1875 {
Greg Clayton1c8ef472013-04-05 23:27:21 +00001876
1877 llvm::APInt ap_element_count (64, element_count);
1878 if (element_count == 0)
1879 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001880 return CompilerType (ast, ast->getIncompleteArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00001881 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00001882 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00001883 }
1884 else
1885 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001886 return CompilerType (ast, ast->getConstantArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00001887 ap_element_count,
1888 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00001889 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00001890 }
Greg Clayton4ef877f2012-12-06 02:33:54 +00001891 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001892 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001893 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001894}
1895
Greg Claytona1e5dc82015-08-11 22:53:00 +00001896CompilerType
Enrico Granata76b08d52014-10-29 23:08:02 +00001897ClangASTContext::GetOrCreateStructForIdentifier (const ConstString &type_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001898 const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields,
Enrico Granataa449e862014-10-30 00:53:28 +00001899 bool packed)
Enrico Granata76b08d52014-10-29 23:08:02 +00001900{
Greg Claytona1e5dc82015-08-11 22:53:00 +00001901 CompilerType type;
Enrico Granata76b08d52014-10-29 23:08:02 +00001902 if ((type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
1903 return type;
1904 type = CreateRecordType(nullptr, lldb::eAccessPublic, type_name.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC);
Greg Claytond8d4a572015-08-11 21:38:15 +00001905 StartTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00001906 for (const auto& field : type_fields)
Greg Claytond8d4a572015-08-11 21:38:15 +00001907 AddFieldToRecordType(type, field.first, field.second, lldb::eAccessPublic, 0);
Enrico Granataa449e862014-10-30 00:53:28 +00001908 if (packed)
Greg Claytond8d4a572015-08-11 21:38:15 +00001909 SetIsPacked(type);
1910 CompleteTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00001911 return type;
1912}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001913
1914#pragma mark Enumeration Types
1915
Greg Claytona1e5dc82015-08-11 22:53:00 +00001916CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00001917ClangASTContext::CreateEnumerationType
Greg Claytonca512b32011-01-14 04:54:56 +00001918(
Greg Claytond8d4a572015-08-11 21:38:15 +00001919 const char *name,
1920 DeclContext *decl_ctx,
1921 const Declaration &decl,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001922 const CompilerType &integer_clang_type
Greg Claytond8d4a572015-08-11 21:38:15 +00001923 )
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001924{
1925 // TODO: Do something intelligent with the Declaration object passed in
1926 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00001927 ASTContext *ast = getASTContext();
Greg Claytond8d4a572015-08-11 21:38:15 +00001928
Greg Claytone02b8502010-10-12 04:29:14 +00001929 // TODO: ask about these...
Greg Claytond8d4a572015-08-11 21:38:15 +00001930 // const bool IsScoped = false;
1931 // const bool IsFixed = false;
1932
Greg Clayton6beaaa62011-01-17 03:46:26 +00001933 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00001934 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00001935 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00001936 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001937 name && name[0] ? &ast->Idents.get(name) : nullptr,
1938 nullptr,
Sean Callanan48114472010-12-13 01:26:27 +00001939 false, // IsScoped
1940 false, // IsScopedUsingClassTag
1941 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00001942
1943
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001944 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00001945 {
1946 // TODO: check if we should be setting the promotion type too?
Greg Claytond8d4a572015-08-11 21:38:15 +00001947 enum_decl->setIntegerType(GetQualType(integer_clang_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00001948
1949 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
1950
Greg Claytona1e5dc82015-08-11 22:53:00 +00001951 return CompilerType (ast, ast->getTagDeclType(enum_decl));
Greg Clayton83ff3892010-09-12 23:17:56 +00001952 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001953 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001954}
1955
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001956// Disable this for now since I can't seem to get a nicely formatted float
1957// out of the APFloat class without just getting the float, double or quad
1958// and then using a formatted print on it which defeats the purpose. We ideally
1959// would like to get perfect string values for any kind of float semantics
1960// so we can support remote targets. The code below also requires a patch to
1961// llvm::APInt.
1962//bool
Greg Clayton6beaaa62011-01-17 03:46:26 +00001963//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 +00001964//{
1965// uint32_t count = 0;
1966// bool is_complex = false;
1967// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
1968// {
1969// unsigned num_bytes_per_float = byte_size / count;
1970// unsigned num_bits_per_float = num_bytes_per_float * 8;
1971//
1972// float_str.clear();
1973// uint32_t i;
1974// for (i=0; i<count; i++)
1975// {
1976// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
1977// bool is_ieee = false;
1978// APFloat ap_float(ap_int, is_ieee);
1979// char s[1024];
1980// unsigned int hex_digits = 0;
1981// bool upper_case = false;
1982//
1983// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
1984// {
1985// if (i > 0)
1986// float_str.append(", ");
1987// float_str.append(s);
1988// if (i == 1 && is_complex)
1989// float_str.append(1, 'i');
1990// }
1991// }
1992// return !float_str.empty();
1993// }
1994// return false;
1995//}
1996
Greg Claytona1e5dc82015-08-11 22:53:00 +00001997CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00001998ClangASTContext::GetIntTypeFromBitSize (clang::ASTContext *ast,
1999 size_t bit_size, bool is_signed)
2000{
2001 if (ast)
2002 {
2003 if (is_signed)
2004 {
2005 if (bit_size == ast->getTypeSize(ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002006 return CompilerType(ast, ast->SignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002007
2008 if (bit_size == ast->getTypeSize(ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002009 return CompilerType(ast, ast->ShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002010
2011 if (bit_size == ast->getTypeSize(ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002012 return CompilerType(ast, ast->IntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002013
2014 if (bit_size == ast->getTypeSize(ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002015 return CompilerType(ast, ast->LongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002016
2017 if (bit_size == ast->getTypeSize(ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002018 return CompilerType(ast, ast->LongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002019
2020 if (bit_size == ast->getTypeSize(ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002021 return CompilerType(ast, ast->Int128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002022 }
2023 else
2024 {
2025 if (bit_size == ast->getTypeSize(ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002026 return CompilerType(ast, ast->UnsignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002027
2028 if (bit_size == ast->getTypeSize(ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002029 return CompilerType(ast, ast->UnsignedShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002030
2031 if (bit_size == ast->getTypeSize(ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002032 return CompilerType(ast, ast->UnsignedIntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002033
2034 if (bit_size == ast->getTypeSize(ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002035 return CompilerType(ast, ast->UnsignedLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002036
2037 if (bit_size == ast->getTypeSize(ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002038 return CompilerType(ast, ast->UnsignedLongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002039
2040 if (bit_size == ast->getTypeSize(ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002041 return CompilerType(ast, ast->UnsignedInt128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002042 }
2043 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002044 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002045}
2046
Greg Claytona1e5dc82015-08-11 22:53:00 +00002047CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002048ClangASTContext::GetPointerSizedIntType (clang::ASTContext *ast, bool is_signed)
2049{
2050 if (ast)
2051 return GetIntTypeFromBitSize(ast, ast->getTypeSize(ast->VoidPtrTy), is_signed);
Greg Claytona1e5dc82015-08-11 22:53:00 +00002052 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002053}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002054
Greg Claytona1e5dc82015-08-11 22:53:00 +00002055CompilerType
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002056ClangASTContext::GetFloatTypeFromBitSize (clang::ASTContext *ast,
2057 size_t bit_size)
2058{
2059 if (ast)
2060 {
2061 if (bit_size == ast->getTypeSize(ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002062 return CompilerType(ast, ast->FloatTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002063 else if (bit_size == ast->getTypeSize(ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002064 return CompilerType(ast, ast->DoubleTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002065 else if (bit_size == ast->getTypeSize(ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002066 return CompilerType(ast, ast->LongDoubleTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002067 else if (bit_size == ast->getTypeSize(ast->HalfTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002068 return CompilerType(ast, ast->HalfTy);
Greg Claytonbc8fc0f2013-06-11 21:56:55 +00002069 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002070 return CompilerType();
Enrico Granata86027e92012-03-24 01:11:14 +00002071}
2072
2073bool
Greg Claytona2721472011-06-25 00:44:06 +00002074ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
2075 clang::Decl *decl)
2076{
2077 if (!decl)
2078 return false;
2079
2080 ExternalASTSource *ast_source = ast->getExternalSource();
2081
2082 if (!ast_source)
2083 return false;
2084
2085 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
2086 {
Greg Clayton219cf312012-03-30 00:51:13 +00002087 if (tag_decl->isCompleteDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002088 return true;
2089
2090 if (!tag_decl->hasExternalLexicalStorage())
2091 return false;
2092
2093 ast_source->CompleteType(tag_decl);
2094
2095 return !tag_decl->getTypeForDecl()->isIncompleteType();
2096 }
2097 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
2098 {
Sean Callanan5b26f272012-02-04 08:49:35 +00002099 if (objc_interface_decl->getDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002100 return true;
2101
2102 if (!objc_interface_decl->hasExternalLexicalStorage())
2103 return false;
2104
2105 ast_source->CompleteType(objc_interface_decl);
2106
Sean Callanan5b26f272012-02-04 08:49:35 +00002107 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytona2721472011-06-25 00:44:06 +00002108 }
2109 else
2110 {
2111 return false;
2112 }
2113}
2114
Sean Callanan60217122012-04-13 00:10:03 +00002115void
Greg Claytond0029442013-03-27 01:48:02 +00002116ClangASTContext::SetMetadataAsUserID (const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002117 user_id_t user_id)
2118{
2119 ClangASTMetadata meta_data;
2120 meta_data.SetUserID (user_id);
2121 SetMetadata (object, meta_data);
2122}
2123
2124void
Sean Callanan60217122012-04-13 00:10:03 +00002125ClangASTContext::SetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002126 const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002127 ClangASTMetadata &metadata)
Sean Callanan60217122012-04-13 00:10:03 +00002128{
2129 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002130 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002131
2132 if (external_source)
2133 external_source->SetMetadata(object, metadata);
2134}
2135
Jim Ingham379397632012-10-27 02:54:13 +00002136ClangASTMetadata *
Sean Callanan60217122012-04-13 00:10:03 +00002137ClangASTContext::GetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002138 const void *object)
Sean Callanan60217122012-04-13 00:10:03 +00002139{
2140 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002141 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002142
2143 if (external_source && external_source->HasMetadata(object))
2144 return external_source->GetMetadata(object);
2145 else
Ed Masted4612ad2014-04-20 13:17:36 +00002146 return nullptr;
Sean Callanan60217122012-04-13 00:10:03 +00002147}
2148
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002149clang::DeclContext *
2150ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
2151{
Sean Callanana87bee82011-08-19 06:19:25 +00002152 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002153}
2154
2155clang::DeclContext *
2156ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
2157{
Sean Callanana87bee82011-08-19 06:19:25 +00002158 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002159}
2160
Greg Claytond8d4a572015-08-11 21:38:15 +00002161bool
2162ClangASTContext::SetTagTypeKind (clang::QualType tag_qual_type, int kind) const
2163{
2164 const clang::Type *clang_type = tag_qual_type.getTypePtr();
2165 if (clang_type)
2166 {
2167 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(clang_type);
2168 if (tag_type)
2169 {
2170 clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(tag_type->getDecl());
2171 if (tag_decl)
2172 {
2173 tag_decl->setTagKind ((clang::TagDecl::TagKind)kind);
2174 return true;
2175 }
2176 }
2177 }
2178 return false;
2179}
2180
2181
2182bool
2183ClangASTContext::SetDefaultAccessForRecordFields (clang::RecordDecl* record_decl,
2184 int default_accessibility,
2185 int *assigned_accessibilities,
2186 size_t num_assigned_accessibilities)
2187{
2188 if (record_decl)
2189 {
2190 uint32_t field_idx;
2191 clang::RecordDecl::field_iterator field, field_end;
2192 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2193 field != field_end;
2194 ++field, ++field_idx)
2195 {
2196 // If no accessibility was assigned, assign the correct one
2197 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2198 field->setAccess ((clang::AccessSpecifier)default_accessibility);
2199 }
2200 return true;
2201 }
2202 return false;
2203}
2204
2205clang::DeclContext *
Greg Clayton99558cc42015-08-24 23:46:31 +00002206ClangASTContext::GetDeclContextForType (const CompilerType& type)
2207{
2208 return GetDeclContextForType(GetQualType(type));
2209}
2210
2211clang::DeclContext *
Greg Claytond8d4a572015-08-11 21:38:15 +00002212ClangASTContext::GetDeclContextForType (clang::QualType type)
2213{
2214 if (type.isNull())
2215 return nullptr;
2216
2217 clang::QualType qual_type = type.getCanonicalType();
2218 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2219 switch (type_class)
2220 {
Greg Claytond8d4a572015-08-11 21:38:15 +00002221 case clang::Type::ObjCInterface: return llvm::cast<clang::ObjCObjectType>(qual_type.getTypePtr())->getInterface();
2222 case clang::Type::ObjCObjectPointer: return GetDeclContextForType (llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
2223 case clang::Type::Record: return llvm::cast<clang::RecordType>(qual_type)->getDecl();
2224 case clang::Type::Enum: return llvm::cast<clang::EnumType>(qual_type)->getDecl();
2225 case clang::Type::Typedef: return GetDeclContextForType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
2226 case clang::Type::Elaborated: return GetDeclContextForType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
2227 case clang::Type::Paren: return GetDeclContextForType (llvm::cast<clang::ParenType>(qual_type)->desugar());
Greg Clayton99558cc42015-08-24 23:46:31 +00002228 default:
2229 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00002230 }
2231 // No DeclContext in this type...
2232 return nullptr;
2233}
2234
2235static bool
2236GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true)
2237{
2238 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2239 switch (type_class)
2240 {
2241 case clang::Type::ConstantArray:
2242 case clang::Type::IncompleteArray:
2243 case clang::Type::VariableArray:
2244 {
2245 const clang::ArrayType *array_type = llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
2246
2247 if (array_type)
2248 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
2249 }
2250 break;
2251
2252 case clang::Type::Record:
2253 case clang::Type::Enum:
2254 {
2255 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
2256 if (tag_type)
2257 {
2258 clang::TagDecl *tag_decl = tag_type->getDecl();
2259 if (tag_decl)
2260 {
2261 if (tag_decl->isCompleteDefinition())
2262 return true;
2263
2264 if (!allow_completion)
2265 return false;
2266
2267 if (tag_decl->hasExternalLexicalStorage())
2268 {
2269 if (ast)
2270 {
2271 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2272 if (external_ast_source)
2273 {
2274 external_ast_source->CompleteType(tag_decl);
2275 return !tag_type->isIncompleteType();
2276 }
2277 }
2278 }
2279 return false;
2280 }
2281 }
2282
2283 }
2284 break;
2285
2286 case clang::Type::ObjCObject:
2287 case clang::Type::ObjCInterface:
2288 {
2289 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
2290 if (objc_class_type)
2291 {
2292 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2293 // We currently can't complete objective C types through the newly added ASTContext
2294 // because it only supports TagDecl objects right now...
2295 if (class_interface_decl)
2296 {
2297 if (class_interface_decl->getDefinition())
2298 return true;
2299
2300 if (!allow_completion)
2301 return false;
2302
2303 if (class_interface_decl->hasExternalLexicalStorage())
2304 {
2305 if (ast)
2306 {
2307 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2308 if (external_ast_source)
2309 {
2310 external_ast_source->CompleteType (class_interface_decl);
2311 return !objc_class_type->isIncompleteType();
2312 }
2313 }
2314 }
2315 return false;
2316 }
2317 }
2318 }
2319 break;
2320
2321 case clang::Type::Typedef:
2322 return GetCompleteQualType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
2323
2324 case clang::Type::Elaborated:
2325 return GetCompleteQualType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType(), allow_completion);
2326
2327 case clang::Type::Paren:
2328 return GetCompleteQualType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar(), allow_completion);
2329
2330 default:
2331 break;
2332 }
2333
2334 return true;
2335}
2336
2337static clang::ObjCIvarDecl::AccessControl
2338ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
2339{
2340 switch (access)
2341 {
2342 case eAccessNone: return clang::ObjCIvarDecl::None;
2343 case eAccessPublic: return clang::ObjCIvarDecl::Public;
2344 case eAccessPrivate: return clang::ObjCIvarDecl::Private;
2345 case eAccessProtected: return clang::ObjCIvarDecl::Protected;
2346 case eAccessPackage: return clang::ObjCIvarDecl::Package;
2347 }
2348 return clang::ObjCIvarDecl::None;
2349}
2350
2351
2352//----------------------------------------------------------------------
2353// Tests
2354//----------------------------------------------------------------------
2355
2356bool
2357ClangASTContext::IsAggregateType (void* type)
2358{
2359 clang::QualType qual_type (GetCanonicalQualType(type));
2360
2361 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2362 switch (type_class)
2363 {
2364 case clang::Type::IncompleteArray:
2365 case clang::Type::VariableArray:
2366 case clang::Type::ConstantArray:
2367 case clang::Type::ExtVector:
2368 case clang::Type::Vector:
2369 case clang::Type::Record:
2370 case clang::Type::ObjCObject:
2371 case clang::Type::ObjCInterface:
2372 return true;
2373 case clang::Type::Elaborated:
2374 return IsAggregateType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2375 case clang::Type::Typedef:
2376 return IsAggregateType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2377 case clang::Type::Paren:
2378 return IsAggregateType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2379 default:
2380 break;
2381 }
2382 // The clang type does have a value
2383 return false;
2384}
2385
2386bool
2387ClangASTContext::IsArrayType (void* type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002388 CompilerType *element_type_ptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00002389 uint64_t *size,
2390 bool *is_incomplete)
2391{
2392 clang::QualType qual_type (GetCanonicalQualType(type));
2393
2394 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2395 switch (type_class)
2396 {
2397 default:
2398 break;
2399
2400 case clang::Type::ConstantArray:
2401 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002402 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::ConstantArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002403 if (size)
2404 *size = llvm::cast<clang::ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
2405 return true;
2406
2407 case clang::Type::IncompleteArray:
2408 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002409 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::IncompleteArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002410 if (size)
2411 *size = 0;
2412 if (is_incomplete)
2413 *is_incomplete = true;
2414 return true;
2415
2416 case clang::Type::VariableArray:
2417 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002418 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::VariableArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002419 if (size)
2420 *size = 0;
2421 return true;
2422
2423 case clang::Type::DependentSizedArray:
2424 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002425 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::DependentSizedArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002426 if (size)
2427 *size = 0;
2428 return true;
2429
2430 case clang::Type::Typedef:
2431 return IsArrayType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2432 element_type_ptr,
2433 size,
2434 is_incomplete);
2435 case clang::Type::Elaborated:
2436 return IsArrayType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2437 element_type_ptr,
2438 size,
2439 is_incomplete);
2440 case clang::Type::Paren:
2441 return IsArrayType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
2442 element_type_ptr,
2443 size,
2444 is_incomplete);
2445 }
2446 if (element_type_ptr)
2447 element_type_ptr->Clear();
2448 if (size)
2449 *size = 0;
2450 if (is_incomplete)
2451 *is_incomplete = false;
2452 return 0;
2453}
2454
2455bool
2456ClangASTContext::IsVectorType (void* type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002457 CompilerType *element_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00002458 uint64_t *size)
2459{
2460 clang::QualType qual_type (GetCanonicalQualType(type));
2461
2462 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2463 switch (type_class)
2464 {
2465 case clang::Type::Vector:
2466 {
2467 const clang::VectorType *vector_type = qual_type->getAs<clang::VectorType>();
2468 if (vector_type)
2469 {
2470 if (size)
2471 *size = vector_type->getNumElements();
2472 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002473 *element_type = CompilerType(getASTContext(), vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002474 }
2475 return true;
2476 }
2477 break;
2478 case clang::Type::ExtVector:
2479 {
2480 const clang::ExtVectorType *ext_vector_type = qual_type->getAs<clang::ExtVectorType>();
2481 if (ext_vector_type)
2482 {
2483 if (size)
2484 *size = ext_vector_type->getNumElements();
2485 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002486 *element_type = CompilerType(getASTContext(), ext_vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002487 }
2488 return true;
2489 }
2490 default:
2491 break;
2492 }
2493 return false;
2494}
2495
2496bool
2497ClangASTContext::IsRuntimeGeneratedType (void* type)
2498{
2499 clang::DeclContext* decl_ctx = ClangASTContext::GetASTContext(getASTContext())->GetDeclContextForType(GetQualType(type));
2500 if (!decl_ctx)
2501 return false;
2502
2503 if (!llvm::isa<clang::ObjCInterfaceDecl>(decl_ctx))
2504 return false;
2505
2506 clang::ObjCInterfaceDecl *result_iface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
2507
2508 ClangASTMetadata* ast_metadata = ClangASTContext::GetMetadata(getASTContext(), result_iface_decl);
2509 if (!ast_metadata)
2510 return false;
2511 return (ast_metadata->GetISAPtr() != 0);
2512}
2513
2514bool
2515ClangASTContext::IsCharType (void* type)
2516{
2517 return GetQualType(type).getUnqualifiedType()->isCharType();
2518}
2519
2520
2521bool
2522ClangASTContext::IsCompleteType (void* type)
2523{
2524 const bool allow_completion = false;
2525 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
2526}
2527
2528bool
2529ClangASTContext::IsConst(void* type)
2530{
2531 return GetQualType(type).isConstQualified();
2532}
2533
2534bool
2535ClangASTContext::IsCStringType (void* type, uint32_t &length)
2536{
Greg Claytona1e5dc82015-08-11 22:53:00 +00002537 CompilerType pointee_or_element_clang_type;
Greg Claytond8d4a572015-08-11 21:38:15 +00002538 length = 0;
2539 Flags type_flags (GetTypeInfo (type, &pointee_or_element_clang_type));
2540
2541 if (!pointee_or_element_clang_type.IsValid())
2542 return false;
2543
2544 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
2545 {
2546 if (pointee_or_element_clang_type.IsCharType())
2547 {
2548 if (type_flags.Test (eTypeIsArray))
2549 {
2550 // We know the size of the array and it could be a C string
2551 // since it is an array of characters
2552 length = llvm::cast<clang::ConstantArrayType>(GetCanonicalQualType(type).getTypePtr())->getSize().getLimitedValue();
2553 }
2554 return true;
2555
2556 }
2557 }
2558 return false;
2559}
2560
2561bool
2562ClangASTContext::IsFunctionType (void* type, bool *is_variadic_ptr)
2563{
2564 if (type)
2565 {
2566 clang::QualType qual_type (GetCanonicalQualType(type));
2567
2568 if (qual_type->isFunctionType())
2569 {
2570 if (is_variadic_ptr)
2571 {
2572 const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2573 if (function_proto_type)
2574 *is_variadic_ptr = function_proto_type->isVariadic();
2575 else
2576 *is_variadic_ptr = false;
2577 }
2578 return true;
2579 }
2580
2581 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2582 switch (type_class)
2583 {
2584 default:
2585 break;
2586 case clang::Type::Typedef:
2587 return IsFunctionType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), nullptr);
2588 case clang::Type::Elaborated:
2589 return IsFunctionType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), nullptr);
2590 case clang::Type::Paren:
2591 return IsFunctionType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), nullptr);
2592 case clang::Type::LValueReference:
2593 case clang::Type::RValueReference:
2594 {
2595 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2596 if (reference_type)
2597 return IsFunctionType(reference_type->getPointeeType().getAsOpaquePtr(), nullptr);
2598 }
2599 break;
2600 }
2601 }
2602 return false;
2603}
2604
2605// Used to detect "Homogeneous Floating-point Aggregates"
2606uint32_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00002607ClangASTContext::IsHomogeneousAggregate (void* type, CompilerType* base_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00002608{
2609 if (!type)
2610 return 0;
2611
2612 clang::QualType qual_type(GetCanonicalQualType(type));
2613 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2614 switch (type_class)
2615 {
2616 case clang::Type::Record:
2617 if (GetCompleteType (type))
2618 {
2619 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2620 if (cxx_record_decl)
2621 {
2622 if (cxx_record_decl->getNumBases() ||
2623 cxx_record_decl->isDynamicClass())
2624 return 0;
2625 }
2626 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
2627 if (record_type)
2628 {
2629 const clang::RecordDecl *record_decl = record_type->getDecl();
2630 if (record_decl)
2631 {
2632 // We are looking for a structure that contains only floating point types
2633 clang::RecordDecl::field_iterator field_pos, field_end = record_decl->field_end();
2634 uint32_t num_fields = 0;
2635 bool is_hva = false;
2636 bool is_hfa = false;
2637 clang::QualType base_qual_type;
2638 for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos)
2639 {
2640 clang::QualType field_qual_type = field_pos->getType();
2641 if (field_qual_type->isFloatingType())
2642 {
2643 if (field_qual_type->isComplexType())
2644 return 0;
2645 else
2646 {
2647 if (num_fields == 0)
2648 base_qual_type = field_qual_type;
2649 else
2650 {
2651 if (is_hva)
2652 return 0;
2653 is_hfa = true;
2654 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
2655 return 0;
2656 }
2657 }
2658 }
2659 else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType())
2660 {
2661 const clang::VectorType *array = field_qual_type.getTypePtr()->getAs<clang::VectorType>();
2662 if (array && array->getNumElements() <= 4)
2663 {
2664 if (num_fields == 0)
2665 base_qual_type = array->getElementType();
2666 else
2667 {
2668 if (is_hfa)
2669 return 0;
2670 is_hva = true;
2671 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
2672 return 0;
2673 }
2674 }
2675 else
2676 return 0;
2677 }
2678 else
2679 return 0;
2680 ++num_fields;
2681 }
2682 if (base_type_ptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002683 *base_type_ptr = CompilerType (getASTContext(), base_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00002684 return num_fields;
2685 }
2686 }
2687 }
2688 break;
2689
2690 case clang::Type::Typedef:
2691 return IsHomogeneousAggregate(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), base_type_ptr);
2692
2693 case clang::Type::Elaborated:
2694 return IsHomogeneousAggregate(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), base_type_ptr);
2695 default:
2696 break;
2697 }
2698 return 0;
2699}
2700
2701size_t
2702ClangASTContext::GetNumberOfFunctionArguments (void* type)
2703{
2704 if (type)
2705 {
2706 clang::QualType qual_type (GetCanonicalQualType(type));
2707 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2708 if (func)
2709 return func->getNumParams();
2710 }
2711 return 0;
2712}
2713
Greg Claytona1e5dc82015-08-11 22:53:00 +00002714CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00002715ClangASTContext::GetFunctionArgumentAtIndex (void* type, const size_t index)
2716{
2717 if (type)
2718 {
2719 clang::QualType qual_type (GetCanonicalQualType(type));
2720 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2721 if (func)
2722 {
2723 if (index < func->getNumParams())
Greg Claytona1e5dc82015-08-11 22:53:00 +00002724 return CompilerType(getASTContext(), func->getParamType(index));
Greg Claytond8d4a572015-08-11 21:38:15 +00002725 }
2726 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002727 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00002728}
2729
2730bool
2731ClangASTContext::IsFunctionPointerType (void* type)
2732{
2733 if (type)
2734 {
2735 clang::QualType qual_type (GetCanonicalQualType(type));
2736
2737 if (qual_type->isFunctionPointerType())
2738 return true;
2739
2740 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2741 switch (type_class)
2742 {
2743 default:
2744 break;
2745 case clang::Type::Typedef:
2746 return IsFunctionPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2747 case clang::Type::Elaborated:
2748 return IsFunctionPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2749 case clang::Type::Paren:
2750 return IsFunctionPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2751
2752 case clang::Type::LValueReference:
2753 case clang::Type::RValueReference:
2754 {
2755 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2756 if (reference_type)
2757 return IsFunctionPointerType(reference_type->getPointeeType().getAsOpaquePtr());
2758 }
2759 break;
2760 }
2761 }
2762 return false;
2763
2764}
2765
2766bool
2767ClangASTContext::IsIntegerType (void* type, bool &is_signed)
2768{
2769 if (!type)
2770 return false;
2771
2772 clang::QualType qual_type (GetCanonicalQualType(type));
2773 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
2774
2775 if (builtin_type)
2776 {
2777 if (builtin_type->isInteger())
2778 {
2779 is_signed = builtin_type->isSignedInteger();
2780 return true;
2781 }
2782 }
2783
2784 return false;
2785}
2786
2787bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00002788ClangASTContext::IsPointerType (void* type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002789{
2790 if (type)
2791 {
2792 clang::QualType qual_type (GetCanonicalQualType(type));
2793 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2794 switch (type_class)
2795 {
2796 case clang::Type::Builtin:
2797 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
2798 {
2799 default:
2800 break;
2801 case clang::BuiltinType::ObjCId:
2802 case clang::BuiltinType::ObjCClass:
2803 return true;
2804 }
2805 return false;
2806 case clang::Type::ObjCObjectPointer:
2807 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002808 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002809 return true;
2810 case clang::Type::BlockPointer:
2811 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002812 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002813 return true;
2814 case clang::Type::Pointer:
2815 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002816 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002817 return true;
2818 case clang::Type::MemberPointer:
2819 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002820 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002821 return true;
2822 case clang::Type::Typedef:
2823 return IsPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
2824 case clang::Type::Elaborated:
2825 return IsPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
2826 case clang::Type::Paren:
2827 return IsPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
2828 default:
2829 break;
2830 }
2831 }
2832 if (pointee_type)
2833 pointee_type->Clear();
2834 return false;
2835}
2836
2837
2838bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00002839ClangASTContext::IsPointerOrReferenceType (void* type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002840{
2841 if (type)
2842 {
2843 clang::QualType qual_type (GetCanonicalQualType(type));
2844 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2845 switch (type_class)
2846 {
2847 case clang::Type::Builtin:
2848 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
2849 {
2850 default:
2851 break;
2852 case clang::BuiltinType::ObjCId:
2853 case clang::BuiltinType::ObjCClass:
2854 return true;
2855 }
2856 return false;
2857 case clang::Type::ObjCObjectPointer:
2858 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002859 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002860 return true;
2861 case clang::Type::BlockPointer:
2862 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002863 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002864 return true;
2865 case clang::Type::Pointer:
2866 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002867 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002868 return true;
2869 case clang::Type::MemberPointer:
2870 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002871 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002872 return true;
2873 case clang::Type::LValueReference:
2874 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002875 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00002876 return true;
2877 case clang::Type::RValueReference:
2878 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002879 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00002880 return true;
2881 case clang::Type::Typedef:
2882 return IsPointerOrReferenceType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
2883 case clang::Type::Elaborated:
2884 return IsPointerOrReferenceType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
2885 case clang::Type::Paren:
2886 return IsPointerOrReferenceType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
2887 default:
2888 break;
2889 }
2890 }
2891 if (pointee_type)
2892 pointee_type->Clear();
2893 return false;
2894}
2895
2896
2897bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00002898ClangASTContext::IsReferenceType (void* type, CompilerType *pointee_type, bool* is_rvalue)
Greg Claytond8d4a572015-08-11 21:38:15 +00002899{
2900 if (type)
2901 {
2902 clang::QualType qual_type (GetCanonicalQualType(type));
2903 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2904
2905 switch (type_class)
2906 {
2907 case clang::Type::LValueReference:
2908 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002909 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00002910 if (is_rvalue)
2911 *is_rvalue = false;
2912 return true;
2913 case clang::Type::RValueReference:
2914 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00002915 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00002916 if (is_rvalue)
2917 *is_rvalue = true;
2918 return true;
2919 case clang::Type::Typedef:
2920 return IsReferenceType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type, is_rvalue);
2921 case clang::Type::Elaborated:
2922 return IsReferenceType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type, is_rvalue);
2923 case clang::Type::Paren:
2924 return IsReferenceType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type, is_rvalue);
2925
2926 default:
2927 break;
2928 }
2929 }
2930 if (pointee_type)
2931 pointee_type->Clear();
2932 return false;
2933}
2934
2935bool
2936ClangASTContext::IsFloatingPointType (void* type, uint32_t &count, bool &is_complex)
2937{
2938 if (type)
2939 {
2940 clang::QualType qual_type (GetCanonicalQualType(type));
2941
2942 if (const clang::BuiltinType *BT = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal()))
2943 {
2944 clang::BuiltinType::Kind kind = BT->getKind();
2945 if (kind >= clang::BuiltinType::Float && kind <= clang::BuiltinType::LongDouble)
2946 {
2947 count = 1;
2948 is_complex = false;
2949 return true;
2950 }
2951 }
2952 else if (const clang::ComplexType *CT = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal()))
2953 {
2954 if (IsFloatingPointType (CT->getElementType().getAsOpaquePtr(), count, is_complex))
2955 {
2956 count = 2;
2957 is_complex = true;
2958 return true;
2959 }
2960 }
2961 else if (const clang::VectorType *VT = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal()))
2962 {
2963 if (IsFloatingPointType (VT->getElementType().getAsOpaquePtr(), count, is_complex))
2964 {
2965 count = VT->getNumElements();
2966 is_complex = false;
2967 return true;
2968 }
2969 }
2970 }
2971 count = 0;
2972 is_complex = false;
2973 return false;
2974}
2975
2976
2977bool
2978ClangASTContext::IsDefined(void* type)
2979{
2980 if (!type)
2981 return false;
2982
2983 clang::QualType qual_type(GetQualType(type));
2984 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
2985 if (tag_type)
2986 {
2987 clang::TagDecl *tag_decl = tag_type->getDecl();
2988 if (tag_decl)
2989 return tag_decl->isCompleteDefinition();
2990 return false;
2991 }
2992 else
2993 {
2994 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
2995 if (objc_class_type)
2996 {
2997 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2998 if (class_interface_decl)
2999 return class_interface_decl->getDefinition() != nullptr;
3000 return false;
3001 }
3002 }
3003 return true;
3004}
3005
3006bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003007ClangASTContext::IsObjCClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003008{
3009 if (type)
3010 {
3011 clang::QualType qual_type (GetCanonicalQualType(type));
3012
3013 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3014
3015 if (obj_pointer_type)
3016 return obj_pointer_type->isObjCClassType();
3017 }
3018 return false;
3019}
3020
3021bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003022ClangASTContext::IsObjCObjectOrInterfaceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003023{
Ryan Brown57bee1e2015-09-14 22:45:11 +00003024 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00003025 return GetCanonicalQualType(type)->isObjCObjectOrInterfaceType();
3026 return false;
3027}
3028
3029bool
3030ClangASTContext::IsPolymorphicClass (void* type)
3031{
3032 if (type)
3033 {
3034 clang::QualType qual_type(GetCanonicalQualType(type));
3035 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3036 switch (type_class)
3037 {
3038 case clang::Type::Record:
3039 if (GetCompleteType(type))
3040 {
3041 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3042 const clang::RecordDecl *record_decl = record_type->getDecl();
3043 if (record_decl)
3044 {
3045 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3046 if (cxx_record_decl)
3047 return cxx_record_decl->isPolymorphic();
3048 }
3049 }
3050 break;
3051
3052 default:
3053 break;
3054 }
3055 }
3056 return false;
3057}
3058
3059bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003060ClangASTContext::IsPossibleDynamicType (void* type, CompilerType *dynamic_pointee_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00003061 bool check_cplusplus,
3062 bool check_objc)
3063{
3064 clang::QualType pointee_qual_type;
3065 if (type)
3066 {
3067 clang::QualType qual_type (GetCanonicalQualType(type));
3068 bool success = false;
3069 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3070 switch (type_class)
3071 {
3072 case clang::Type::Builtin:
3073 if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
3074 {
3075 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003076 dynamic_pointee_type->SetCompilerType(this, type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003077 return true;
3078 }
3079 break;
3080
3081 case clang::Type::ObjCObjectPointer:
3082 if (check_objc)
3083 {
3084 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003085 dynamic_pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003086 return true;
3087 }
3088 break;
3089
3090 case clang::Type::Pointer:
3091 pointee_qual_type = llvm::cast<clang::PointerType>(qual_type)->getPointeeType();
3092 success = true;
3093 break;
3094
3095 case clang::Type::LValueReference:
3096 case clang::Type::RValueReference:
3097 pointee_qual_type = llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType();
3098 success = true;
3099 break;
3100
3101 case clang::Type::Typedef:
3102 return IsPossibleDynamicType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3103 dynamic_pointee_type,
3104 check_cplusplus,
3105 check_objc);
3106
3107 case clang::Type::Elaborated:
3108 return IsPossibleDynamicType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3109 dynamic_pointee_type,
3110 check_cplusplus,
3111 check_objc);
3112
3113 case clang::Type::Paren:
3114 return IsPossibleDynamicType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
3115 dynamic_pointee_type,
3116 check_cplusplus,
3117 check_objc);
3118 default:
3119 break;
3120 }
3121
3122 if (success)
3123 {
3124 // Check to make sure what we are pointing too is a possible dynamic C++ type
3125 // We currently accept any "void *" (in case we have a class that has been
3126 // watered down to an opaque pointer) and virtual C++ classes.
3127 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
3128 switch (pointee_type_class)
3129 {
3130 case clang::Type::Builtin:
3131 switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind())
3132 {
3133 case clang::BuiltinType::UnknownAny:
3134 case clang::BuiltinType::Void:
3135 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003136 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003137 return true;
3138
3139 case clang::BuiltinType::NullPtr:
3140 case clang::BuiltinType::Bool:
3141 case clang::BuiltinType::Char_U:
3142 case clang::BuiltinType::UChar:
3143 case clang::BuiltinType::WChar_U:
3144 case clang::BuiltinType::Char16:
3145 case clang::BuiltinType::Char32:
3146 case clang::BuiltinType::UShort:
3147 case clang::BuiltinType::UInt:
3148 case clang::BuiltinType::ULong:
3149 case clang::BuiltinType::ULongLong:
3150 case clang::BuiltinType::UInt128:
3151 case clang::BuiltinType::Char_S:
3152 case clang::BuiltinType::SChar:
3153 case clang::BuiltinType::WChar_S:
3154 case clang::BuiltinType::Short:
3155 case clang::BuiltinType::Int:
3156 case clang::BuiltinType::Long:
3157 case clang::BuiltinType::LongLong:
3158 case clang::BuiltinType::Int128:
3159 case clang::BuiltinType::Float:
3160 case clang::BuiltinType::Double:
3161 case clang::BuiltinType::LongDouble:
3162 case clang::BuiltinType::Dependent:
3163 case clang::BuiltinType::Overload:
3164 case clang::BuiltinType::ObjCId:
3165 case clang::BuiltinType::ObjCClass:
3166 case clang::BuiltinType::ObjCSel:
3167 case clang::BuiltinType::BoundMember:
3168 case clang::BuiltinType::Half:
3169 case clang::BuiltinType::ARCUnbridgedCast:
3170 case clang::BuiltinType::PseudoObject:
3171 case clang::BuiltinType::BuiltinFn:
3172 case clang::BuiltinType::OCLEvent:
3173 case clang::BuiltinType::OCLImage1d:
3174 case clang::BuiltinType::OCLImage1dArray:
3175 case clang::BuiltinType::OCLImage1dBuffer:
3176 case clang::BuiltinType::OCLImage2d:
3177 case clang::BuiltinType::OCLImage2dArray:
3178 case clang::BuiltinType::OCLImage3d:
3179 case clang::BuiltinType::OCLSampler:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00003180 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00003181 break;
3182 }
3183 break;
3184
3185 case clang::Type::Record:
3186 if (check_cplusplus)
3187 {
3188 clang::CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
3189 if (cxx_record_decl)
3190 {
3191 bool is_complete = cxx_record_decl->isCompleteDefinition();
3192
3193 if (is_complete)
3194 success = cxx_record_decl->isDynamicClass();
3195 else
3196 {
3197 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), cxx_record_decl);
3198 if (metadata)
3199 success = metadata->GetIsDynamicCXXType();
3200 else
3201 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00003202 is_complete = CompilerType(getASTContext(), pointee_qual_type).GetCompleteType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003203 if (is_complete)
3204 success = cxx_record_decl->isDynamicClass();
3205 else
3206 success = false;
3207 }
3208 }
3209
3210 if (success)
3211 {
3212 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003213 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003214 return true;
3215 }
3216 }
3217 }
3218 break;
3219
3220 case clang::Type::ObjCObject:
3221 case clang::Type::ObjCInterface:
3222 if (check_objc)
3223 {
3224 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003225 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003226 return true;
3227 }
3228 break;
3229
3230 default:
3231 break;
3232 }
3233 }
3234 }
3235 if (dynamic_pointee_type)
3236 dynamic_pointee_type->Clear();
3237 return false;
3238}
3239
3240
3241bool
3242ClangASTContext::IsScalarType (void* type)
3243{
3244 if (!type)
3245 return false;
3246
3247 return (GetTypeInfo (type, nullptr) & eTypeIsScalar) != 0;
3248}
3249
3250bool
3251ClangASTContext::IsTypedefType (void* type)
3252{
3253 if (!type)
3254 return false;
3255 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
3256}
3257
3258bool
3259ClangASTContext::IsVoidType (void* type)
3260{
3261 if (!type)
3262 return false;
3263 return GetCanonicalQualType(type)->isVoidType();
3264}
3265
3266bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003267ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003268{
3269 if (type)
3270 {
3271 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003272 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00003273 {
Ryan Brown57bee1e2015-09-14 22:45:11 +00003274 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3275 if (cxx_record_decl)
3276 {
3277 class_name.assign(cxx_record_decl->getIdentifier()->getNameStart());
3278 return true;
3279 }
Greg Claytond8d4a572015-08-11 21:38:15 +00003280 }
3281 }
3282 class_name.clear();
3283 return false;
3284}
3285
3286
3287bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003288ClangASTContext::IsCXXClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003289{
3290 if (!type)
3291 return false;
3292
3293 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003294 if (!qual_type.isNull() && qual_type->getAsCXXRecordDecl() != nullptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003295 return true;
3296 return false;
3297}
3298
3299bool
3300ClangASTContext::IsBeingDefined (void* type)
3301{
3302 if (!type)
3303 return false;
3304 clang::QualType qual_type (GetCanonicalQualType(type));
3305 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
3306 if (tag_type)
3307 return tag_type->isBeingDefined();
3308 return false;
3309}
3310
3311bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003312ClangASTContext::IsObjCObjectPointerType (const CompilerType& type, CompilerType *class_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003313{
3314 if (!type)
3315 return false;
3316
3317 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003318
3319 if (!qual_type.isNull() && qual_type->isObjCObjectPointerType())
Greg Claytond8d4a572015-08-11 21:38:15 +00003320 {
3321 if (class_type_ptr)
3322 {
3323 if (!qual_type->isObjCClassType() &&
3324 !qual_type->isObjCIdType())
3325 {
3326 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3327 if (obj_pointer_type == nullptr)
3328 class_type_ptr->Clear();
3329 else
Greg Clayton99558cc42015-08-24 23:46:31 +00003330 class_type_ptr->SetCompilerType (type.GetTypeSystem(), clang::QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003331 }
3332 }
3333 return true;
3334 }
3335 if (class_type_ptr)
3336 class_type_ptr->Clear();
3337 return false;
3338}
3339
3340bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003341ClangASTContext::GetObjCClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003342{
3343 if (!type)
3344 return false;
3345
3346 clang::QualType qual_type (GetCanonicalQualType(type));
3347
3348 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3349 if (object_type)
3350 {
3351 const clang::ObjCInterfaceDecl *interface = object_type->getInterface();
3352 if (interface)
3353 {
3354 class_name = interface->getNameAsString();
3355 return true;
3356 }
3357 }
3358 return false;
3359}
3360
3361
3362//----------------------------------------------------------------------
3363// Type Completion
3364//----------------------------------------------------------------------
3365
3366bool
3367ClangASTContext::GetCompleteType (void* type)
3368{
3369 if (!type)
3370 return false;
3371 const bool allow_completion = true;
3372 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
3373}
3374
3375ConstString
3376ClangASTContext::GetTypeName (void* type)
3377{
3378 std::string type_name;
3379 if (type)
3380 {
3381 clang::PrintingPolicy printing_policy (getASTContext()->getPrintingPolicy());
3382 clang::QualType qual_type(GetQualType(type));
3383 printing_policy.SuppressTagKeyword = true;
3384 printing_policy.LangOpts.WChar = true;
3385 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
3386 if (typedef_type)
3387 {
3388 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
3389 type_name = typedef_decl->getQualifiedNameAsString();
3390 }
3391 else
3392 {
3393 type_name = qual_type.getAsString(printing_policy);
3394 }
3395 }
3396 return ConstString(type_name);
3397}
3398
3399uint32_t
Greg Claytona1e5dc82015-08-11 22:53:00 +00003400ClangASTContext::GetTypeInfo (void* type, CompilerType *pointee_or_element_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003401{
3402 if (!type)
3403 return 0;
3404
3405 if (pointee_or_element_clang_type)
3406 pointee_or_element_clang_type->Clear();
3407
3408 clang::QualType qual_type (GetQualType(type));
3409
3410 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3411 switch (type_class)
3412 {
3413 case clang::Type::Builtin:
3414 {
3415 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3416
3417 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
3418 switch (builtin_type->getKind())
3419 {
3420 case clang::BuiltinType::ObjCId:
3421 case clang::BuiltinType::ObjCClass:
3422 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003423 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003424 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3425 break;
3426
3427 case clang::BuiltinType::ObjCSel:
3428 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003429 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->CharTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003430 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3431 break;
3432
3433 case clang::BuiltinType::Bool:
3434 case clang::BuiltinType::Char_U:
3435 case clang::BuiltinType::UChar:
3436 case clang::BuiltinType::WChar_U:
3437 case clang::BuiltinType::Char16:
3438 case clang::BuiltinType::Char32:
3439 case clang::BuiltinType::UShort:
3440 case clang::BuiltinType::UInt:
3441 case clang::BuiltinType::ULong:
3442 case clang::BuiltinType::ULongLong:
3443 case clang::BuiltinType::UInt128:
3444 case clang::BuiltinType::Char_S:
3445 case clang::BuiltinType::SChar:
3446 case clang::BuiltinType::WChar_S:
3447 case clang::BuiltinType::Short:
3448 case clang::BuiltinType::Int:
3449 case clang::BuiltinType::Long:
3450 case clang::BuiltinType::LongLong:
3451 case clang::BuiltinType::Int128:
3452 case clang::BuiltinType::Float:
3453 case clang::BuiltinType::Double:
3454 case clang::BuiltinType::LongDouble:
3455 builtin_type_flags |= eTypeIsScalar;
3456 if (builtin_type->isInteger())
3457 {
3458 builtin_type_flags |= eTypeIsInteger;
3459 if (builtin_type->isSignedInteger())
3460 builtin_type_flags |= eTypeIsSigned;
3461 }
3462 else if (builtin_type->isFloatingPoint())
3463 builtin_type_flags |= eTypeIsFloat;
3464 break;
3465 default:
3466 break;
3467 }
3468 return builtin_type_flags;
3469 }
3470
3471 case clang::Type::BlockPointer:
3472 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003473 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003474 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3475
3476 case clang::Type::Complex:
3477 {
3478 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3479 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal());
3480 if (complex_type)
3481 {
3482 clang::QualType complex_element_type (complex_type->getElementType());
3483 if (complex_element_type->isIntegerType())
3484 complex_type_flags |= eTypeIsFloat;
3485 else if (complex_element_type->isFloatingType())
3486 complex_type_flags |= eTypeIsInteger;
3487 }
3488 return complex_type_flags;
3489 }
3490 break;
3491
3492 case clang::Type::ConstantArray:
3493 case clang::Type::DependentSizedArray:
3494 case clang::Type::IncompleteArray:
3495 case clang::Type::VariableArray:
3496 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003497 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ArrayType>(qual_type.getTypePtr())->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003498 return eTypeHasChildren | eTypeIsArray;
3499
3500 case clang::Type::DependentName: return 0;
3501 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
3502 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
3503 case clang::Type::Decltype: return 0;
3504
3505 case clang::Type::Enum:
3506 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003507 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::EnumType>(qual_type)->getDecl()->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003508 return eTypeIsEnumeration | eTypeHasValue;
3509
3510 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003511 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003512 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003513 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003514
3515 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
3516 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
3517 case clang::Type::InjectedClassName: return 0;
3518
3519 case clang::Type::LValueReference:
3520 case clang::Type::RValueReference:
3521 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003522 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003523 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3524
3525 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
3526
3527 case clang::Type::ObjCObjectPointer:
3528 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003529 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003530 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
3531
3532 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3533 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3534
3535 case clang::Type::Pointer:
3536 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003537 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003538 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3539
3540 case clang::Type::Record:
3541 if (qual_type->getAsCXXRecordDecl())
3542 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3543 else
3544 return eTypeHasChildren | eTypeIsStructUnion;
3545 break;
3546 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
3547 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
3548 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
3549
3550 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003551 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 +00003552 case clang::Type::TypeOfExpr: return 0;
3553 case clang::Type::TypeOf: return 0;
3554 case clang::Type::UnresolvedUsing: return 0;
3555
3556 case clang::Type::ExtVector:
3557 case clang::Type::Vector:
3558 {
3559 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
3560 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal());
3561 if (vector_type)
3562 {
3563 if (vector_type->isIntegerType())
3564 vector_type_flags |= eTypeIsFloat;
3565 else if (vector_type->isFloatingType())
3566 vector_type_flags |= eTypeIsInteger;
3567 }
3568 return vector_type_flags;
3569 }
3570 default: return 0;
3571 }
3572 return 0;
3573}
3574
3575
3576
3577lldb::LanguageType
3578ClangASTContext::GetMinimumLanguage (void* type)
3579{
3580 if (!type)
3581 return lldb::eLanguageTypeC;
3582
3583 // If the type is a reference, then resolve it to what it refers to first:
3584 clang::QualType qual_type (GetCanonicalQualType(type).getNonReferenceType());
3585 if (qual_type->isAnyPointerType())
3586 {
3587 if (qual_type->isObjCObjectPointerType())
3588 return lldb::eLanguageTypeObjC;
3589
3590 clang::QualType pointee_type (qual_type->getPointeeType());
3591 if (pointee_type->getPointeeCXXRecordDecl() != nullptr)
3592 return lldb::eLanguageTypeC_plus_plus;
3593 if (pointee_type->isObjCObjectOrInterfaceType())
3594 return lldb::eLanguageTypeObjC;
3595 if (pointee_type->isObjCClassType())
3596 return lldb::eLanguageTypeObjC;
3597 if (pointee_type.getTypePtr() == getASTContext()->ObjCBuiltinIdTy.getTypePtr())
3598 return lldb::eLanguageTypeObjC;
3599 }
3600 else
3601 {
3602 if (qual_type->isObjCObjectOrInterfaceType())
3603 return lldb::eLanguageTypeObjC;
3604 if (qual_type->getAsCXXRecordDecl())
3605 return lldb::eLanguageTypeC_plus_plus;
3606 switch (qual_type->getTypeClass())
3607 {
3608 default:
3609 break;
3610 case clang::Type::Builtin:
3611 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3612 {
3613 default:
3614 case clang::BuiltinType::Void:
3615 case clang::BuiltinType::Bool:
3616 case clang::BuiltinType::Char_U:
3617 case clang::BuiltinType::UChar:
3618 case clang::BuiltinType::WChar_U:
3619 case clang::BuiltinType::Char16:
3620 case clang::BuiltinType::Char32:
3621 case clang::BuiltinType::UShort:
3622 case clang::BuiltinType::UInt:
3623 case clang::BuiltinType::ULong:
3624 case clang::BuiltinType::ULongLong:
3625 case clang::BuiltinType::UInt128:
3626 case clang::BuiltinType::Char_S:
3627 case clang::BuiltinType::SChar:
3628 case clang::BuiltinType::WChar_S:
3629 case clang::BuiltinType::Short:
3630 case clang::BuiltinType::Int:
3631 case clang::BuiltinType::Long:
3632 case clang::BuiltinType::LongLong:
3633 case clang::BuiltinType::Int128:
3634 case clang::BuiltinType::Float:
3635 case clang::BuiltinType::Double:
3636 case clang::BuiltinType::LongDouble:
3637 break;
3638
3639 case clang::BuiltinType::NullPtr:
3640 return eLanguageTypeC_plus_plus;
3641
3642 case clang::BuiltinType::ObjCId:
3643 case clang::BuiltinType::ObjCClass:
3644 case clang::BuiltinType::ObjCSel:
3645 return eLanguageTypeObjC;
3646
3647 case clang::BuiltinType::Dependent:
3648 case clang::BuiltinType::Overload:
3649 case clang::BuiltinType::BoundMember:
3650 case clang::BuiltinType::UnknownAny:
3651 break;
3652 }
3653 break;
3654 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003655 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
Greg Claytond8d4a572015-08-11 21:38:15 +00003656 }
3657 }
3658 return lldb::eLanguageTypeC;
3659}
3660
3661lldb::TypeClass
3662ClangASTContext::GetTypeClass (void* type)
3663{
3664 if (!type)
3665 return lldb::eTypeClassInvalid;
3666
3667 clang::QualType qual_type(GetQualType(type));
3668
3669 switch (qual_type->getTypeClass())
3670 {
3671 case clang::Type::UnaryTransform: break;
3672 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
3673 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
3674 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
3675 case clang::Type::VariableArray: return lldb::eTypeClassArray;
3676 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
3677 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
3678 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
3679 case clang::Type::ExtVector: return lldb::eTypeClassVector;
3680 case clang::Type::Vector: return lldb::eTypeClassVector;
3681 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
3682 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
3683 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
3684 case clang::Type::Pointer: return lldb::eTypeClassPointer;
3685 case clang::Type::LValueReference: return lldb::eTypeClassReference;
3686 case clang::Type::RValueReference: return lldb::eTypeClassReference;
3687 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
3688 case clang::Type::Complex:
3689 if (qual_type->isComplexType())
3690 return lldb::eTypeClassComplexFloat;
3691 else
3692 return lldb::eTypeClassComplexInteger;
3693 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
3694 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
3695 case clang::Type::Record:
3696 {
3697 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3698 const clang::RecordDecl *record_decl = record_type->getDecl();
3699 if (record_decl->isUnion())
3700 return lldb::eTypeClassUnion;
3701 else if (record_decl->isStruct())
3702 return lldb::eTypeClassStruct;
3703 else
3704 return lldb::eTypeClassClass;
3705 }
3706 break;
3707 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
3708 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
3709 case clang::Type::UnresolvedUsing: break;
3710 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003711 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003712 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003713 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003714
3715 case clang::Type::Attributed: break;
3716 case clang::Type::TemplateTypeParm: break;
3717 case clang::Type::SubstTemplateTypeParm: break;
3718 case clang::Type::SubstTemplateTypeParmPack:break;
3719 case clang::Type::Auto: break;
3720 case clang::Type::InjectedClassName: break;
3721 case clang::Type::DependentName: break;
3722 case clang::Type::DependentTemplateSpecialization: break;
3723 case clang::Type::PackExpansion: break;
3724
3725 case clang::Type::TypeOfExpr: break;
3726 case clang::Type::TypeOf: break;
3727 case clang::Type::Decltype: break;
3728 case clang::Type::TemplateSpecialization: break;
3729 case clang::Type::Atomic: break;
3730
3731 // pointer type decayed from an array or function type.
3732 case clang::Type::Decayed: break;
3733 case clang::Type::Adjusted: break;
3734 }
3735 // We don't know hot to display this type...
3736 return lldb::eTypeClassOther;
3737
3738}
3739
3740unsigned
3741ClangASTContext::GetTypeQualifiers(void* type)
3742{
3743 if (type)
3744 return GetQualType(type).getQualifiers().getCVRQualifiers();
3745 return 0;
3746}
3747
3748//----------------------------------------------------------------------
3749// Creating related types
3750//----------------------------------------------------------------------
3751
Greg Claytona1e5dc82015-08-11 22:53:00 +00003752CompilerType
3753ClangASTContext::AddConstModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003754{
Ryan Brown57bee1e2015-09-14 22:45:11 +00003755 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00003756 {
Greg Claytonf73034f2015-09-08 18:15:05 +00003757 // Make sure this type is a clang AST type
Greg Claytond8d4a572015-08-11 21:38:15 +00003758 clang::QualType result(GetQualType(type));
3759 result.addConst();
Greg Claytona1e5dc82015-08-11 22:53:00 +00003760 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003761 }
Greg Claytonf73034f2015-09-08 18:15:05 +00003762
Greg Claytona1e5dc82015-08-11 22:53:00 +00003763 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003764}
3765
Greg Claytona1e5dc82015-08-11 22:53:00 +00003766CompilerType
3767ClangASTContext::AddRestrictModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003768{
Ryan Brown57bee1e2015-09-14 22:45:11 +00003769 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00003770 {
3771 clang::QualType result(GetQualType(type));
3772 result.getQualifiers().setRestrict (true);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003773 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003774 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003775 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003776}
3777
Greg Claytona1e5dc82015-08-11 22:53:00 +00003778CompilerType
3779ClangASTContext::AddVolatileModifier (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003780{
Ryan Brown57bee1e2015-09-14 22:45:11 +00003781 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00003782 {
3783 clang::QualType result(GetQualType(type));
3784 result.getQualifiers().setVolatile (true);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003785 return CompilerType (type.GetTypeSystem(), result.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003786 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003787 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003788}
3789
Greg Claytona1e5dc82015-08-11 22:53:00 +00003790CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003791ClangASTContext::GetArrayElementType (void* type, uint64_t *stride)
3792{
3793 if (type)
3794 {
3795 clang::QualType qual_type(GetCanonicalQualType(type));
3796
3797 const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
3798
3799 if (!array_eletype)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003800 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003801
Greg Claytona1e5dc82015-08-11 22:53:00 +00003802 CompilerType element_type (getASTContext(), array_eletype->getCanonicalTypeUnqualified());
Greg Claytond8d4a572015-08-11 21:38:15 +00003803
3804 // TODO: the real stride will be >= this value.. find the real one!
3805 if (stride)
3806 *stride = element_type.GetByteSize(nullptr);
3807
3808 return element_type;
3809
3810 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003811 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003812}
3813
Greg Claytona1e5dc82015-08-11 22:53:00 +00003814CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003815ClangASTContext::GetCanonicalType (void* type)
3816{
3817 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003818 return CompilerType (getASTContext(), GetCanonicalQualType(type));
3819 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003820}
3821
3822static clang::QualType
3823GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
3824{
3825 if (qual_type->isPointerType())
3826 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
3827 else
3828 qual_type = qual_type.getUnqualifiedType();
3829 qual_type.removeLocalConst();
3830 qual_type.removeLocalRestrict();
3831 qual_type.removeLocalVolatile();
3832 return qual_type;
3833}
3834
Greg Claytona1e5dc82015-08-11 22:53:00 +00003835CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003836ClangASTContext::GetFullyUnqualifiedType (void* type)
3837{
3838 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003839 return CompilerType(getASTContext(), GetFullyUnqualifiedType_Impl(getASTContext(), GetQualType(type)));
3840 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003841}
3842
3843
3844int
3845ClangASTContext::GetFunctionArgumentCount (void* type)
3846{
3847 if (type)
3848 {
3849 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3850 if (func)
3851 return func->getNumParams();
3852 }
3853 return -1;
3854}
3855
Greg Claytona1e5dc82015-08-11 22:53:00 +00003856CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003857ClangASTContext::GetFunctionArgumentTypeAtIndex (void* type, size_t idx)
3858{
3859 if (type)
3860 {
3861 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3862 if (func)
3863 {
3864 const uint32_t num_args = func->getNumParams();
3865 if (idx < num_args)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003866 return CompilerType(getASTContext(), func->getParamType(idx));
Greg Claytond8d4a572015-08-11 21:38:15 +00003867 }
3868 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003869 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003870}
3871
Greg Claytona1e5dc82015-08-11 22:53:00 +00003872CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00003873ClangASTContext::GetFunctionReturnType (void* type)
3874{
3875 if (type)
3876 {
3877 clang::QualType qual_type(GetCanonicalQualType(type));
3878 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3879 if (func)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003880 return CompilerType(getASTContext(), func->getReturnType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003881 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003882 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003883}
3884
3885size_t
3886ClangASTContext::GetNumMemberFunctions (void* type)
3887{
3888 size_t num_functions = 0;
3889 if (type)
3890 {
3891 clang::QualType qual_type(GetCanonicalQualType(type));
3892 switch (qual_type->getTypeClass()) {
3893 case clang::Type::Record:
3894 if (GetCompleteQualType (getASTContext(), qual_type))
3895 {
3896 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3897 const clang::RecordDecl *record_decl = record_type->getDecl();
3898 assert(record_decl);
3899 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3900 if (cxx_record_decl)
3901 num_functions = std::distance(cxx_record_decl->method_begin(), cxx_record_decl->method_end());
3902 }
3903 break;
3904
3905 case clang::Type::ObjCObjectPointer:
3906 if (GetCompleteType(type))
3907 {
3908 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
3909 if (objc_class_type)
3910 {
3911 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
3912 if (class_interface_decl)
3913 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
3914 }
3915 }
3916 break;
3917
3918 case clang::Type::ObjCObject:
3919 case clang::Type::ObjCInterface:
3920 if (GetCompleteType(type))
3921 {
3922 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
3923 if (objc_class_type)
3924 {
3925 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3926 if (class_interface_decl)
3927 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
3928 }
3929 }
3930 break;
3931
3932
3933 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003934 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00003935
3936 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003937 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00003938
3939 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003940 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00003941
3942 default:
3943 break;
3944 }
3945 }
3946 return num_functions;
3947}
3948
3949TypeMemberFunctionImpl
3950ClangASTContext::GetMemberFunctionAtIndex (void* type, size_t idx)
3951{
3952 std::string name("");
3953 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
Greg Claytona1e5dc82015-08-11 22:53:00 +00003954 CompilerType clang_type{};
Greg Claytond8d4a572015-08-11 21:38:15 +00003955 clang::ObjCMethodDecl *method_decl(nullptr);
3956 if (type)
3957 {
3958 clang::QualType qual_type(GetCanonicalQualType(type));
3959 switch (qual_type->getTypeClass()) {
3960 case clang::Type::Record:
3961 if (GetCompleteQualType (getASTContext(), qual_type))
3962 {
3963 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3964 const clang::RecordDecl *record_decl = record_type->getDecl();
3965 assert(record_decl);
3966 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3967 if (cxx_record_decl)
3968 {
3969 auto method_iter = cxx_record_decl->method_begin();
3970 auto method_end = cxx_record_decl->method_end();
3971 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
3972 {
3973 std::advance(method_iter, idx);
3974 auto method_decl = method_iter->getCanonicalDecl();
3975 if (method_decl)
3976 {
3977 if (!method_decl->getName().empty())
3978 name.assign(method_decl->getName().data());
3979 else
3980 name.clear();
3981 if (method_decl->isStatic())
3982 kind = lldb::eMemberFunctionKindStaticMethod;
3983 else if (llvm::isa<clang::CXXConstructorDecl>(method_decl))
3984 kind = lldb::eMemberFunctionKindConstructor;
3985 else if (llvm::isa<clang::CXXDestructorDecl>(method_decl))
3986 kind = lldb::eMemberFunctionKindDestructor;
3987 else
3988 kind = lldb::eMemberFunctionKindInstanceMethod;
Greg Claytona1e5dc82015-08-11 22:53:00 +00003989 clang_type = CompilerType(getASTContext(),method_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003990 }
3991 }
3992 }
3993 }
3994 break;
3995
3996 case clang::Type::ObjCObjectPointer:
3997 if (GetCompleteType(type))
3998 {
3999 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4000 if (objc_class_type)
4001 {
4002 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4003 if (class_interface_decl)
4004 {
4005 auto method_iter = class_interface_decl->meth_begin();
4006 auto method_end = class_interface_decl->meth_end();
4007 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4008 {
4009 std::advance(method_iter, idx);
4010 method_decl = method_iter->getCanonicalDecl();
4011 if (method_decl)
4012 {
4013 name = method_decl->getSelector().getAsString();
4014 if (method_decl->isClassMethod())
4015 kind = lldb::eMemberFunctionKindStaticMethod;
4016 else
4017 kind = lldb::eMemberFunctionKindInstanceMethod;
4018 }
4019 }
4020 }
4021 }
4022 }
4023 break;
4024
4025 case clang::Type::ObjCObject:
4026 case clang::Type::ObjCInterface:
4027 if (GetCompleteType(type))
4028 {
4029 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4030 if (objc_class_type)
4031 {
4032 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4033 if (class_interface_decl)
4034 {
4035 auto method_iter = class_interface_decl->meth_begin();
4036 auto method_end = class_interface_decl->meth_end();
4037 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4038 {
4039 std::advance(method_iter, idx);
4040 method_decl = method_iter->getCanonicalDecl();
4041 if (method_decl)
4042 {
4043 name = method_decl->getSelector().getAsString();
4044 if (method_decl->isClassMethod())
4045 kind = lldb::eMemberFunctionKindStaticMethod;
4046 else
4047 kind = lldb::eMemberFunctionKindInstanceMethod;
4048 }
4049 }
4050 }
4051 }
4052 }
4053 break;
4054
4055 case clang::Type::Typedef:
4056 return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx);
4057
4058 case clang::Type::Elaborated:
4059 return GetMemberFunctionAtIndex(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx);
4060
4061 case clang::Type::Paren:
4062 return GetMemberFunctionAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx);
4063
4064 default:
4065 break;
4066 }
4067 }
4068
4069 if (kind == eMemberFunctionKindUnknown)
4070 return TypeMemberFunctionImpl();
4071 if (method_decl)
4072 return TypeMemberFunctionImpl(method_decl, name, kind);
4073 if (type)
4074 return TypeMemberFunctionImpl(clang_type, name, kind);
4075
4076 return TypeMemberFunctionImpl();
4077}
4078
Greg Claytona1e5dc82015-08-11 22:53:00 +00004079CompilerType
4080ClangASTContext::GetLValueReferenceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004081{
Ryan Brown57bee1e2015-09-14 22:45:11 +00004082 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00004083 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004084 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Ryan Brown57bee1e2015-09-14 22:45:11 +00004085 return CompilerType(ast->getASTContext(), ast->getASTContext()->getLValueReferenceType(GetQualType(type)));
Greg Claytond8d4a572015-08-11 21:38:15 +00004086 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004087 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004088}
4089
Greg Claytona1e5dc82015-08-11 22:53:00 +00004090CompilerType
4091ClangASTContext::GetRValueReferenceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004092{
Ryan Brown57bee1e2015-09-14 22:45:11 +00004093 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00004094 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004095 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Ryan Brown57bee1e2015-09-14 22:45:11 +00004096 return CompilerType(ast->getASTContext(), ast->getASTContext()->getRValueReferenceType(GetQualType(type)));
Greg Claytond8d4a572015-08-11 21:38:15 +00004097 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004098 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004099}
4100
Greg Claytona1e5dc82015-08-11 22:53:00 +00004101CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004102ClangASTContext::GetNonReferenceType (void* type)
4103{
4104 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004105 return CompilerType(getASTContext(), GetQualType(type).getNonReferenceType());
4106 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004107}
4108
Greg Claytona1e5dc82015-08-11 22:53:00 +00004109CompilerType
4110ClangASTContext::CreateTypedefType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00004111 const char *typedef_name,
Greg Clayton99558cc42015-08-24 23:46:31 +00004112 const CompilerDeclContext &compiler_decl_ctx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004113{
4114 if (type && typedef_name && typedef_name[0])
4115 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004116 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004117 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004118 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004119 clang::ASTContext* clang_ast = ast->getASTContext();
4120 clang::QualType qual_type (GetQualType(type));
Greg Clayton99558cc42015-08-24 23:46:31 +00004121
4122 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004123 if (decl_ctx == nullptr)
4124 decl_ctx = ast->getASTContext()->getTranslationUnitDecl();
Greg Clayton99558cc42015-08-24 23:46:31 +00004125
Greg Claytond8d4a572015-08-11 21:38:15 +00004126 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4127 decl_ctx,
4128 clang::SourceLocation(),
4129 clang::SourceLocation(),
4130 &clang_ast->Idents.get(typedef_name),
4131 clang_ast->getTrivialTypeSourceInfo(qual_type));
4132
4133 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4134
4135 // Get a uniqued clang::QualType for the typedef decl type
Greg Claytona1e5dc82015-08-11 22:53:00 +00004136 return CompilerType (clang_ast, clang_ast->getTypedefType (decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00004137 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004138 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004139
4140}
4141
Greg Claytona1e5dc82015-08-11 22:53:00 +00004142CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004143ClangASTContext::GetPointeeType (void* type)
4144{
4145 if (type)
4146 {
4147 clang::QualType qual_type(GetQualType(type));
Greg Claytona1e5dc82015-08-11 22:53:00 +00004148 return CompilerType (getASTContext(), qual_type.getTypePtr()->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004149 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004150 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004151}
4152
Greg Claytona1e5dc82015-08-11 22:53:00 +00004153CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004154ClangASTContext::GetPointerType (void* type)
4155{
4156 if (type)
4157 {
4158 clang::QualType qual_type (GetQualType(type));
4159
4160 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4161 switch (type_class)
4162 {
4163 case clang::Type::ObjCObject:
4164 case clang::Type::ObjCInterface:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004165 return CompilerType(getASTContext(), getASTContext()->getObjCObjectPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004166
4167 default:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004168 return CompilerType(getASTContext(), getASTContext()->getPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004169 }
4170 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004171 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004172}
4173
Greg Claytona1e5dc82015-08-11 22:53:00 +00004174CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004175ClangASTContext::GetTypedefedType (void* type)
4176{
4177 if (type)
4178 {
4179 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4180 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004181 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004182 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004183 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004184}
4185
Greg Claytona1e5dc82015-08-11 22:53:00 +00004186CompilerType
4187ClangASTContext::RemoveFastQualifiers (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004188{
Ryan Brown57bee1e2015-09-14 22:45:11 +00004189 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00004190 {
4191 clang::QualType qual_type(GetQualType(type));
4192 qual_type.getQualifiers().removeFastQualifiers();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004193 return CompilerType (type.GetTypeSystem(), qual_type.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004194 }
4195 return type;
4196}
4197
4198
4199//----------------------------------------------------------------------
4200// Create related types using the current type's AST
4201//----------------------------------------------------------------------
4202
Greg Claytona1e5dc82015-08-11 22:53:00 +00004203CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00004204ClangASTContext::GetBasicTypeFromAST (lldb::BasicType basic_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004205{
Greg Clayton99558cc42015-08-24 23:46:31 +00004206 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004207}
4208//----------------------------------------------------------------------
4209// Exploring the type
4210//----------------------------------------------------------------------
4211
4212uint64_t
4213ClangASTContext::GetBitSize (void* type, ExecutionContextScope *exe_scope)
4214{
4215 if (GetCompleteType (type))
4216 {
4217 clang::QualType qual_type(GetCanonicalQualType(type));
4218 switch (qual_type->getTypeClass())
4219 {
4220 case clang::Type::ObjCInterface:
4221 case clang::Type::ObjCObject:
4222 {
4223 ExecutionContext exe_ctx (exe_scope);
4224 Process *process = exe_ctx.GetProcessPtr();
4225 if (process)
4226 {
4227 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4228 if (objc_runtime)
4229 {
4230 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004231 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00004232 return bit_size;
4233 }
4234 }
4235 else
4236 {
4237 static bool g_printed = false;
4238 if (!g_printed)
4239 {
4240 StreamString s;
4241 DumpTypeDescription(&s);
4242
4243 llvm::outs() << "warning: trying to determine the size of type ";
4244 llvm::outs() << s.GetString() << "\n";
4245 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
4246 llvm::outs() << "backtrace:\n";
4247 llvm::sys::PrintStackTrace(llvm::outs());
4248 llvm::outs() << "\n";
4249 g_printed = true;
4250 }
4251 }
4252 }
4253 // fallthrough
4254 default:
4255 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
4256 if (bit_size == 0)
4257 {
4258 if (qual_type->isIncompleteArrayType())
4259 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
4260 }
4261 if (qual_type->isObjCObjectOrInterfaceType())
4262 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
4263 return bit_size;
4264 }
4265 }
4266 return 0;
4267}
4268
4269size_t
4270ClangASTContext::GetTypeBitAlign (void* type)
4271{
4272 if (GetCompleteType(type))
4273 return getASTContext()->getTypeAlign(GetQualType(type));
4274 return 0;
4275}
4276
4277
4278lldb::Encoding
4279ClangASTContext::GetEncoding (void* type, uint64_t &count)
4280{
4281 if (!type)
4282 return lldb::eEncodingInvalid;
4283
4284 count = 1;
4285 clang::QualType qual_type(GetCanonicalQualType(type));
4286
4287 switch (qual_type->getTypeClass())
4288 {
4289 case clang::Type::UnaryTransform:
4290 break;
4291
4292 case clang::Type::FunctionNoProto:
4293 case clang::Type::FunctionProto:
4294 break;
4295
4296 case clang::Type::IncompleteArray:
4297 case clang::Type::VariableArray:
4298 break;
4299
4300 case clang::Type::ConstantArray:
4301 break;
4302
4303 case clang::Type::ExtVector:
4304 case clang::Type::Vector:
4305 // TODO: Set this to more than one???
4306 break;
4307
4308 case clang::Type::Builtin:
4309 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4310 {
4311 default: assert(0 && "Unknown builtin type!");
4312 case clang::BuiltinType::Void:
4313 break;
4314
4315 case clang::BuiltinType::Bool:
4316 case clang::BuiltinType::Char_S:
4317 case clang::BuiltinType::SChar:
4318 case clang::BuiltinType::WChar_S:
4319 case clang::BuiltinType::Char16:
4320 case clang::BuiltinType::Char32:
4321 case clang::BuiltinType::Short:
4322 case clang::BuiltinType::Int:
4323 case clang::BuiltinType::Long:
4324 case clang::BuiltinType::LongLong:
4325 case clang::BuiltinType::Int128: return lldb::eEncodingSint;
4326
4327 case clang::BuiltinType::Char_U:
4328 case clang::BuiltinType::UChar:
4329 case clang::BuiltinType::WChar_U:
4330 case clang::BuiltinType::UShort:
4331 case clang::BuiltinType::UInt:
4332 case clang::BuiltinType::ULong:
4333 case clang::BuiltinType::ULongLong:
4334 case clang::BuiltinType::UInt128: return lldb::eEncodingUint;
4335
4336 case clang::BuiltinType::Float:
4337 case clang::BuiltinType::Double:
4338 case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
4339
4340 case clang::BuiltinType::ObjCClass:
4341 case clang::BuiltinType::ObjCId:
4342 case clang::BuiltinType::ObjCSel: return lldb::eEncodingUint;
4343
4344 case clang::BuiltinType::NullPtr: return lldb::eEncodingUint;
4345
4346 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4347 case clang::BuiltinType::Kind::BoundMember:
4348 case clang::BuiltinType::Kind::BuiltinFn:
4349 case clang::BuiltinType::Kind::Dependent:
4350 case clang::BuiltinType::Kind::Half:
4351 case clang::BuiltinType::Kind::OCLEvent:
4352 case clang::BuiltinType::Kind::OCLImage1d:
4353 case clang::BuiltinType::Kind::OCLImage1dArray:
4354 case clang::BuiltinType::Kind::OCLImage1dBuffer:
4355 case clang::BuiltinType::Kind::OCLImage2d:
4356 case clang::BuiltinType::Kind::OCLImage2dArray:
4357 case clang::BuiltinType::Kind::OCLImage3d:
4358 case clang::BuiltinType::Kind::OCLSampler:
4359 case clang::BuiltinType::Kind::Overload:
4360 case clang::BuiltinType::Kind::PseudoObject:
4361 case clang::BuiltinType::Kind::UnknownAny:
4362 break;
4363 }
4364 break;
4365 // All pointer types are represented as unsigned integer encodings.
4366 // We may nee to add a eEncodingPointer if we ever need to know the
4367 // difference
4368 case clang::Type::ObjCObjectPointer:
4369 case clang::Type::BlockPointer:
4370 case clang::Type::Pointer:
4371 case clang::Type::LValueReference:
4372 case clang::Type::RValueReference:
4373 case clang::Type::MemberPointer: return lldb::eEncodingUint;
4374 case clang::Type::Complex:
4375 {
4376 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4377 if (qual_type->isComplexType())
4378 encoding = lldb::eEncodingIEEE754;
4379 else
4380 {
4381 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
4382 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004383 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004384 else
4385 encoding = lldb::eEncodingSint;
4386 }
4387 count = 2;
4388 return encoding;
4389 }
4390
4391 case clang::Type::ObjCInterface: break;
4392 case clang::Type::Record: break;
4393 case clang::Type::Enum: return lldb::eEncodingSint;
4394 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004395 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004396
4397 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004398 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004399
4400 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004401 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004402
4403 case clang::Type::DependentSizedArray:
4404 case clang::Type::DependentSizedExtVector:
4405 case clang::Type::UnresolvedUsing:
4406 case clang::Type::Attributed:
4407 case clang::Type::TemplateTypeParm:
4408 case clang::Type::SubstTemplateTypeParm:
4409 case clang::Type::SubstTemplateTypeParmPack:
4410 case clang::Type::Auto:
4411 case clang::Type::InjectedClassName:
4412 case clang::Type::DependentName:
4413 case clang::Type::DependentTemplateSpecialization:
4414 case clang::Type::PackExpansion:
4415 case clang::Type::ObjCObject:
4416
4417 case clang::Type::TypeOfExpr:
4418 case clang::Type::TypeOf:
4419 case clang::Type::Decltype:
4420 case clang::Type::TemplateSpecialization:
4421 case clang::Type::Atomic:
4422 case clang::Type::Adjusted:
4423 break;
4424
4425 // pointer type decayed from an array or function type.
4426 case clang::Type::Decayed:
4427 break;
4428 }
4429 count = 0;
4430 return lldb::eEncodingInvalid;
4431}
4432
4433lldb::Format
4434ClangASTContext::GetFormat (void* type)
4435{
4436 if (!type)
4437 return lldb::eFormatDefault;
4438
4439 clang::QualType qual_type(GetCanonicalQualType(type));
4440
4441 switch (qual_type->getTypeClass())
4442 {
4443 case clang::Type::UnaryTransform:
4444 break;
4445
4446 case clang::Type::FunctionNoProto:
4447 case clang::Type::FunctionProto:
4448 break;
4449
4450 case clang::Type::IncompleteArray:
4451 case clang::Type::VariableArray:
4452 break;
4453
4454 case clang::Type::ConstantArray:
4455 return lldb::eFormatVoid; // no value
4456
4457 case clang::Type::ExtVector:
4458 case clang::Type::Vector:
4459 break;
4460
4461 case clang::Type::Builtin:
4462 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4463 {
4464 //default: assert(0 && "Unknown builtin type!");
4465 case clang::BuiltinType::UnknownAny:
4466 case clang::BuiltinType::Void:
4467 case clang::BuiltinType::BoundMember:
4468 break;
4469
4470 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
4471 case clang::BuiltinType::Char_S:
4472 case clang::BuiltinType::SChar:
4473 case clang::BuiltinType::WChar_S:
4474 case clang::BuiltinType::Char_U:
4475 case clang::BuiltinType::UChar:
4476 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
4477 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
4478 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
4479 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
4480 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
4481 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
4482 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
4483 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
4484 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
4485 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
4486 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
4487 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
4488 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
4489 case clang::BuiltinType::Float: return lldb::eFormatFloat;
4490 case clang::BuiltinType::Double: return lldb::eFormatFloat;
4491 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
4492 case clang::BuiltinType::NullPtr:
4493 case clang::BuiltinType::Overload:
4494 case clang::BuiltinType::Dependent:
4495 case clang::BuiltinType::ObjCId:
4496 case clang::BuiltinType::ObjCClass:
4497 case clang::BuiltinType::ObjCSel:
4498 case clang::BuiltinType::Half:
4499 case clang::BuiltinType::ARCUnbridgedCast:
4500 case clang::BuiltinType::PseudoObject:
4501 case clang::BuiltinType::BuiltinFn:
4502 case clang::BuiltinType::OCLEvent:
4503 case clang::BuiltinType::OCLImage1d:
4504 case clang::BuiltinType::OCLImage1dArray:
4505 case clang::BuiltinType::OCLImage1dBuffer:
4506 case clang::BuiltinType::OCLImage2d:
4507 case clang::BuiltinType::OCLImage2dArray:
4508 case clang::BuiltinType::OCLImage3d:
4509 case clang::BuiltinType::OCLSampler:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00004510 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00004511 return lldb::eFormatHex;
4512 }
4513 break;
4514 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
4515 case clang::Type::BlockPointer: return lldb::eFormatHex;
4516 case clang::Type::Pointer: return lldb::eFormatHex;
4517 case clang::Type::LValueReference:
4518 case clang::Type::RValueReference: return lldb::eFormatHex;
4519 case clang::Type::MemberPointer: break;
4520 case clang::Type::Complex:
4521 {
4522 if (qual_type->isComplexType())
4523 return lldb::eFormatComplex;
4524 else
4525 return lldb::eFormatComplexInteger;
4526 }
4527 case clang::Type::ObjCInterface: break;
4528 case clang::Type::Record: break;
4529 case clang::Type::Enum: return lldb::eFormatEnum;
4530 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004531 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004532 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004533 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004534 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004535 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004536 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004537 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004538 case clang::Type::DependentSizedArray:
4539 case clang::Type::DependentSizedExtVector:
4540 case clang::Type::UnresolvedUsing:
4541 case clang::Type::Attributed:
4542 case clang::Type::TemplateTypeParm:
4543 case clang::Type::SubstTemplateTypeParm:
4544 case clang::Type::SubstTemplateTypeParmPack:
4545 case clang::Type::InjectedClassName:
4546 case clang::Type::DependentName:
4547 case clang::Type::DependentTemplateSpecialization:
4548 case clang::Type::PackExpansion:
4549 case clang::Type::ObjCObject:
4550
4551 case clang::Type::TypeOfExpr:
4552 case clang::Type::TypeOf:
4553 case clang::Type::Decltype:
4554 case clang::Type::TemplateSpecialization:
4555 case clang::Type::Atomic:
4556 case clang::Type::Adjusted:
4557 break;
4558
4559 // pointer type decayed from an array or function type.
4560 case clang::Type::Decayed:
4561 break;
4562 }
4563 // We don't know hot to display this type...
4564 return lldb::eFormatBytes;
4565}
4566
4567static bool
4568ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
4569{
4570 while (class_interface_decl)
4571 {
4572 if (class_interface_decl->ivar_size() > 0)
4573 return true;
4574
4575 if (check_superclass)
4576 class_interface_decl = class_interface_decl->getSuperClass();
4577 else
4578 break;
4579 }
4580 return false;
4581}
4582
4583uint32_t
4584ClangASTContext::GetNumChildren (void* type, bool omit_empty_base_classes)
4585{
4586 if (!type)
4587 return 0;
4588
4589 uint32_t num_children = 0;
4590 clang::QualType qual_type(GetQualType(type));
4591 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4592 switch (type_class)
4593 {
4594 case clang::Type::Builtin:
4595 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4596 {
4597 case clang::BuiltinType::ObjCId: // child is Class
4598 case clang::BuiltinType::ObjCClass: // child is Class
4599 num_children = 1;
4600 break;
4601
4602 default:
4603 break;
4604 }
4605 break;
4606
4607 case clang::Type::Complex: return 0;
4608
4609 case clang::Type::Record:
4610 if (GetCompleteQualType (getASTContext(), qual_type))
4611 {
4612 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4613 const clang::RecordDecl *record_decl = record_type->getDecl();
4614 assert(record_decl);
4615 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4616 if (cxx_record_decl)
4617 {
4618 if (omit_empty_base_classes)
4619 {
4620 // Check each base classes to see if it or any of its
4621 // base classes contain any fields. This can help
4622 // limit the noise in variable views by not having to
4623 // show base classes that contain no members.
4624 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4625 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4626 base_class != base_class_end;
4627 ++base_class)
4628 {
4629 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
4630
4631 // Skip empty base classes
4632 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
4633 continue;
4634
4635 num_children++;
4636 }
4637 }
4638 else
4639 {
4640 // Include all base classes
4641 num_children += cxx_record_decl->getNumBases();
4642 }
4643
4644 }
4645 clang::RecordDecl::field_iterator field, field_end;
4646 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
4647 ++num_children;
4648 }
4649 break;
4650
4651 case clang::Type::ObjCObject:
4652 case clang::Type::ObjCInterface:
4653 if (GetCompleteQualType (getASTContext(), qual_type))
4654 {
4655 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4656 assert (objc_class_type);
4657 if (objc_class_type)
4658 {
4659 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4660
4661 if (class_interface_decl)
4662 {
4663
4664 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4665 if (superclass_interface_decl)
4666 {
4667 if (omit_empty_base_classes)
4668 {
4669 if (ObjCDeclHasIVars (superclass_interface_decl, true))
4670 ++num_children;
4671 }
4672 else
4673 ++num_children;
4674 }
4675
4676 num_children += class_interface_decl->ivar_size();
4677 }
4678 }
4679 }
4680 break;
4681
4682 case clang::Type::ObjCObjectPointer:
4683 {
4684 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
4685 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004686 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004687 // If this type points to a simple type, then it has 1 child
4688 if (num_pointee_children == 0)
4689 num_children = 1;
4690 else
4691 num_children = num_pointee_children;
4692 }
4693 break;
4694
4695 case clang::Type::Vector:
4696 case clang::Type::ExtVector:
4697 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
4698 break;
4699
4700 case clang::Type::ConstantArray:
4701 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4702 break;
4703
4704 case clang::Type::Pointer:
4705 {
4706 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
4707 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00004708 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004709 if (num_pointee_children == 0)
4710 {
4711 // We have a pointer to a pointee type that claims it has no children.
4712 // We will want to look at
4713 num_children = GetNumPointeeChildren (pointee_type);
4714 }
4715 else
4716 num_children = num_pointee_children;
4717 }
4718 break;
4719
4720 case clang::Type::LValueReference:
4721 case clang::Type::RValueReference:
4722 {
4723 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
4724 clang::QualType pointee_type = reference_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 this type points to a simple type, then it has 1 child
4727 if (num_pointee_children == 0)
4728 num_children = 1;
4729 else
4730 num_children = num_pointee_children;
4731 }
4732 break;
4733
4734
4735 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004736 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004737 break;
4738
4739 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004740 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004741 break;
4742
4743 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004744 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004745 break;
4746 default:
4747 break;
4748 }
4749 return num_children;
4750}
4751
4752lldb::BasicType
4753ClangASTContext::GetBasicTypeEnumeration (void* type)
4754{
4755 if (type)
4756 {
4757 clang::QualType qual_type(GetQualType(type));
4758 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4759 if (type_class == clang::Type::Builtin)
4760 {
4761 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4762 {
4763 case clang::BuiltinType::Void: return eBasicTypeVoid;
4764 case clang::BuiltinType::Bool: return eBasicTypeBool;
4765 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
4766 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
4767 case clang::BuiltinType::Char16: return eBasicTypeChar16;
4768 case clang::BuiltinType::Char32: return eBasicTypeChar32;
4769 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
4770 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
4771 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
4772 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
4773 case clang::BuiltinType::Short: return eBasicTypeShort;
4774 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
4775 case clang::BuiltinType::Int: return eBasicTypeInt;
4776 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
4777 case clang::BuiltinType::Long: return eBasicTypeLong;
4778 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
4779 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
4780 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
4781 case clang::BuiltinType::Int128: return eBasicTypeInt128;
4782 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
4783
4784 case clang::BuiltinType::Half: return eBasicTypeHalf;
4785 case clang::BuiltinType::Float: return eBasicTypeFloat;
4786 case clang::BuiltinType::Double: return eBasicTypeDouble;
4787 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
4788
4789 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
4790 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
4791 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
4792 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
4793 case clang::BuiltinType::Dependent:
4794 case clang::BuiltinType::Overload:
4795 case clang::BuiltinType::BoundMember:
4796 case clang::BuiltinType::PseudoObject:
4797 case clang::BuiltinType::UnknownAny:
4798 case clang::BuiltinType::BuiltinFn:
4799 case clang::BuiltinType::ARCUnbridgedCast:
4800 case clang::BuiltinType::OCLEvent:
4801 case clang::BuiltinType::OCLImage1d:
4802 case clang::BuiltinType::OCLImage1dArray:
4803 case clang::BuiltinType::OCLImage1dBuffer:
4804 case clang::BuiltinType::OCLImage2d:
4805 case clang::BuiltinType::OCLImage2dArray:
4806 case clang::BuiltinType::OCLImage3d:
4807 case clang::BuiltinType::OCLSampler:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00004808 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00004809 return eBasicTypeOther;
4810 }
4811 }
4812 }
4813 return eBasicTypeInvalid;
4814}
4815
Greg Clayton99558cc42015-08-24 23:46:31 +00004816void
4817ClangASTContext::ForEachEnumerator (void* type, std::function <bool (const CompilerType &integer_type, const ConstString &name, const llvm::APSInt &value)> const &callback)
4818{
4819 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
4820 if (enum_type)
4821 {
4822 const clang::EnumDecl *enum_decl = enum_type->getDecl();
4823 if (enum_decl)
4824 {
4825 CompilerType integer_type(this, enum_decl->getIntegerType().getAsOpaquePtr());
4826
4827 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
4828 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
4829 {
4830 ConstString name(enum_pos->getNameAsString().c_str());
4831 if (!callback (integer_type, name, enum_pos->getInitVal()))
4832 break;
4833 }
4834 }
4835 }
4836}
4837
Greg Claytond8d4a572015-08-11 21:38:15 +00004838
4839#pragma mark Aggregate Types
4840
4841uint32_t
Greg Claytond8d4a572015-08-11 21:38:15 +00004842ClangASTContext::GetNumFields (void* type)
4843{
4844 if (!type)
4845 return 0;
4846
4847 uint32_t count = 0;
4848 clang::QualType qual_type(GetCanonicalQualType(type));
4849 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4850 switch (type_class)
4851 {
4852 case clang::Type::Record:
4853 if (GetCompleteType(type))
4854 {
4855 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
4856 if (record_type)
4857 {
4858 clang::RecordDecl *record_decl = record_type->getDecl();
4859 if (record_decl)
4860 {
4861 uint32_t field_idx = 0;
4862 clang::RecordDecl::field_iterator field, field_end;
4863 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
4864 ++field_idx;
4865 count = field_idx;
4866 }
4867 }
4868 }
4869 break;
4870
4871 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004872 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00004873 break;
4874
4875 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004876 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00004877 break;
4878
4879 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004880 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00004881 break;
4882
4883 case clang::Type::ObjCObjectPointer:
4884 if (GetCompleteType(type))
4885 {
4886 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4887 if (objc_class_type)
4888 {
4889 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4890
4891 if (class_interface_decl)
4892 count = class_interface_decl->ivar_size();
4893 }
4894 }
4895 break;
4896
4897 case clang::Type::ObjCObject:
4898 case clang::Type::ObjCInterface:
4899 if (GetCompleteType(type))
4900 {
4901 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4902 if (objc_class_type)
4903 {
4904 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4905
4906 if (class_interface_decl)
4907 count = class_interface_decl->ivar_size();
4908 }
4909 }
4910 break;
4911
4912 default:
4913 break;
4914 }
4915 return count;
4916}
4917
Greg Claytond8d4a572015-08-11 21:38:15 +00004918static clang_type_t
4919GetObjCFieldAtIndex (clang::ASTContext *ast,
4920 clang::ObjCInterfaceDecl *class_interface_decl,
4921 size_t idx,
4922 std::string& name,
4923 uint64_t *bit_offset_ptr,
4924 uint32_t *bitfield_bit_size_ptr,
4925 bool *is_bitfield_ptr)
4926{
4927 if (class_interface_decl)
4928 {
4929 if (idx < (class_interface_decl->ivar_size()))
4930 {
4931 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
4932 uint32_t ivar_idx = 0;
4933
4934 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
4935 {
4936 if (ivar_idx == idx)
4937 {
4938 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
4939
4940 clang::QualType ivar_qual_type(ivar_decl->getType());
4941
4942 name.assign(ivar_decl->getNameAsString());
4943
4944 if (bit_offset_ptr)
4945 {
4946 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
4947 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
4948 }
4949
4950 const bool is_bitfield = ivar_pos->isBitField();
4951
4952 if (bitfield_bit_size_ptr)
4953 {
4954 *bitfield_bit_size_ptr = 0;
4955
4956 if (is_bitfield && ast)
4957 {
4958 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
4959 llvm::APSInt bitfield_apsint;
4960 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
4961 {
4962 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
4963 }
4964 }
4965 }
4966 if (is_bitfield_ptr)
4967 *is_bitfield_ptr = is_bitfield;
4968
4969 return ivar_qual_type.getAsOpaquePtr();
4970 }
4971 }
4972 }
4973 }
4974 return nullptr;
4975}
4976
Greg Claytona1e5dc82015-08-11 22:53:00 +00004977CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00004978ClangASTContext::GetFieldAtIndex (void* type, size_t idx,
4979 std::string& name,
4980 uint64_t *bit_offset_ptr,
4981 uint32_t *bitfield_bit_size_ptr,
4982 bool *is_bitfield_ptr)
4983{
4984 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004985 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004986
4987 clang::QualType qual_type(GetCanonicalQualType(type));
4988 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4989 switch (type_class)
4990 {
4991 case clang::Type::Record:
4992 if (GetCompleteType(type))
4993 {
4994 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4995 const clang::RecordDecl *record_decl = record_type->getDecl();
4996 uint32_t field_idx = 0;
4997 clang::RecordDecl::field_iterator field, field_end;
4998 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
4999 {
5000 if (idx == field_idx)
5001 {
5002 // Print the member type if requested
5003 // Print the member name and equal sign
5004 name.assign(field->getNameAsString());
5005
5006 // Figure out the type byte size (field_type_info.first) and
5007 // alignment (field_type_info.second) from the AST context.
5008 if (bit_offset_ptr)
5009 {
5010 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5011 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5012 }
5013
5014 const bool is_bitfield = field->isBitField();
5015
5016 if (bitfield_bit_size_ptr)
5017 {
5018 *bitfield_bit_size_ptr = 0;
5019
5020 if (is_bitfield)
5021 {
5022 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5023 llvm::APSInt bitfield_apsint;
5024 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5025 {
5026 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5027 }
5028 }
5029 }
5030 if (is_bitfield_ptr)
5031 *is_bitfield_ptr = is_bitfield;
5032
Greg Claytona1e5dc82015-08-11 22:53:00 +00005033 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005034 }
5035 }
5036 }
5037 break;
5038
5039 case clang::Type::ObjCObjectPointer:
5040 if (GetCompleteType(type))
5041 {
5042 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5043 if (objc_class_type)
5044 {
5045 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005046 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 +00005047 }
5048 }
5049 break;
5050
5051 case clang::Type::ObjCObject:
5052 case clang::Type::ObjCInterface:
5053 if (GetCompleteType(type))
5054 {
5055 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5056 assert (objc_class_type);
5057 if (objc_class_type)
5058 {
5059 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005060 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 +00005061 }
5062 }
5063 break;
5064
5065
5066 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005067 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005068 GetFieldAtIndex (idx,
5069 name,
5070 bit_offset_ptr,
5071 bitfield_bit_size_ptr,
5072 is_bitfield_ptr);
5073
5074 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005075 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005076 GetFieldAtIndex (idx,
5077 name,
5078 bit_offset_ptr,
5079 bitfield_bit_size_ptr,
5080 is_bitfield_ptr);
5081
5082 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005083 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
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 default:
5091 break;
5092 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005093 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005094}
5095
Greg Clayton99558cc42015-08-24 23:46:31 +00005096uint32_t
5097ClangASTContext::GetNumDirectBaseClasses (void *type)
5098{
5099 uint32_t count = 0;
5100 clang::QualType qual_type(GetCanonicalQualType(type));
5101 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5102 switch (type_class)
5103 {
5104 case clang::Type::Record:
5105 if (GetCompleteType(type))
5106 {
5107 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5108 if (cxx_record_decl)
5109 count = cxx_record_decl->getNumBases();
5110 }
5111 break;
5112
5113 case clang::Type::ObjCObjectPointer:
5114 count = GetPointeeType(type).GetNumDirectBaseClasses();
5115 break;
5116
5117 case clang::Type::ObjCObject:
5118 if (GetCompleteType(type))
5119 {
5120 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5121 if (objc_class_type)
5122 {
5123 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5124
5125 if (class_interface_decl && class_interface_decl->getSuperClass())
5126 count = 1;
5127 }
5128 }
5129 break;
5130 case clang::Type::ObjCInterface:
5131 if (GetCompleteType(type))
5132 {
5133 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5134 if (objc_interface_type)
5135 {
5136 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5137
5138 if (class_interface_decl && class_interface_decl->getSuperClass())
5139 count = 1;
5140 }
5141 }
5142 break;
5143
5144
5145 case clang::Type::Typedef:
5146 count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5147 break;
5148
5149 case clang::Type::Elaborated:
5150 count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5151 break;
5152
5153 case clang::Type::Paren:
5154 return GetNumDirectBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5155
5156 default:
5157 break;
5158 }
5159 return count;
5160
5161}
5162
5163uint32_t
5164ClangASTContext::GetNumVirtualBaseClasses (void *type)
5165{
5166 uint32_t count = 0;
5167 clang::QualType qual_type(GetCanonicalQualType(type));
5168 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5169 switch (type_class)
5170 {
5171 case clang::Type::Record:
5172 if (GetCompleteType(type))
5173 {
5174 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5175 if (cxx_record_decl)
5176 count = cxx_record_decl->getNumVBases();
5177 }
5178 break;
5179
5180 case clang::Type::Typedef:
5181 count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5182 break;
5183
5184 case clang::Type::Elaborated:
5185 count = GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5186 break;
5187
5188 case clang::Type::Paren:
5189 count = GetNumVirtualBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5190 break;
5191
5192 default:
5193 break;
5194 }
5195 return count;
5196
5197}
5198
5199CompilerType
5200ClangASTContext::GetDirectBaseClassAtIndex (void *type, size_t idx, uint32_t *bit_offset_ptr)
5201{
5202 clang::QualType qual_type(GetCanonicalQualType(type));
5203 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5204 switch (type_class)
5205 {
5206 case clang::Type::Record:
5207 if (GetCompleteType(type))
5208 {
5209 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5210 if (cxx_record_decl)
5211 {
5212 uint32_t curr_idx = 0;
5213 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5214 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5215 base_class != base_class_end;
5216 ++base_class, ++curr_idx)
5217 {
5218 if (curr_idx == idx)
5219 {
5220 if (bit_offset_ptr)
5221 {
5222 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5223 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5224 if (base_class->isVirtual())
5225 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5226 else
5227 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5228 }
5229 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5230 }
5231 }
5232 }
5233 }
5234 break;
5235
5236 case clang::Type::ObjCObjectPointer:
5237 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
5238
5239 case clang::Type::ObjCObject:
5240 if (idx == 0 && GetCompleteType(type))
5241 {
5242 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5243 if (objc_class_type)
5244 {
5245 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5246
5247 if (class_interface_decl)
5248 {
5249 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5250 if (superclass_interface_decl)
5251 {
5252 if (bit_offset_ptr)
5253 *bit_offset_ptr = 0;
5254 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5255 }
5256 }
5257 }
5258 }
5259 break;
5260 case clang::Type::ObjCInterface:
5261 if (idx == 0 && GetCompleteType(type))
5262 {
5263 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5264 if (objc_interface_type)
5265 {
5266 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5267
5268 if (class_interface_decl)
5269 {
5270 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5271 if (superclass_interface_decl)
5272 {
5273 if (bit_offset_ptr)
5274 *bit_offset_ptr = 0;
5275 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5276 }
5277 }
5278 }
5279 }
5280 break;
5281
5282
5283 case clang::Type::Typedef:
5284 return GetDirectBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5285
5286 case clang::Type::Elaborated:
5287 return GetDirectBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5288
5289 case clang::Type::Paren:
5290 return GetDirectBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5291
5292 default:
5293 break;
5294 }
5295 return CompilerType();
5296}
5297
5298CompilerType
5299ClangASTContext::GetVirtualBaseClassAtIndex (void *type,
5300 size_t idx,
5301 uint32_t *bit_offset_ptr)
5302{
5303 clang::QualType qual_type(GetCanonicalQualType(type));
5304 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5305 switch (type_class)
5306 {
5307 case clang::Type::Record:
5308 if (GetCompleteType(type))
5309 {
5310 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5311 if (cxx_record_decl)
5312 {
5313 uint32_t curr_idx = 0;
5314 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5315 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
5316 base_class != base_class_end;
5317 ++base_class, ++curr_idx)
5318 {
5319 if (curr_idx == idx)
5320 {
5321 if (bit_offset_ptr)
5322 {
5323 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5324 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5325 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5326
5327 }
5328 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5329 }
5330 }
5331 }
5332 }
5333 break;
5334
5335 case clang::Type::Typedef:
5336 return GetVirtualBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5337
5338 case clang::Type::Elaborated:
5339 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5340
5341 case clang::Type::Paren:
5342 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5343
5344 default:
5345 break;
5346 }
5347 return CompilerType();
5348
5349}
5350
Greg Claytond8d4a572015-08-11 21:38:15 +00005351// If a pointer to a pointee type (the clang_type arg) says that it has no
5352// children, then we either need to trust it, or override it and return a
5353// different result. For example, an "int *" has one child that is an integer,
5354// but a function pointer doesn't have any children. Likewise if a Record type
5355// claims it has no children, then there really is nothing to show.
5356uint32_t
5357ClangASTContext::GetNumPointeeChildren (clang::QualType type)
5358{
5359 if (type.isNull())
5360 return 0;
5361
5362 clang::QualType qual_type(type.getCanonicalType());
5363 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5364 switch (type_class)
5365 {
5366 case clang::Type::Builtin:
5367 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5368 {
5369 case clang::BuiltinType::UnknownAny:
5370 case clang::BuiltinType::Void:
5371 case clang::BuiltinType::NullPtr:
5372 case clang::BuiltinType::OCLEvent:
5373 case clang::BuiltinType::OCLImage1d:
5374 case clang::BuiltinType::OCLImage1dArray:
5375 case clang::BuiltinType::OCLImage1dBuffer:
5376 case clang::BuiltinType::OCLImage2d:
5377 case clang::BuiltinType::OCLImage2dArray:
5378 case clang::BuiltinType::OCLImage3d:
5379 case clang::BuiltinType::OCLSampler:
5380 return 0;
5381 case clang::BuiltinType::Bool:
5382 case clang::BuiltinType::Char_U:
5383 case clang::BuiltinType::UChar:
5384 case clang::BuiltinType::WChar_U:
5385 case clang::BuiltinType::Char16:
5386 case clang::BuiltinType::Char32:
5387 case clang::BuiltinType::UShort:
5388 case clang::BuiltinType::UInt:
5389 case clang::BuiltinType::ULong:
5390 case clang::BuiltinType::ULongLong:
5391 case clang::BuiltinType::UInt128:
5392 case clang::BuiltinType::Char_S:
5393 case clang::BuiltinType::SChar:
5394 case clang::BuiltinType::WChar_S:
5395 case clang::BuiltinType::Short:
5396 case clang::BuiltinType::Int:
5397 case clang::BuiltinType::Long:
5398 case clang::BuiltinType::LongLong:
5399 case clang::BuiltinType::Int128:
5400 case clang::BuiltinType::Float:
5401 case clang::BuiltinType::Double:
5402 case clang::BuiltinType::LongDouble:
5403 case clang::BuiltinType::Dependent:
5404 case clang::BuiltinType::Overload:
5405 case clang::BuiltinType::ObjCId:
5406 case clang::BuiltinType::ObjCClass:
5407 case clang::BuiltinType::ObjCSel:
5408 case clang::BuiltinType::BoundMember:
5409 case clang::BuiltinType::Half:
5410 case clang::BuiltinType::ARCUnbridgedCast:
5411 case clang::BuiltinType::PseudoObject:
5412 case clang::BuiltinType::BuiltinFn:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00005413 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00005414 return 1;
5415 }
5416 break;
5417
5418 case clang::Type::Complex: return 1;
5419 case clang::Type::Pointer: return 1;
5420 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
5421 case clang::Type::LValueReference: return 1;
5422 case clang::Type::RValueReference: return 1;
5423 case clang::Type::MemberPointer: return 0;
5424 case clang::Type::ConstantArray: return 0;
5425 case clang::Type::IncompleteArray: return 0;
5426 case clang::Type::VariableArray: return 0;
5427 case clang::Type::DependentSizedArray: return 0;
5428 case clang::Type::DependentSizedExtVector: return 0;
5429 case clang::Type::Vector: return 0;
5430 case clang::Type::ExtVector: return 0;
5431 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
5432 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
5433 case clang::Type::UnresolvedUsing: return 0;
5434 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
5435 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
5436 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
5437 case clang::Type::TypeOfExpr: return 0;
5438 case clang::Type::TypeOf: return 0;
5439 case clang::Type::Decltype: return 0;
5440 case clang::Type::Record: return 0;
5441 case clang::Type::Enum: return 1;
5442 case clang::Type::TemplateTypeParm: return 1;
5443 case clang::Type::SubstTemplateTypeParm: return 1;
5444 case clang::Type::TemplateSpecialization: return 1;
5445 case clang::Type::InjectedClassName: return 0;
5446 case clang::Type::DependentName: return 1;
5447 case clang::Type::DependentTemplateSpecialization: return 1;
5448 case clang::Type::ObjCObject: return 0;
5449 case clang::Type::ObjCInterface: return 0;
5450 case clang::Type::ObjCObjectPointer: return 1;
5451 default:
5452 break;
5453 }
5454 return 0;
5455}
5456
5457
Greg Claytona1e5dc82015-08-11 22:53:00 +00005458CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00005459ClangASTContext::GetChildClangTypeAtIndex (void* type,
5460 ExecutionContext *exe_ctx,
5461 size_t idx,
5462 bool transparent_pointers,
5463 bool omit_empty_base_classes,
5464 bool ignore_array_bounds,
5465 std::string& child_name,
5466 uint32_t &child_byte_size,
5467 int32_t &child_byte_offset,
5468 uint32_t &child_bitfield_bit_size,
5469 uint32_t &child_bitfield_bit_offset,
5470 bool &child_is_base_class,
5471 bool &child_is_deref_of_parent,
5472 ValueObject *valobj)
Greg Claytond8d4a572015-08-11 21:38:15 +00005473{
5474 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005475 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005476
5477 clang::QualType parent_qual_type(GetCanonicalQualType(type));
5478 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
5479 child_bitfield_bit_size = 0;
5480 child_bitfield_bit_offset = 0;
5481 child_is_base_class = false;
5482
5483 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
5484 uint32_t bit_offset;
5485 switch (parent_type_class)
5486 {
5487 case clang::Type::Builtin:
5488 if (idx_is_valid)
5489 {
5490 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
5491 {
5492 case clang::BuiltinType::ObjCId:
5493 case clang::BuiltinType::ObjCClass:
5494 child_name = "isa";
5495 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005496 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00005497
5498 default:
5499 break;
5500 }
5501 }
5502 break;
5503
5504 case clang::Type::Record:
5505 if (idx_is_valid && GetCompleteType(type))
5506 {
5507 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
5508 const clang::RecordDecl *record_decl = record_type->getDecl();
5509 assert(record_decl);
5510 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5511 uint32_t child_idx = 0;
5512
5513 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5514 if (cxx_record_decl)
5515 {
5516 // We might have base classes to print out first
5517 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5518 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5519 base_class != base_class_end;
5520 ++base_class)
5521 {
5522 const clang::CXXRecordDecl *base_class_decl = nullptr;
5523
5524 // Skip empty base classes
5525 if (omit_empty_base_classes)
5526 {
5527 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5528 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5529 continue;
5530 }
5531
5532 if (idx == child_idx)
5533 {
5534 if (base_class_decl == nullptr)
5535 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5536
5537
5538 if (base_class->isVirtual())
5539 {
5540 bool handled = false;
5541 if (valobj)
5542 {
5543 Error err;
5544 AddressType addr_type = eAddressTypeInvalid;
5545 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
5546
5547 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
5548 {
5549
5550 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
5551 Process *process = exe_ctx.GetProcessPtr();
5552 if (process)
5553 {
5554 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
5555 if (vtable_ctx)
5556 {
5557 if (vtable_ctx->isMicrosoft())
5558 {
5559 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
5560
5561 if (vtable_ptr_addr)
5562 {
5563 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
5564
5565 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
5566 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
5567 {
5568 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
5569 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
5570 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
5571 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5572 if (base_offset != UINT32_MAX)
5573 {
5574 handled = true;
5575 bit_offset = base_offset * 8;
5576 }
5577 }
5578 }
5579 }
5580 else
5581 {
5582 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
5583 if (vtable_ptr_addr)
5584 {
5585 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
5586 if (vtable_ptr != LLDB_INVALID_ADDRESS)
5587 {
5588 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
5589 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
5590 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5591 if (base_offset != UINT32_MAX)
5592 {
5593 handled = true;
5594 bit_offset = base_offset * 8;
5595 }
5596 }
5597 }
5598 }
5599 }
5600 }
5601 }
5602
5603 }
5604 if (!handled)
5605 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5606 }
5607 else
5608 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5609
5610 // Base classes should be a multiple of 8 bits in size
5611 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005612 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005613 child_name = base_class_clang_type.GetTypeName().AsCString("");
5614 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5615
5616 // Base classes bit sizes should be a multiple of 8 bits in size
5617 assert (base_class_clang_type_bit_size % 8 == 0);
5618 child_byte_size = base_class_clang_type_bit_size / 8;
5619 child_is_base_class = true;
5620 return base_class_clang_type;
5621 }
5622 // We don't increment the child index in the for loop since we might
5623 // be skipping empty base classes
5624 ++child_idx;
5625 }
5626 }
5627 // Make sure index is in range...
5628 uint32_t field_idx = 0;
5629 clang::RecordDecl::field_iterator field, field_end;
5630 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
5631 {
5632 if (idx == child_idx)
5633 {
5634 // Print the member type if requested
5635 // Print the member name and equal sign
5636 child_name.assign(field->getNameAsString().c_str());
5637
5638 // Figure out the type byte size (field_type_info.first) and
5639 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00005640 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005641 assert(field_idx < record_layout.getFieldCount());
5642 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5643
5644 // Figure out the field offset within the current struct/union/class type
5645 bit_offset = record_layout.getFieldOffset (field_idx);
5646 child_byte_offset = bit_offset / 8;
5647 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
5648 child_bitfield_bit_offset = bit_offset % 8;
5649
5650 return field_clang_type;
5651 }
5652 }
5653 }
5654 break;
5655
5656 case clang::Type::ObjCObject:
5657 case clang::Type::ObjCInterface:
5658 if (idx_is_valid && GetCompleteType(type))
5659 {
5660 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
5661 assert (objc_class_type);
5662 if (objc_class_type)
5663 {
5664 uint32_t child_idx = 0;
5665 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5666
5667 if (class_interface_decl)
5668 {
5669
5670 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
5671 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5672 if (superclass_interface_decl)
5673 {
5674 if (omit_empty_base_classes)
5675 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005676 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00005677 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
5678 {
5679 if (idx == 0)
5680 {
5681 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5682
5683
5684 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
5685
5686 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5687
5688 child_byte_size = ivar_type_info.Width / 8;
5689 child_byte_offset = 0;
5690 child_is_base_class = true;
5691
Greg Claytona1e5dc82015-08-11 22:53:00 +00005692 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005693 }
5694
5695 ++child_idx;
5696 }
5697 }
5698 else
5699 ++child_idx;
5700 }
5701
5702 const uint32_t superclass_idx = child_idx;
5703
5704 if (idx < (child_idx + class_interface_decl->ivar_size()))
5705 {
5706 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5707
5708 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
5709 {
5710 if (child_idx == idx)
5711 {
5712 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5713
5714 clang::QualType ivar_qual_type(ivar_decl->getType());
5715
5716 child_name.assign(ivar_decl->getNameAsString().c_str());
5717
5718 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5719
5720 child_byte_size = ivar_type_info.Width / 8;
5721
5722 // Figure out the field offset within the current struct/union/class type
5723 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
5724 // that doesn't account for the space taken up by unbacked properties, or from
5725 // the changing size of base classes that are newer than this class.
5726 // So if we have a process around that we can ask about this object, do so.
5727 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
5728 Process *process = nullptr;
5729 if (exe_ctx)
5730 process = exe_ctx->GetProcessPtr();
5731 if (process)
5732 {
5733 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
5734 if (objc_runtime != nullptr)
5735 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005736 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005737 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
5738 }
5739 }
5740
5741 // Setting this to UINT32_MAX to make sure we don't compute it twice...
5742 bit_offset = UINT32_MAX;
5743
5744 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
5745 {
5746 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5747 child_byte_offset = bit_offset / 8;
5748 }
5749
5750 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
5751 // of a bitfield within its containing object. So regardless of where we get the byte
5752 // offset from, we still need to get the bit offset for bitfields from the layout.
5753
5754 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
5755 {
5756 if (bit_offset == UINT32_MAX)
5757 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5758
5759 child_bitfield_bit_offset = bit_offset % 8;
5760 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005761 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005762 }
5763 ++child_idx;
5764 }
5765 }
5766 }
5767 }
5768 }
5769 break;
5770
5771 case clang::Type::ObjCObjectPointer:
5772 if (idx_is_valid)
5773 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005774 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00005775
5776 if (transparent_pointers && pointee_clang_type.IsAggregateType())
5777 {
5778 child_is_deref_of_parent = false;
5779 bool tmp_child_is_deref_of_parent = false;
5780 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5781 idx,
5782 transparent_pointers,
5783 omit_empty_base_classes,
5784 ignore_array_bounds,
5785 child_name,
5786 child_byte_size,
5787 child_byte_offset,
5788 child_bitfield_bit_size,
5789 child_bitfield_bit_offset,
5790 child_is_base_class,
5791 tmp_child_is_deref_of_parent,
5792 valobj);
5793 }
5794 else
5795 {
5796 child_is_deref_of_parent = true;
5797 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5798 if (parent_name)
5799 {
5800 child_name.assign(1, '*');
5801 child_name += parent_name;
5802 }
5803
5804 // We have a pointer to an simple type
5805 if (idx == 0 && pointee_clang_type.GetCompleteType())
5806 {
5807 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5808 child_byte_offset = 0;
5809 return pointee_clang_type;
5810 }
5811 }
5812 }
5813 break;
5814
5815 case clang::Type::Vector:
5816 case clang::Type::ExtVector:
5817 if (idx_is_valid)
5818 {
5819 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
5820 if (array)
5821 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005822 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005823 if (element_type.GetCompleteType())
5824 {
5825 char element_name[64];
5826 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
5827 child_name.assign(element_name);
5828 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5829 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
5830 return element_type;
5831 }
5832 }
5833 }
5834 break;
5835
5836 case clang::Type::ConstantArray:
5837 case clang::Type::IncompleteArray:
5838 if (ignore_array_bounds || idx_is_valid)
5839 {
5840 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
5841 if (array)
5842 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005843 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005844 if (element_type.GetCompleteType())
5845 {
5846 char element_name[64];
5847 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
5848 child_name.assign(element_name);
5849 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5850 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
5851 return element_type;
5852 }
5853 }
5854 }
5855 break;
5856
5857
5858 case clang::Type::Pointer:
5859 if (idx_is_valid)
5860 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005861 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00005862
5863 // Don't dereference "void *" pointers
5864 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00005865 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005866
5867 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
5868 {
5869 child_is_deref_of_parent = false;
5870 bool tmp_child_is_deref_of_parent = false;
5871 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5872 idx,
5873 transparent_pointers,
5874 omit_empty_base_classes,
5875 ignore_array_bounds,
5876 child_name,
5877 child_byte_size,
5878 child_byte_offset,
5879 child_bitfield_bit_size,
5880 child_bitfield_bit_offset,
5881 child_is_base_class,
5882 tmp_child_is_deref_of_parent,
5883 valobj);
5884 }
5885 else
5886 {
5887 child_is_deref_of_parent = true;
5888
5889 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5890 if (parent_name)
5891 {
5892 child_name.assign(1, '*');
5893 child_name += parent_name;
5894 }
5895
5896 // We have a pointer to an simple type
5897 if (idx == 0)
5898 {
5899 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5900 child_byte_offset = 0;
5901 return pointee_clang_type;
5902 }
5903 }
5904 }
5905 break;
5906
5907 case clang::Type::LValueReference:
5908 case clang::Type::RValueReference:
5909 if (idx_is_valid)
5910 {
5911 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00005912 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005913 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
5914 {
5915 child_is_deref_of_parent = false;
5916 bool tmp_child_is_deref_of_parent = false;
5917 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5918 idx,
5919 transparent_pointers,
5920 omit_empty_base_classes,
5921 ignore_array_bounds,
5922 child_name,
5923 child_byte_size,
5924 child_byte_offset,
5925 child_bitfield_bit_size,
5926 child_bitfield_bit_offset,
5927 child_is_base_class,
5928 tmp_child_is_deref_of_parent,
5929 valobj);
5930 }
5931 else
5932 {
5933 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5934 if (parent_name)
5935 {
5936 child_name.assign(1, '&');
5937 child_name += parent_name;
5938 }
5939
5940 // We have a pointer to an simple type
5941 if (idx == 0)
5942 {
5943 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5944 child_byte_offset = 0;
5945 return pointee_clang_type;
5946 }
5947 }
5948 }
5949 break;
5950
5951 case clang::Type::Typedef:
5952 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005953 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005954 return typedefed_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5955 idx,
5956 transparent_pointers,
5957 omit_empty_base_classes,
5958 ignore_array_bounds,
5959 child_name,
5960 child_byte_size,
5961 child_byte_offset,
5962 child_bitfield_bit_size,
5963 child_bitfield_bit_offset,
5964 child_is_base_class,
5965 child_is_deref_of_parent,
5966 valobj);
5967 }
5968 break;
5969
5970 case clang::Type::Elaborated:
5971 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005972 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005973 return elaborated_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5974 idx,
5975 transparent_pointers,
5976 omit_empty_base_classes,
5977 ignore_array_bounds,
5978 child_name,
5979 child_byte_size,
5980 child_byte_offset,
5981 child_bitfield_bit_size,
5982 child_bitfield_bit_offset,
5983 child_is_base_class,
5984 child_is_deref_of_parent,
5985 valobj);
5986 }
5987
5988 case clang::Type::Paren:
5989 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005990 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00005991 return paren_clang_type.GetChildClangTypeAtIndex (exe_ctx,
5992 idx,
5993 transparent_pointers,
5994 omit_empty_base_classes,
5995 ignore_array_bounds,
5996 child_name,
5997 child_byte_size,
5998 child_byte_offset,
5999 child_bitfield_bit_size,
6000 child_bitfield_bit_offset,
6001 child_is_base_class,
6002 child_is_deref_of_parent,
6003 valobj);
6004 }
6005
6006
6007 default:
6008 break;
6009 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006010 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006011}
6012
6013static uint32_t
6014GetIndexForRecordBase
6015(
6016 const clang::RecordDecl *record_decl,
6017 const clang::CXXBaseSpecifier *base_spec,
6018 bool omit_empty_base_classes
6019 )
6020{
6021 uint32_t child_idx = 0;
6022
6023 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6024
6025 // const char *super_name = record_decl->getNameAsCString();
6026 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6027 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6028 //
6029 if (cxx_record_decl)
6030 {
6031 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6032 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6033 base_class != base_class_end;
6034 ++base_class)
6035 {
6036 if (omit_empty_base_classes)
6037 {
6038 if (BaseSpecifierIsEmpty (base_class))
6039 continue;
6040 }
6041
6042 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6043 // child_idx,
6044 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6045 //
6046 //
6047 if (base_class == base_spec)
6048 return child_idx;
6049 ++child_idx;
6050 }
6051 }
6052
6053 return UINT32_MAX;
6054}
6055
6056
6057static uint32_t
6058GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6059 clang::NamedDecl *canonical_decl,
6060 bool omit_empty_base_classes)
6061{
6062 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6063 omit_empty_base_classes);
6064
6065 clang::RecordDecl::field_iterator field, field_end;
6066 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6067 field != field_end;
6068 ++field, ++child_idx)
6069 {
6070 if (field->getCanonicalDecl() == canonical_decl)
6071 return child_idx;
6072 }
6073
6074 return UINT32_MAX;
6075}
6076
6077// Look for a child member (doesn't include base classes, but it does include
6078// their members) in the type hierarchy. Returns an index path into "clang_type"
6079// on how to reach the appropriate member.
6080//
6081// class A
6082// {
6083// public:
6084// int m_a;
6085// int m_b;
6086// };
6087//
6088// class B
6089// {
6090// };
6091//
6092// class C :
6093// public B,
6094// public A
6095// {
6096// };
6097//
6098// If we have a clang type that describes "class C", and we wanted to looked
6099// "m_b" in it:
6100//
6101// With omit_empty_base_classes == false we would get an integer array back with:
6102// { 1, 1 }
6103// The first index 1 is the child index for "class A" within class C
6104// The second index 1 is the child index for "m_b" within class A
6105//
6106// With omit_empty_base_classes == true we would get an integer array back with:
6107// { 0, 1 }
6108// 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)
6109// The second index 1 is the child index for "m_b" within class A
6110
6111size_t
6112ClangASTContext::GetIndexOfChildMemberWithName (void* type, const char *name,
6113 bool omit_empty_base_classes,
6114 std::vector<uint32_t>& child_indexes)
6115{
6116 if (type && name && name[0])
6117 {
6118 clang::QualType qual_type(GetCanonicalQualType(type));
6119 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6120 switch (type_class)
6121 {
6122 case clang::Type::Record:
6123 if (GetCompleteType(type))
6124 {
6125 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6126 const clang::RecordDecl *record_decl = record_type->getDecl();
6127
6128 assert(record_decl);
6129 uint32_t child_idx = 0;
6130
6131 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6132
6133 // Try and find a field that matches NAME
6134 clang::RecordDecl::field_iterator field, field_end;
6135 llvm::StringRef name_sref(name);
6136 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6137 field != field_end;
6138 ++field, ++child_idx)
6139 {
6140 llvm::StringRef field_name = field->getName();
6141 if (field_name.empty())
6142 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006143 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006144 child_indexes.push_back(child_idx);
6145 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
6146 return child_indexes.size();
6147 child_indexes.pop_back();
6148
6149 }
6150 else if (field_name.equals (name_sref))
6151 {
6152 // We have to add on the number of base classes to this index!
6153 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
6154 return child_indexes.size();
6155 }
6156 }
6157
6158 if (cxx_record_decl)
6159 {
6160 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6161
6162 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6163
6164 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6165 // Didn't find things easily, lets let clang do its thang...
6166 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
6167 clang::DeclarationName decl_name(&ident_ref);
6168
6169 clang::CXXBasePaths paths;
6170 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
6171 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
6172 },
6173 paths))
6174 {
6175 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
6176 for (path = paths.begin(); path != path_end; ++path)
6177 {
6178 const size_t num_path_elements = path->size();
6179 for (size_t e=0; e<num_path_elements; ++e)
6180 {
6181 clang::CXXBasePathElement elem = (*path)[e];
6182
6183 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
6184 if (child_idx == UINT32_MAX)
6185 {
6186 child_indexes.clear();
6187 return 0;
6188 }
6189 else
6190 {
6191 child_indexes.push_back (child_idx);
6192 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
6193 }
6194 }
6195 for (clang::NamedDecl *path_decl : path->Decls)
6196 {
6197 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
6198 if (child_idx == UINT32_MAX)
6199 {
6200 child_indexes.clear();
6201 return 0;
6202 }
6203 else
6204 {
6205 child_indexes.push_back (child_idx);
6206 }
6207 }
6208 }
6209 return child_indexes.size();
6210 }
6211 }
6212
6213 }
6214 break;
6215
6216 case clang::Type::ObjCObject:
6217 case clang::Type::ObjCInterface:
6218 if (GetCompleteType(type))
6219 {
6220 llvm::StringRef name_sref(name);
6221 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6222 assert (objc_class_type);
6223 if (objc_class_type)
6224 {
6225 uint32_t child_idx = 0;
6226 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6227
6228 if (class_interface_decl)
6229 {
6230 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6231 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6232
6233 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6234 {
6235 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6236
6237 if (ivar_decl->getName().equals (name_sref))
6238 {
6239 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6240 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6241 ++child_idx;
6242
6243 child_indexes.push_back (child_idx);
6244 return child_indexes.size();
6245 }
6246 }
6247
6248 if (superclass_interface_decl)
6249 {
6250 // The super class index is always zero for ObjC classes,
6251 // so we push it onto the child indexes in case we find
6252 // an ivar in our superclass...
6253 child_indexes.push_back (0);
6254
Greg Claytona1e5dc82015-08-11 22:53:00 +00006255 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006256 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
6257 omit_empty_base_classes,
6258 child_indexes))
6259 {
6260 // We did find an ivar in a superclass so just
6261 // return the results!
6262 return child_indexes.size();
6263 }
6264
6265 // We didn't find an ivar matching "name" in our
6266 // superclass, pop the superclass zero index that
6267 // we pushed on above.
6268 child_indexes.pop_back();
6269 }
6270 }
6271 }
6272 }
6273 break;
6274
6275 case clang::Type::ObjCObjectPointer:
6276 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006277 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006278 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
6279 omit_empty_base_classes,
6280 child_indexes);
6281 }
6282 break;
6283
6284
6285 case clang::Type::ConstantArray:
6286 {
6287 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6288 // const uint64_t element_count = array->getSize().getLimitedValue();
6289 //
6290 // if (idx < element_count)
6291 // {
6292 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6293 //
6294 // char element_name[32];
6295 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6296 //
6297 // child_name.assign(element_name);
6298 // assert(field_type_info.first % 8 == 0);
6299 // child_byte_size = field_type_info.first / 8;
6300 // child_byte_offset = idx * child_byte_size;
6301 // return array->getElementType().getAsOpaquePtr();
6302 // }
6303 }
6304 break;
6305
6306 // case clang::Type::MemberPointerType:
6307 // {
6308 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6309 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6310 //
6311 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6312 // {
6313 // return GetIndexOfChildWithName (ast,
6314 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6315 // name);
6316 // }
6317 // }
6318 // break;
6319 //
6320 case clang::Type::LValueReference:
6321 case clang::Type::RValueReference:
6322 {
6323 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6324 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006325 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006326
6327 if (pointee_clang_type.IsAggregateType ())
6328 {
6329 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6330 omit_empty_base_classes,
6331 child_indexes);
6332 }
6333 }
6334 break;
6335
6336 case clang::Type::Pointer:
6337 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006338 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006339
6340 if (pointee_clang_type.IsAggregateType ())
6341 {
6342 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6343 omit_empty_base_classes,
6344 child_indexes);
6345 }
6346 }
6347 break;
6348
6349 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006350 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006351 omit_empty_base_classes,
6352 child_indexes);
6353
6354 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006355 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006356 omit_empty_base_classes,
6357 child_indexes);
6358
6359 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006360 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006361 omit_empty_base_classes,
6362 child_indexes);
6363
6364 default:
6365 break;
6366 }
6367 }
6368 return 0;
6369}
6370
6371
6372// Get the index of the child of "clang_type" whose name matches. This function
6373// doesn't descend into the children, but only looks one level deep and name
6374// matches can include base class names.
6375
6376uint32_t
6377ClangASTContext::GetIndexOfChildWithName (void* type, const char *name, bool omit_empty_base_classes)
6378{
6379 if (type && name && name[0])
6380 {
6381 clang::QualType qual_type(GetCanonicalQualType(type));
6382
6383 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6384
6385 switch (type_class)
6386 {
6387 case clang::Type::Record:
6388 if (GetCompleteType(type))
6389 {
6390 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6391 const clang::RecordDecl *record_decl = record_type->getDecl();
6392
6393 assert(record_decl);
6394 uint32_t child_idx = 0;
6395
6396 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6397
6398 if (cxx_record_decl)
6399 {
6400 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6401 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6402 base_class != base_class_end;
6403 ++base_class)
6404 {
6405 // Skip empty base classes
6406 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6407 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
6408 continue;
6409
Greg Claytona1e5dc82015-08-11 22:53:00 +00006410 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006411 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
6412 if (base_class_type_name.compare (name) == 0)
6413 return child_idx;
6414 ++child_idx;
6415 }
6416 }
6417
6418 // Try and find a field that matches NAME
6419 clang::RecordDecl::field_iterator field, field_end;
6420 llvm::StringRef name_sref(name);
6421 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6422 field != field_end;
6423 ++field, ++child_idx)
6424 {
6425 if (field->getName().equals (name_sref))
6426 return child_idx;
6427 }
6428
6429 }
6430 break;
6431
6432 case clang::Type::ObjCObject:
6433 case clang::Type::ObjCInterface:
6434 if (GetCompleteType(type))
6435 {
6436 llvm::StringRef name_sref(name);
6437 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6438 assert (objc_class_type);
6439 if (objc_class_type)
6440 {
6441 uint32_t child_idx = 0;
6442 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6443
6444 if (class_interface_decl)
6445 {
6446 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6447 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6448
6449 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6450 {
6451 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6452
6453 if (ivar_decl->getName().equals (name_sref))
6454 {
6455 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6456 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6457 ++child_idx;
6458
6459 return child_idx;
6460 }
6461 }
6462
6463 if (superclass_interface_decl)
6464 {
6465 if (superclass_interface_decl->getName().equals (name_sref))
6466 return 0;
6467 }
6468 }
6469 }
6470 }
6471 break;
6472
6473 case clang::Type::ObjCObjectPointer:
6474 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006475 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006476 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6477 }
6478 break;
6479
6480 case clang::Type::ConstantArray:
6481 {
6482 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6483 // const uint64_t element_count = array->getSize().getLimitedValue();
6484 //
6485 // if (idx < element_count)
6486 // {
6487 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6488 //
6489 // char element_name[32];
6490 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6491 //
6492 // child_name.assign(element_name);
6493 // assert(field_type_info.first % 8 == 0);
6494 // child_byte_size = field_type_info.first / 8;
6495 // child_byte_offset = idx * child_byte_size;
6496 // return array->getElementType().getAsOpaquePtr();
6497 // }
6498 }
6499 break;
6500
6501 // case clang::Type::MemberPointerType:
6502 // {
6503 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6504 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6505 //
6506 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6507 // {
6508 // return GetIndexOfChildWithName (ast,
6509 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6510 // name);
6511 // }
6512 // }
6513 // break;
6514 //
6515 case clang::Type::LValueReference:
6516 case clang::Type::RValueReference:
6517 {
6518 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006519 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006520
6521 if (pointee_type.IsAggregateType ())
6522 {
6523 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6524 }
6525 }
6526 break;
6527
6528 case clang::Type::Pointer:
6529 {
6530 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006531 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006532
6533 if (pointee_type.IsAggregateType ())
6534 {
6535 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6536 }
6537 else
6538 {
6539 // if (parent_name)
6540 // {
6541 // child_name.assign(1, '*');
6542 // child_name += parent_name;
6543 // }
6544 //
6545 // // We have a pointer to an simple type
6546 // if (idx == 0)
6547 // {
6548 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
6549 // assert(clang_type_info.first % 8 == 0);
6550 // child_byte_size = clang_type_info.first / 8;
6551 // child_byte_offset = 0;
6552 // return pointee_type.getAsOpaquePtr();
6553 // }
6554 }
6555 }
6556 break;
6557
6558 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006559 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006560
6561 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006562 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006563
6564 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006565 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006566
6567 default:
6568 break;
6569 }
6570 }
6571 return UINT32_MAX;
6572}
6573
6574
6575size_t
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006576ClangASTContext::GetNumTemplateArguments (void* type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006577{
6578 if (!type)
6579 return 0;
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006580
6581 clang::QualType qual_type (GetCanonicalQualType(type));
6582 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6583 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00006584 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006585 case clang::Type::Record:
6586 if (GetCompleteType(type))
6587 {
6588 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6589 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00006590 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006591 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6592 if (template_decl)
6593 return template_decl->getTemplateArgs().size();
Greg Claytond8d4a572015-08-11 21:38:15 +00006594 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006595 }
6596 break;
6597
6598 case clang::Type::Typedef:
6599 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
6600
6601 case clang::Type::Elaborated:
6602 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
6603
6604 case clang::Type::Paren:
6605 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
6606
6607 default:
6608 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006609 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006610
Greg Claytond8d4a572015-08-11 21:38:15 +00006611 return 0;
6612}
6613
Greg Claytona1e5dc82015-08-11 22:53:00 +00006614CompilerType
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006615ClangASTContext::GetTemplateArgument (void* type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00006616{
6617 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00006618 return CompilerType();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006619
6620 clang::QualType qual_type (GetCanonicalQualType(type));
6621 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6622 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00006623 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006624 case clang::Type::Record:
6625 if (GetCompleteType(type))
6626 {
6627 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6628 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00006629 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006630 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6631 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
Greg Claytond8d4a572015-08-11 21:38:15 +00006632 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006633 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
6634 switch (template_arg.getKind())
Greg Claytond8d4a572015-08-11 21:38:15 +00006635 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006636 case clang::TemplateArgument::Null:
6637 kind = eTemplateArgumentKindNull;
6638 return CompilerType();
6639
6640 case clang::TemplateArgument::Type:
6641 kind = eTemplateArgumentKindType;
6642 return CompilerType(getASTContext(), template_arg.getAsType());
6643
6644 case clang::TemplateArgument::Declaration:
6645 kind = eTemplateArgumentKindDeclaration;
6646 return CompilerType();
6647
6648 case clang::TemplateArgument::Integral:
6649 kind = eTemplateArgumentKindIntegral;
6650 return CompilerType(getASTContext(), template_arg.getIntegralType());
6651
6652 case clang::TemplateArgument::Template:
6653 kind = eTemplateArgumentKindTemplate;
6654 return CompilerType();
6655
6656 case clang::TemplateArgument::TemplateExpansion:
6657 kind = eTemplateArgumentKindTemplateExpansion;
6658 return CompilerType();
6659
6660 case clang::TemplateArgument::Expression:
6661 kind = eTemplateArgumentKindExpression;
6662 return CompilerType();
6663
6664 case clang::TemplateArgument::Pack:
6665 kind = eTemplateArgumentKindPack;
6666 return CompilerType();
6667
6668 default:
6669 assert (!"Unhandled clang::TemplateArgument::ArgKind");
6670 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006671 }
6672 }
6673 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006674 }
6675 break;
6676
6677 case clang::Type::Typedef:
6678 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
6679
6680 case clang::Type::Elaborated:
6681 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
6682
6683 case clang::Type::Paren:
6684 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
6685
6686 default:
6687 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006688 }
6689 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006690 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00006691}
6692
6693static bool
6694IsOperator (const char *name, clang::OverloadedOperatorKind &op_kind)
6695{
6696 if (name == nullptr || name[0] == '\0')
6697 return false;
6698
6699#define OPERATOR_PREFIX "operator"
6700#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
6701
6702 const char *post_op_name = nullptr;
6703
6704 bool no_space = true;
6705
6706 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
6707 return false;
6708
6709 post_op_name = name + OPERATOR_PREFIX_LENGTH;
6710
6711 if (post_op_name[0] == ' ')
6712 {
6713 post_op_name++;
6714 no_space = false;
6715 }
6716
6717#undef OPERATOR_PREFIX
6718#undef OPERATOR_PREFIX_LENGTH
6719
6720 // This is an operator, set the overloaded operator kind to invalid
6721 // in case this is a conversion operator...
6722 op_kind = clang::NUM_OVERLOADED_OPERATORS;
6723
6724 switch (post_op_name[0])
6725 {
6726 default:
6727 if (no_space)
6728 return false;
6729 break;
6730 case 'n':
6731 if (no_space)
6732 return false;
6733 if (strcmp (post_op_name, "new") == 0)
6734 op_kind = clang::OO_New;
6735 else if (strcmp (post_op_name, "new[]") == 0)
6736 op_kind = clang::OO_Array_New;
6737 break;
6738
6739 case 'd':
6740 if (no_space)
6741 return false;
6742 if (strcmp (post_op_name, "delete") == 0)
6743 op_kind = clang::OO_Delete;
6744 else if (strcmp (post_op_name, "delete[]") == 0)
6745 op_kind = clang::OO_Array_Delete;
6746 break;
6747
6748 case '+':
6749 if (post_op_name[1] == '\0')
6750 op_kind = clang::OO_Plus;
6751 else if (post_op_name[2] == '\0')
6752 {
6753 if (post_op_name[1] == '=')
6754 op_kind = clang::OO_PlusEqual;
6755 else if (post_op_name[1] == '+')
6756 op_kind = clang::OO_PlusPlus;
6757 }
6758 break;
6759
6760 case '-':
6761 if (post_op_name[1] == '\0')
6762 op_kind = clang::OO_Minus;
6763 else if (post_op_name[2] == '\0')
6764 {
6765 switch (post_op_name[1])
6766 {
6767 case '=': op_kind = clang::OO_MinusEqual; break;
6768 case '-': op_kind = clang::OO_MinusMinus; break;
6769 case '>': op_kind = clang::OO_Arrow; break;
6770 }
6771 }
6772 else if (post_op_name[3] == '\0')
6773 {
6774 if (post_op_name[2] == '*')
6775 op_kind = clang::OO_ArrowStar; break;
6776 }
6777 break;
6778
6779 case '*':
6780 if (post_op_name[1] == '\0')
6781 op_kind = clang::OO_Star;
6782 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6783 op_kind = clang::OO_StarEqual;
6784 break;
6785
6786 case '/':
6787 if (post_op_name[1] == '\0')
6788 op_kind = clang::OO_Slash;
6789 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6790 op_kind = clang::OO_SlashEqual;
6791 break;
6792
6793 case '%':
6794 if (post_op_name[1] == '\0')
6795 op_kind = clang::OO_Percent;
6796 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6797 op_kind = clang::OO_PercentEqual;
6798 break;
6799
6800
6801 case '^':
6802 if (post_op_name[1] == '\0')
6803 op_kind = clang::OO_Caret;
6804 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6805 op_kind = clang::OO_CaretEqual;
6806 break;
6807
6808 case '&':
6809 if (post_op_name[1] == '\0')
6810 op_kind = clang::OO_Amp;
6811 else if (post_op_name[2] == '\0')
6812 {
6813 switch (post_op_name[1])
6814 {
6815 case '=': op_kind = clang::OO_AmpEqual; break;
6816 case '&': op_kind = clang::OO_AmpAmp; break;
6817 }
6818 }
6819 break;
6820
6821 case '|':
6822 if (post_op_name[1] == '\0')
6823 op_kind = clang::OO_Pipe;
6824 else if (post_op_name[2] == '\0')
6825 {
6826 switch (post_op_name[1])
6827 {
6828 case '=': op_kind = clang::OO_PipeEqual; break;
6829 case '|': op_kind = clang::OO_PipePipe; break;
6830 }
6831 }
6832 break;
6833
6834 case '~':
6835 if (post_op_name[1] == '\0')
6836 op_kind = clang::OO_Tilde;
6837 break;
6838
6839 case '!':
6840 if (post_op_name[1] == '\0')
6841 op_kind = clang::OO_Exclaim;
6842 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6843 op_kind = clang::OO_ExclaimEqual;
6844 break;
6845
6846 case '=':
6847 if (post_op_name[1] == '\0')
6848 op_kind = clang::OO_Equal;
6849 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6850 op_kind = clang::OO_EqualEqual;
6851 break;
6852
6853 case '<':
6854 if (post_op_name[1] == '\0')
6855 op_kind = clang::OO_Less;
6856 else if (post_op_name[2] == '\0')
6857 {
6858 switch (post_op_name[1])
6859 {
6860 case '<': op_kind = clang::OO_LessLess; break;
6861 case '=': op_kind = clang::OO_LessEqual; break;
6862 }
6863 }
6864 else if (post_op_name[3] == '\0')
6865 {
6866 if (post_op_name[2] == '=')
6867 op_kind = clang::OO_LessLessEqual;
6868 }
6869 break;
6870
6871 case '>':
6872 if (post_op_name[1] == '\0')
6873 op_kind = clang::OO_Greater;
6874 else if (post_op_name[2] == '\0')
6875 {
6876 switch (post_op_name[1])
6877 {
6878 case '>': op_kind = clang::OO_GreaterGreater; break;
6879 case '=': op_kind = clang::OO_GreaterEqual; break;
6880 }
6881 }
6882 else if (post_op_name[1] == '>' &&
6883 post_op_name[2] == '=' &&
6884 post_op_name[3] == '\0')
6885 {
6886 op_kind = clang::OO_GreaterGreaterEqual;
6887 }
6888 break;
6889
6890 case ',':
6891 if (post_op_name[1] == '\0')
6892 op_kind = clang::OO_Comma;
6893 break;
6894
6895 case '(':
6896 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
6897 op_kind = clang::OO_Call;
6898 break;
6899
6900 case '[':
6901 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
6902 op_kind = clang::OO_Subscript;
6903 break;
6904 }
6905
6906 return true;
6907}
6908
6909clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006910ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006911{
6912 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
6913 if (enutype)
6914 return enutype->getDecl();
6915 return NULL;
6916}
6917
6918clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006919ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006920{
6921 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(GetCanonicalQualType(type));
6922 if (record_type)
6923 return record_type->getDecl();
6924 return nullptr;
6925}
6926
6927clang::CXXRecordDecl *
6928ClangASTContext::GetAsCXXRecordDecl (void* type)
6929{
6930 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
6931}
6932
6933clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006934ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006935{
6936 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(GetCanonicalQualType(type));
6937 if (objc_class_type)
6938 return objc_class_type->getInterface();
6939 return nullptr;
6940}
6941
6942clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00006943ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
6944 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00006945 AccessType access,
6946 uint32_t bitfield_bit_size)
6947{
6948 if (!type.IsValid() || !field_clang_type.IsValid())
6949 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00006950 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00006951 if (!ast)
6952 return nullptr;
6953 clang::ASTContext* clang_ast = ast->getASTContext();
6954
6955 clang::FieldDecl *field = nullptr;
6956
6957 clang::Expr *bit_width = nullptr;
6958 if (bitfield_bit_size != 0)
6959 {
6960 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
6961 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
6962 }
6963
6964 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
6965 if (record_decl)
6966 {
6967 field = clang::FieldDecl::Create (*clang_ast,
6968 record_decl,
6969 clang::SourceLocation(),
6970 clang::SourceLocation(),
6971 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
6972 GetQualType(field_clang_type), // Field type
6973 nullptr, // TInfo *
6974 bit_width, // BitWidth
6975 false, // Mutable
6976 clang::ICIS_NoInit); // HasInit
6977
6978 if (!name)
6979 {
6980 // Determine whether this field corresponds to an anonymous
6981 // struct or union.
6982 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
6983 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
6984 if (!Rec->getDeclName()) {
6985 Rec->setAnonymousStructOrUnion(true);
6986 field->setImplicit();
6987
6988 }
6989 }
6990 }
6991
6992 if (field)
6993 {
6994 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
6995
6996 record_decl->addDecl(field);
6997
6998#ifdef LLDB_CONFIGURATION_DEBUG
6999 VerifyDecl(field);
7000#endif
7001 }
7002 }
7003 else
7004 {
7005 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7006
7007 if (class_interface_decl)
7008 {
7009 const bool is_synthesized = false;
7010
7011 field_clang_type.GetCompleteType();
7012
7013 field = clang::ObjCIvarDecl::Create (*clang_ast,
7014 class_interface_decl,
7015 clang::SourceLocation(),
7016 clang::SourceLocation(),
7017 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7018 GetQualType(field_clang_type), // Field type
7019 nullptr, // TypeSourceInfo *
7020 ConvertAccessTypeToObjCIvarAccessControl (access),
7021 bit_width,
7022 is_synthesized);
7023
7024 if (field)
7025 {
7026 class_interface_decl->addDecl(field);
7027
7028#ifdef LLDB_CONFIGURATION_DEBUG
7029 VerifyDecl(field);
7030#endif
7031 }
7032 }
7033 }
7034 return field;
7035}
7036
7037void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007038ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007039{
Greg Claytonf73034f2015-09-08 18:15:05 +00007040 if (!type)
7041 return;
7042
7043 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007044 if (!ast)
7045 return;
7046
7047 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7048
7049 if (!record_decl)
7050 return;
7051
7052 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7053
7054 IndirectFieldVector indirect_fields;
7055 clang::RecordDecl::field_iterator field_pos;
7056 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7057 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7058 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7059 {
7060 if (field_pos->isAnonymousStructOrUnion())
7061 {
7062 clang::QualType field_qual_type = field_pos->getType();
7063
7064 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7065
7066 if (!field_record_type)
7067 continue;
7068
7069 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7070
7071 if (!field_record_decl)
7072 continue;
7073
7074 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7075 di != de;
7076 ++di)
7077 {
7078 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7079 {
7080 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7081 chain[0] = *field_pos;
7082 chain[1] = nested_field_decl;
7083 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7084 record_decl,
7085 clang::SourceLocation(),
7086 nested_field_decl->getIdentifier(),
7087 nested_field_decl->getType(),
7088 chain,
7089 2);
7090
7091 indirect_field->setImplicit();
7092
7093 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7094 nested_field_decl->getAccess()));
7095
7096 indirect_fields.push_back(indirect_field);
7097 }
7098 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7099 {
7100 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
7101 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7102 chain[0] = *field_pos;
7103
7104 int chain_index = 1;
7105 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7106 nce = nested_indirect_field_decl->chain_end();
7107 nci < nce;
7108 ++nci)
7109 {
7110 chain[chain_index] = *nci;
7111 chain_index++;
7112 }
7113
7114 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7115 record_decl,
7116 clang::SourceLocation(),
7117 nested_indirect_field_decl->getIdentifier(),
7118 nested_indirect_field_decl->getType(),
7119 chain,
7120 nested_chain_size + 1);
7121
7122 indirect_field->setImplicit();
7123
7124 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7125 nested_indirect_field_decl->getAccess()));
7126
7127 indirect_fields.push_back(indirect_field);
7128 }
7129 }
7130 }
7131 }
7132
7133 // Check the last field to see if it has an incomplete array type as its
7134 // last member and if it does, the tell the record decl about it
7135 if (last_field_pos != field_end_pos)
7136 {
7137 if (last_field_pos->getType()->isIncompleteArrayType())
7138 record_decl->hasFlexibleArrayMember();
7139 }
7140
7141 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7142 ifi < ife;
7143 ++ifi)
7144 {
7145 record_decl->addDecl(*ifi);
7146 }
7147}
7148
7149void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007150ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007151{
Greg Claytonf73034f2015-09-08 18:15:05 +00007152 if (type)
7153 {
7154 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7155 if (ast)
7156 {
7157 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007158
Greg Claytonf73034f2015-09-08 18:15:05 +00007159 if (!record_decl)
7160 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00007161
Greg Claytonf73034f2015-09-08 18:15:05 +00007162 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*ast->getASTContext()));
7163 }
7164 }
Greg Claytond8d4a572015-08-11 21:38:15 +00007165}
7166
7167clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007168ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7169 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007170 AccessType access)
7171{
7172 clang::VarDecl *var_decl = nullptr;
7173
7174 if (!type.IsValid() || !var_type.IsValid())
7175 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007176 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007177 if (!ast)
7178 return nullptr;
7179
7180 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7181 if (record_decl)
7182 {
7183 var_decl = clang::VarDecl::Create (*ast->getASTContext(), // ASTContext &
7184 record_decl, // DeclContext *
7185 clang::SourceLocation(), // clang::SourceLocation StartLoc
7186 clang::SourceLocation(), // clang::SourceLocation IdLoc
7187 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7188 GetQualType(var_type), // Variable clang::QualType
7189 nullptr, // TypeSourceInfo *
7190 clang::SC_Static); // StorageClass
7191 if (var_decl)
7192 {
7193 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7194 record_decl->addDecl(var_decl);
7195
7196#ifdef LLDB_CONFIGURATION_DEBUG
7197 VerifyDecl(var_decl);
7198#endif
7199 }
7200 }
7201 return var_decl;
7202}
7203
7204
7205clang::CXXMethodDecl *
7206ClangASTContext::AddMethodToCXXRecordType (void* type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007207 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007208 lldb::AccessType access,
7209 bool is_virtual,
7210 bool is_static,
7211 bool is_inline,
7212 bool is_explicit,
7213 bool is_attr_used,
7214 bool is_artificial)
7215{
7216 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7217 return nullptr;
7218
7219 clang::QualType record_qual_type(GetCanonicalQualType(type));
7220
7221 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7222
7223 if (cxx_record_decl == nullptr)
7224 return nullptr;
7225
7226 clang::QualType method_qual_type (GetQualType(method_clang_type));
7227
7228 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7229
7230 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7231
7232 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7233
7234 if (function_type == nullptr)
7235 return nullptr;
7236
7237 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7238
7239 if (!method_function_prototype)
7240 return nullptr;
7241
7242 unsigned int num_params = method_function_prototype->getNumParams();
7243
7244 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7245 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7246
7247 if (is_artificial)
7248 return nullptr; // skip everything artificial
7249
7250 if (name[0] == '~')
7251 {
7252 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7253 cxx_record_decl,
7254 clang::SourceLocation(),
7255 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7256 method_qual_type,
7257 nullptr,
7258 is_inline,
7259 is_artificial);
7260 cxx_method_decl = cxx_dtor_decl;
7261 }
7262 else if (decl_name == cxx_record_decl->getDeclName())
7263 {
7264 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
7265 cxx_record_decl,
7266 clang::SourceLocation(),
7267 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7268 method_qual_type,
7269 nullptr, // TypeSourceInfo *
7270 is_explicit,
7271 is_inline,
7272 is_artificial,
7273 false /*is_constexpr*/);
7274 cxx_method_decl = cxx_ctor_decl;
7275 }
7276 else
7277 {
7278 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7279 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7280
7281 if (IsOperator (name, op_kind))
7282 {
7283 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
7284 {
7285 // Check the number of operator parameters. Sometimes we have
7286 // seen bad DWARF that doesn't correctly describe operators and
7287 // if we try to create a method and add it to the class, clang
7288 // will assert and crash, so we need to make sure things are
7289 // acceptable.
7290 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
7291 return nullptr;
7292 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7293 cxx_record_decl,
7294 clang::SourceLocation(),
7295 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
7296 method_qual_type,
7297 nullptr, // TypeSourceInfo *
7298 SC,
7299 is_inline,
7300 false /*is_constexpr*/,
7301 clang::SourceLocation());
7302 }
7303 else if (num_params == 0)
7304 {
7305 // Conversion operators don't take params...
7306 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
7307 cxx_record_decl,
7308 clang::SourceLocation(),
7309 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
7310 method_qual_type,
7311 nullptr, // TypeSourceInfo *
7312 is_inline,
7313 is_explicit,
7314 false /*is_constexpr*/,
7315 clang::SourceLocation());
7316 }
7317 }
7318
7319 if (cxx_method_decl == nullptr)
7320 {
7321 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7322 cxx_record_decl,
7323 clang::SourceLocation(),
7324 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
7325 method_qual_type,
7326 nullptr, // TypeSourceInfo *
7327 SC,
7328 is_inline,
7329 false /*is_constexpr*/,
7330 clang::SourceLocation());
7331 }
7332 }
7333
7334 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
7335
7336 cxx_method_decl->setAccess (access_specifier);
7337 cxx_method_decl->setVirtualAsWritten (is_virtual);
7338
7339 if (is_attr_used)
7340 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
7341
7342 // Populate the method decl with parameter decls
7343
7344 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7345
7346 for (unsigned param_index = 0;
7347 param_index < num_params;
7348 ++param_index)
7349 {
7350 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
7351 cxx_method_decl,
7352 clang::SourceLocation(),
7353 clang::SourceLocation(),
7354 nullptr, // anonymous
7355 method_function_prototype->getParamType(param_index),
7356 nullptr,
7357 clang::SC_None,
7358 nullptr));
7359 }
7360
7361 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
7362
7363 cxx_record_decl->addDecl (cxx_method_decl);
7364
7365 // Sometimes the debug info will mention a constructor (default/copy/move),
7366 // destructor, or assignment operator (copy/move) but there won't be any
7367 // version of this in the code. So we check if the function was artificially
7368 // generated and if it is trivial and this lets the compiler/backend know
7369 // that it can inline the IR for these when it needs to and we can avoid a
7370 // "missing function" error when running expressions.
7371
7372 if (is_artificial)
7373 {
7374 if (cxx_ctor_decl &&
7375 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
7376 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
7377 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
7378 {
7379 cxx_ctor_decl->setDefaulted();
7380 cxx_ctor_decl->setTrivial(true);
7381 }
7382 else if (cxx_dtor_decl)
7383 {
7384 if (cxx_record_decl->hasTrivialDestructor())
7385 {
7386 cxx_dtor_decl->setDefaulted();
7387 cxx_dtor_decl->setTrivial(true);
7388 }
7389 }
7390 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
7391 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
7392 {
7393 cxx_method_decl->setDefaulted();
7394 cxx_method_decl->setTrivial(true);
7395 }
7396 }
7397
7398#ifdef LLDB_CONFIGURATION_DEBUG
7399 VerifyDecl(cxx_method_decl);
7400#endif
7401
7402 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
7403 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
7404 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
7405 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
7406 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
7407 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
7408 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
7409 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
7410 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
7411 return cxx_method_decl;
7412}
7413
7414
7415#pragma mark C++ Base Classes
7416
7417clang::CXXBaseSpecifier *
7418ClangASTContext::CreateBaseClassSpecifier (void* type, AccessType access, bool is_virtual, bool base_of_class)
7419{
7420 if (type)
7421 return new clang::CXXBaseSpecifier (clang::SourceRange(),
7422 is_virtual,
7423 base_of_class,
7424 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
7425 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
7426 clang::SourceLocation());
7427 return nullptr;
7428}
7429
7430void
7431ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
7432{
7433 for (unsigned i=0; i<num_base_classes; ++i)
7434 {
7435 delete base_classes[i];
7436 base_classes[i] = nullptr;
7437 }
7438}
7439
7440bool
7441ClangASTContext::SetBaseClassesForClassType (void* type, clang::CXXBaseSpecifier const * const *base_classes,
7442 unsigned num_base_classes)
7443{
7444 if (type)
7445 {
7446 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
7447 if (cxx_record_decl)
7448 {
7449 cxx_record_decl->setBases(base_classes, num_base_classes);
7450 return true;
7451 }
7452 }
7453 return false;
7454}
7455
7456bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007457ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007458{
Greg Claytonf73034f2015-09-08 18:15:05 +00007459 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007460 if (!ast)
7461 return false;
7462 clang::ASTContext* clang_ast = ast->getASTContext();
7463
7464 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
7465 {
7466 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7467 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
7468 if (class_interface_decl && super_interface_decl)
7469 {
7470 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
7471 return true;
7472 }
7473 }
7474 return false;
7475}
7476
7477bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007478ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007479 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007480 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007481 clang::ObjCIvarDecl *ivar_decl,
7482 const char *property_setter_name,
7483 const char *property_getter_name,
7484 uint32_t property_attributes,
7485 ClangASTMetadata *metadata)
7486{
7487 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
7488 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00007489 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007490 if (!ast)
7491 return false;
7492 clang::ASTContext* clang_ast = ast->getASTContext();
7493
7494 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7495
7496 if (class_interface_decl)
7497 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007498 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00007499
7500 if (property_clang_type.IsValid())
7501 property_clang_type_to_access = property_clang_type;
7502 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007503 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007504
7505 if (class_interface_decl && property_clang_type_to_access.IsValid())
7506 {
7507 clang::TypeSourceInfo *prop_type_source;
7508 if (ivar_decl)
7509 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
7510 else
7511 prop_type_source = clang_ast->getTrivialTypeSourceInfo (GetQualType(property_clang_type));
7512
7513 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create (*clang_ast,
7514 class_interface_decl,
7515 clang::SourceLocation(), // Source Location
7516 &clang_ast->Idents.get(property_name),
7517 clang::SourceLocation(), //Source Location for AT
7518 clang::SourceLocation(), //Source location for (
7519 ivar_decl ? ivar_decl->getType() : ClangASTContext::GetQualType(property_clang_type),
7520 prop_type_source);
7521
7522 if (property_decl)
7523 {
7524 if (metadata)
7525 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
7526
7527 class_interface_decl->addDecl (property_decl);
7528
7529 clang::Selector setter_sel, getter_sel;
7530
7531 if (property_setter_name != nullptr)
7532 {
7533 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
7534 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
7535 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7536 }
7537 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
7538 {
7539 std::string setter_sel_string("set");
7540 setter_sel_string.push_back(::toupper(property_name[0]));
7541 setter_sel_string.append(&property_name[1]);
7542 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
7543 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7544 }
7545 property_decl->setSetterName(setter_sel);
7546 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
7547
7548 if (property_getter_name != nullptr)
7549 {
7550 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
7551 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7552 }
7553 else
7554 {
7555 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
7556 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7557 }
7558 property_decl->setGetterName(getter_sel);
7559 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
7560
7561 if (ivar_decl)
7562 property_decl->setPropertyIvarDecl (ivar_decl);
7563
7564 if (property_attributes & DW_APPLE_PROPERTY_readonly)
7565 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
7566 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
7567 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
7568 if (property_attributes & DW_APPLE_PROPERTY_assign)
7569 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
7570 if (property_attributes & DW_APPLE_PROPERTY_retain)
7571 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
7572 if (property_attributes & DW_APPLE_PROPERTY_copy)
7573 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
7574 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
7575 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
7576
7577 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
7578 {
7579 const bool isInstance = true;
7580 const bool isVariadic = false;
7581 const bool isSynthesized = false;
7582 const bool isImplicitlyDeclared = true;
7583 const bool isDefined = false;
7584 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7585 const bool HasRelatedResultType = false;
7586
7587 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create (*clang_ast,
7588 clang::SourceLocation(),
7589 clang::SourceLocation(),
7590 getter_sel,
7591 GetQualType(property_clang_type_to_access),
7592 nullptr,
7593 class_interface_decl,
7594 isInstance,
7595 isVariadic,
7596 isSynthesized,
7597 isImplicitlyDeclared,
7598 isDefined,
7599 impControl,
7600 HasRelatedResultType);
7601
7602 if (getter && metadata)
7603 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
7604
7605 if (getter)
7606 {
7607 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
7608
7609 class_interface_decl->addDecl(getter);
7610 }
7611 }
7612
7613 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
7614 {
7615 clang::QualType result_type = clang_ast->VoidTy;
7616
7617 const bool isInstance = true;
7618 const bool isVariadic = false;
7619 const bool isSynthesized = false;
7620 const bool isImplicitlyDeclared = true;
7621 const bool isDefined = false;
7622 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7623 const bool HasRelatedResultType = false;
7624
7625 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
7626 clang::SourceLocation(),
7627 clang::SourceLocation(),
7628 setter_sel,
7629 result_type,
7630 nullptr,
7631 class_interface_decl,
7632 isInstance,
7633 isVariadic,
7634 isSynthesized,
7635 isImplicitlyDeclared,
7636 isDefined,
7637 impControl,
7638 HasRelatedResultType);
7639
7640 if (setter && metadata)
7641 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
7642
7643 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
7644
7645 params.push_back (clang::ParmVarDecl::Create (*clang_ast,
7646 setter,
7647 clang::SourceLocation(),
7648 clang::SourceLocation(),
7649 nullptr, // anonymous
7650 GetQualType(property_clang_type_to_access),
7651 nullptr,
7652 clang::SC_Auto,
7653 nullptr));
7654
7655 if (setter)
7656 {
7657 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7658
7659 class_interface_decl->addDecl(setter);
7660 }
7661 }
7662
7663 return true;
7664 }
7665 }
7666 }
7667 return false;
7668}
7669
7670bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007671ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00007672{
7673 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7674 if (class_interface_decl)
7675 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
7676 return false;
7677}
7678
7679
7680clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007681ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007682 const char *name, // the full symbol name as seen in the symbol table (void* type, "-[NString stringWithCString:]")
Greg Claytona1e5dc82015-08-11 22:53:00 +00007683 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007684 lldb::AccessType access,
7685 bool is_artificial)
7686{
7687 if (!type || !method_clang_type.IsValid())
7688 return nullptr;
7689
7690 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
7691
7692 if (class_interface_decl == nullptr)
7693 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007694 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7695 if (lldb_ast == nullptr)
7696 return nullptr;
7697 clang::ASTContext *ast = lldb_ast->getASTContext();
7698
Greg Claytond8d4a572015-08-11 21:38:15 +00007699 const char *selector_start = ::strchr (name, ' ');
7700 if (selector_start == nullptr)
7701 return nullptr;
7702
7703 selector_start++;
7704 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
7705
7706 size_t len = 0;
7707 const char *start;
7708 //printf ("name = '%s'\n", name);
7709
7710 unsigned num_selectors_with_args = 0;
7711 for (start = selector_start;
7712 start && *start != '\0' && *start != ']';
7713 start += len)
7714 {
7715 len = ::strcspn(start, ":]");
7716 bool has_arg = (start[len] == ':');
7717 if (has_arg)
7718 ++num_selectors_with_args;
7719 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
7720 if (has_arg)
7721 len += 1;
7722 }
7723
7724
7725 if (selector_idents.size() == 0)
7726 return nullptr;
7727
7728 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
7729 selector_idents.data());
7730
7731 clang::QualType method_qual_type (GetQualType(method_clang_type));
7732
7733 // Populate the method decl with parameter decls
7734 const clang::Type *method_type(method_qual_type.getTypePtr());
7735
7736 if (method_type == nullptr)
7737 return nullptr;
7738
7739 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
7740
7741 if (!method_function_prototype)
7742 return nullptr;
7743
7744
7745 bool is_variadic = false;
7746 bool is_synthesized = false;
7747 bool is_defined = false;
7748 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
7749
7750 const unsigned num_args = method_function_prototype->getNumParams();
7751
7752 if (num_args != num_selectors_with_args)
7753 return nullptr; // some debug information is corrupt. We are not going to deal with it.
7754
7755 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create (*ast,
7756 clang::SourceLocation(), // beginLoc,
7757 clang::SourceLocation(), // endLoc,
7758 method_selector,
7759 method_function_prototype->getReturnType(),
7760 nullptr, // TypeSourceInfo *ResultTInfo,
7761 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(GetQualType(type)),
7762 name[0] == '-',
7763 is_variadic,
7764 is_synthesized,
7765 true, // is_implicitly_declared; we force this to true because we don't have source locations
7766 is_defined,
7767 imp_control,
7768 false /*has_related_result_type*/);
7769
7770
7771 if (objc_method_decl == nullptr)
7772 return nullptr;
7773
7774 if (num_args > 0)
7775 {
7776 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7777
7778 for (unsigned param_index = 0; param_index < num_args; ++param_index)
7779 {
7780 params.push_back (clang::ParmVarDecl::Create (*ast,
7781 objc_method_decl,
7782 clang::SourceLocation(),
7783 clang::SourceLocation(),
7784 nullptr, // anonymous
7785 method_function_prototype->getParamType(param_index),
7786 nullptr,
7787 clang::SC_Auto,
7788 nullptr));
7789 }
7790
7791 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7792 }
7793
7794 class_interface_decl->addDecl (objc_method_decl);
7795
7796#ifdef LLDB_CONFIGURATION_DEBUG
7797 VerifyDecl(objc_method_decl);
7798#endif
7799
7800 return objc_method_decl;
7801}
7802
7803bool
7804ClangASTContext::SetHasExternalStorage (void* type, bool has_extern)
7805{
7806 if (!type)
7807 return false;
7808
7809 clang::QualType qual_type (GetCanonicalQualType(type));
7810
7811 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7812 switch (type_class)
7813 {
7814 case clang::Type::Record:
7815 {
7816 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7817 if (cxx_record_decl)
7818 {
7819 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
7820 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
7821 return true;
7822 }
7823 }
7824 break;
7825
7826 case clang::Type::Enum:
7827 {
7828 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
7829 if (enum_decl)
7830 {
7831 enum_decl->setHasExternalLexicalStorage (has_extern);
7832 enum_decl->setHasExternalVisibleStorage (has_extern);
7833 return true;
7834 }
7835 }
7836 break;
7837
7838 case clang::Type::ObjCObject:
7839 case clang::Type::ObjCInterface:
7840 {
7841 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
7842 assert (objc_class_type);
7843 if (objc_class_type)
7844 {
7845 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
7846
7847 if (class_interface_decl)
7848 {
7849 class_interface_decl->setHasExternalLexicalStorage (has_extern);
7850 class_interface_decl->setHasExternalVisibleStorage (has_extern);
7851 return true;
7852 }
7853 }
7854 }
7855 break;
7856
7857 case clang::Type::Typedef:
7858 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
7859
7860 case clang::Type::Elaborated:
7861 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
7862
7863 case clang::Type::Paren:
7864 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
7865
7866 default:
7867 break;
7868 }
7869 return false;
7870}
7871
7872
7873#pragma mark TagDecl
7874
7875bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007876ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007877{
7878 if (type)
7879 {
7880
7881 clang::QualType qual_type (GetQualType(type));
7882 const clang::Type *t = qual_type.getTypePtr();
7883 if (t)
7884 {
7885 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(t);
7886 if (tag_type)
7887 {
7888 clang::TagDecl *tag_decl = tag_type->getDecl();
7889 if (tag_decl)
7890 {
7891 tag_decl->startDefinition();
7892 return true;
7893 }
7894 }
7895
7896 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(t);
7897 if (object_type)
7898 {
7899 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
7900 if (interface_decl)
7901 {
7902 interface_decl->startDefinition();
7903 return true;
7904 }
7905 }
7906 }
7907 }
7908 return false;
7909}
7910
7911bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007912ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007913{
7914 if (type)
7915 {
7916 clang::QualType qual_type (GetQualType(type));
7917 if (qual_type.isNull())
7918 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00007919 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7920 if (lldb_ast == nullptr)
7921 return false;
7922 clang::ASTContext *ast = lldb_ast->getASTContext();
7923
Greg Claytond8d4a572015-08-11 21:38:15 +00007924 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7925
7926 if (cxx_record_decl)
7927 {
7928 cxx_record_decl->completeDefinition();
7929
7930 return true;
7931 }
7932
7933 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(qual_type.getTypePtr());
7934
7935 if (enutype)
7936 {
7937 clang::EnumDecl *enum_decl = enutype->getDecl();
7938
7939 if (enum_decl)
7940 {
7941 /// TODO This really needs to be fixed.
7942
7943 unsigned NumPositiveBits = 1;
7944 unsigned NumNegativeBits = 0;
7945
7946 clang::QualType promotion_qual_type;
7947 // If the enum integer type is less than an integer in bit width,
7948 // then we must promote it to an integer size.
7949 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
7950 {
7951 if (enum_decl->getIntegerType()->isSignedIntegerType())
7952 promotion_qual_type = ast->IntTy;
7953 else
7954 promotion_qual_type = ast->UnsignedIntTy;
7955 }
7956 else
7957 promotion_qual_type = enum_decl->getIntegerType();
7958
7959 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
7960 return true;
7961 }
7962 }
7963 }
7964 return false;
7965}
7966
Greg Claytond8d4a572015-08-11 21:38:15 +00007967bool
Greg Clayton8b4edba2015-08-14 20:02:05 +00007968ClangASTContext::AddEnumerationValueToEnumerationType (void* type,
7969 const CompilerType &enumerator_clang_type,
7970 const Declaration &decl,
7971 const char *name,
7972 int64_t enum_value,
7973 uint32_t enum_value_bit_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00007974{
7975 if (type && enumerator_clang_type.IsValid() && name && name[0])
7976 {
7977 clang::QualType enum_qual_type (GetCanonicalQualType(type));
7978
7979 bool is_signed = false;
7980 enumerator_clang_type.IsIntegerType (is_signed);
7981 const clang::Type *clang_type = enum_qual_type.getTypePtr();
7982 if (clang_type)
7983 {
7984 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
7985
7986 if (enutype)
7987 {
7988 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
7989 enum_llvm_apsint = enum_value;
7990 clang::EnumConstantDecl *enumerator_decl =
7991 clang::EnumConstantDecl::Create (*getASTContext(),
7992 enutype->getDecl(),
7993 clang::SourceLocation(),
7994 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
7995 GetQualType(enumerator_clang_type),
7996 nullptr,
7997 enum_llvm_apsint);
7998
7999 if (enumerator_decl)
8000 {
8001 enutype->getDecl()->addDecl(enumerator_decl);
8002
8003#ifdef LLDB_CONFIGURATION_DEBUG
8004 VerifyDecl(enumerator_decl);
8005#endif
8006
8007 return true;
8008 }
8009 }
8010 }
8011 }
8012 return false;
8013}
8014
Greg Claytona1e5dc82015-08-11 22:53:00 +00008015CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00008016ClangASTContext::GetEnumerationIntegerType (void* type)
8017{
8018 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8019 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8020 if (clang_type)
8021 {
8022 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8023 if (enutype)
8024 {
8025 clang::EnumDecl *enum_decl = enutype->getDecl();
8026 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008027 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008028 }
8029 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008030 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008031}
8032
Greg Claytona1e5dc82015-08-11 22:53:00 +00008033CompilerType
8034ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008035{
8036 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8037 {
Greg Claytonf73034f2015-09-08 18:15:05 +00008038 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008039 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008040 return CompilerType();
8041 return CompilerType (ast->getASTContext(),
Greg Claytond8d4a572015-08-11 21:38:15 +00008042 ast->getASTContext()->getMemberPointerType (GetQualType(pointee_type),
8043 GetQualType(type).getTypePtr()));
8044 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008045 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008046}
8047
8048
8049size_t
8050ClangASTContext::ConvertStringToFloatValue (void* type, const char *s, uint8_t *dst, size_t dst_size)
8051{
8052 if (type)
8053 {
8054 clang::QualType qual_type (GetCanonicalQualType(type));
8055 uint32_t count = 0;
8056 bool is_complex = false;
8057 if (IsFloatingPointType (type, count, is_complex))
8058 {
8059 // TODO: handle complex and vector types
8060 if (count != 1)
8061 return false;
8062
8063 llvm::StringRef s_sref(s);
8064 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8065
8066 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8067 const uint64_t byte_size = bit_size / 8;
8068 if (dst_size >= byte_size)
8069 {
8070 if (bit_size == sizeof(float)*8)
8071 {
8072 float float32 = ap_float.convertToFloat();
8073 ::memcpy (dst, &float32, byte_size);
8074 return byte_size;
8075 }
8076 else if (bit_size >= 64)
8077 {
8078 llvm::APInt ap_int(ap_float.bitcastToAPInt());
8079 ::memcpy (dst, ap_int.getRawData(), byte_size);
8080 return byte_size;
8081 }
8082 }
8083 }
8084 }
8085 return 0;
8086}
8087
8088
8089
8090//----------------------------------------------------------------------
8091// Dumping types
8092//----------------------------------------------------------------------
8093#define DEPTH_INCREMENT 2
8094
8095void
8096ClangASTContext::DumpValue (void* type, ExecutionContext *exe_ctx,
8097 Stream *s,
8098 lldb::Format format,
8099 const lldb_private::DataExtractor &data,
8100 lldb::offset_t data_byte_offset,
8101 size_t data_byte_size,
8102 uint32_t bitfield_bit_size,
8103 uint32_t bitfield_bit_offset,
8104 bool show_types,
8105 bool show_summary,
8106 bool verbose,
8107 uint32_t depth)
8108{
8109 if (!type)
8110 return;
8111
8112 clang::QualType qual_type(GetQualType(type));
8113 switch (qual_type->getTypeClass())
8114 {
8115 case clang::Type::Record:
8116 if (GetCompleteType(type))
8117 {
8118 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8119 const clang::RecordDecl *record_decl = record_type->getDecl();
8120 assert(record_decl);
8121 uint32_t field_bit_offset = 0;
8122 uint32_t field_byte_offset = 0;
8123 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8124 uint32_t child_idx = 0;
8125
8126 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8127 if (cxx_record_decl)
8128 {
8129 // We might have base classes to print out first
8130 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8131 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8132 base_class != base_class_end;
8133 ++base_class)
8134 {
8135 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8136
8137 // Skip empty base classes
8138 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8139 continue;
8140
8141 if (base_class->isVirtual())
8142 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8143 else
8144 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8145 field_byte_offset = field_bit_offset / 8;
8146 assert (field_bit_offset % 8 == 0);
8147 if (child_idx == 0)
8148 s->PutChar('{');
8149 else
8150 s->PutChar(',');
8151
8152 clang::QualType base_class_qual_type = base_class->getType();
8153 std::string base_class_type_name(base_class_qual_type.getAsString());
8154
8155 // Indent and print the base class type name
8156 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8157
8158 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8159
8160 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008161 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008162 base_clang_type.DumpValue (exe_ctx,
8163 s, // Stream to dump to
8164 base_clang_type.GetFormat(), // The format with which to display the member
8165 data, // Data buffer containing all bytes for this type
8166 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8167 base_class_type_info.Width / 8, // Size of this type in bytes
8168 0, // Bitfield bit size
8169 0, // Bitfield bit offset
8170 show_types, // Boolean indicating if we should show the variable types
8171 show_summary, // Boolean indicating if we should show a summary for the current type
8172 verbose, // Verbose output?
8173 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8174
8175 ++child_idx;
8176 }
8177 }
8178 uint32_t field_idx = 0;
8179 clang::RecordDecl::field_iterator field, field_end;
8180 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8181 {
8182 // Print the starting squiggly bracket (if this is the
8183 // first member) or comma (for member 2 and beyond) for
8184 // the struct/union/class member.
8185 if (child_idx == 0)
8186 s->PutChar('{');
8187 else
8188 s->PutChar(',');
8189
8190 // Indent
8191 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8192
8193 clang::QualType field_type = field->getType();
8194 // Print the member type if requested
8195 // Figure out the type byte size (field_type_info.first) and
8196 // alignment (field_type_info.second) from the AST context.
8197 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8198 assert(field_idx < record_layout.getFieldCount());
8199 // Figure out the field offset within the current struct/union/class type
8200 field_bit_offset = record_layout.getFieldOffset (field_idx);
8201 field_byte_offset = field_bit_offset / 8;
8202 uint32_t field_bitfield_bit_size = 0;
8203 uint32_t field_bitfield_bit_offset = 0;
8204 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8205 field_bitfield_bit_offset = field_bit_offset % 8;
8206
8207 if (show_types)
8208 {
8209 std::string field_type_name(field_type.getAsString());
8210 if (field_bitfield_bit_size > 0)
8211 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
8212 else
8213 s->Printf("(%s) ", field_type_name.c_str());
8214 }
8215 // Print the member name and equal sign
8216 s->Printf("%s = ", field->getNameAsString().c_str());
8217
8218
8219 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008220 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008221 field_clang_type.DumpValue (exe_ctx,
8222 s, // Stream to dump to
8223 field_clang_type.GetFormat(), // The format with which to display the member
8224 data, // Data buffer containing all bytes for this type
8225 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8226 field_type_info.Width / 8, // Size of this type in bytes
8227 field_bitfield_bit_size, // Bitfield bit size
8228 field_bitfield_bit_offset, // Bitfield bit offset
8229 show_types, // Boolean indicating if we should show the variable types
8230 show_summary, // Boolean indicating if we should show a summary for the current type
8231 verbose, // Verbose output?
8232 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8233 }
8234
8235 // Indent the trailing squiggly bracket
8236 if (child_idx > 0)
8237 s->Printf("\n%*s}", depth, "");
8238 }
8239 return;
8240
8241 case clang::Type::Enum:
8242 if (GetCompleteType(type))
8243 {
8244 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8245 const clang::EnumDecl *enum_decl = enutype->getDecl();
8246 assert(enum_decl);
8247 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8248 lldb::offset_t offset = data_byte_offset;
8249 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
8250 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8251 {
8252 if (enum_pos->getInitVal() == enum_value)
8253 {
8254 s->Printf("%s", enum_pos->getNameAsString().c_str());
8255 return;
8256 }
8257 }
8258 // If we have gotten here we didn't get find the enumerator in the
8259 // enum decl, so just print the integer.
8260 s->Printf("%" PRIi64, enum_value);
8261 }
8262 return;
8263
8264 case clang::Type::ConstantArray:
8265 {
8266 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
8267 bool is_array_of_characters = false;
8268 clang::QualType element_qual_type = array->getElementType();
8269
8270 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
8271 if (canonical_type)
8272 is_array_of_characters = canonical_type->isCharType();
8273
8274 const uint64_t element_count = array->getSize().getLimitedValue();
8275
8276 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
8277
8278 uint32_t element_idx = 0;
8279 uint32_t element_offset = 0;
8280 uint64_t element_byte_size = field_type_info.Width / 8;
8281 uint32_t element_stride = element_byte_size;
8282
8283 if (is_array_of_characters)
8284 {
8285 s->PutChar('"');
8286 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8287 s->PutChar('"');
8288 return;
8289 }
8290 else
8291 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008292 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008293 lldb::Format element_format = element_clang_type.GetFormat();
8294
8295 for (element_idx = 0; element_idx < element_count; ++element_idx)
8296 {
8297 // Print the starting squiggly bracket (if this is the
8298 // first member) or comman (for member 2 and beyong) for
8299 // the struct/union/class member.
8300 if (element_idx == 0)
8301 s->PutChar('{');
8302 else
8303 s->PutChar(',');
8304
8305 // Indent and print the index
8306 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
8307
8308 // Figure out the field offset within the current struct/union/class type
8309 element_offset = element_idx * element_stride;
8310
8311 // Dump the value of the member
8312 element_clang_type.DumpValue (exe_ctx,
8313 s, // Stream to dump to
8314 element_format, // The format with which to display the element
8315 data, // Data buffer containing all bytes for this type
8316 data_byte_offset + element_offset,// Offset into "data" where to grab value from
8317 element_byte_size, // Size of this type in bytes
8318 0, // Bitfield bit size
8319 0, // Bitfield bit offset
8320 show_types, // Boolean indicating if we should show the variable types
8321 show_summary, // Boolean indicating if we should show a summary for the current type
8322 verbose, // Verbose output?
8323 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8324 }
8325
8326 // Indent the trailing squiggly bracket
8327 if (element_idx > 0)
8328 s->Printf("\n%*s}", depth, "");
8329 }
8330 }
8331 return;
8332
8333 case clang::Type::Typedef:
8334 {
8335 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
8336
Greg Claytona1e5dc82015-08-11 22:53:00 +00008337 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008338 lldb::Format typedef_format = typedef_clang_type.GetFormat();
8339 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8340 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8341
8342 return typedef_clang_type.DumpValue (exe_ctx,
8343 s, // Stream to dump to
8344 typedef_format, // The format with which to display the element
8345 data, // Data buffer containing all bytes for this type
8346 data_byte_offset, // Offset into "data" where to grab value from
8347 typedef_byte_size, // Size of this type in bytes
8348 bitfield_bit_size, // Bitfield bit size
8349 bitfield_bit_offset,// Bitfield bit offset
8350 show_types, // Boolean indicating if we should show the variable types
8351 show_summary, // Boolean indicating if we should show a summary for the current type
8352 verbose, // Verbose output?
8353 depth); // Scope depth for any types that have children
8354 }
8355 break;
8356
8357 case clang::Type::Elaborated:
8358 {
8359 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008360 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008361 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
8362 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
8363 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
8364
8365 return elaborated_clang_type.DumpValue (exe_ctx,
8366 s, // Stream to dump to
8367 elaborated_format, // The format with which to display the element
8368 data, // Data buffer containing all bytes for this type
8369 data_byte_offset, // Offset into "data" where to grab value from
8370 elaborated_byte_size, // Size of this type in bytes
8371 bitfield_bit_size, // Bitfield bit size
8372 bitfield_bit_offset,// Bitfield bit offset
8373 show_types, // Boolean indicating if we should show the variable types
8374 show_summary, // Boolean indicating if we should show a summary for the current type
8375 verbose, // Verbose output?
8376 depth); // Scope depth for any types that have children
8377 }
8378 break;
8379
8380 case clang::Type::Paren:
8381 {
8382 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008383 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008384
8385 lldb::Format desugar_format = desugar_clang_type.GetFormat();
8386 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
8387 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
8388
8389 return desugar_clang_type.DumpValue (exe_ctx,
8390 s, // Stream to dump to
8391 desugar_format, // The format with which to display the element
8392 data, // Data buffer containing all bytes for this type
8393 data_byte_offset, // Offset into "data" where to grab value from
8394 desugar_byte_size, // Size of this type in bytes
8395 bitfield_bit_size, // Bitfield bit size
8396 bitfield_bit_offset,// Bitfield bit offset
8397 show_types, // Boolean indicating if we should show the variable types
8398 show_summary, // Boolean indicating if we should show a summary for the current type
8399 verbose, // Verbose output?
8400 depth); // Scope depth for any types that have children
8401 }
8402 break;
8403
8404 default:
8405 // We are down to a scalar type that we just need to display.
8406 data.Dump(s,
8407 data_byte_offset,
8408 format,
8409 data_byte_size,
8410 1,
8411 UINT32_MAX,
8412 LLDB_INVALID_ADDRESS,
8413 bitfield_bit_size,
8414 bitfield_bit_offset);
8415
8416 if (show_summary)
8417 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
8418 break;
8419 }
8420}
8421
8422
8423
8424
8425bool
8426ClangASTContext::DumpTypeValue (void* type, Stream *s,
8427 lldb::Format format,
8428 const lldb_private::DataExtractor &data,
8429 lldb::offset_t byte_offset,
8430 size_t byte_size,
8431 uint32_t bitfield_bit_size,
8432 uint32_t bitfield_bit_offset,
8433 ExecutionContextScope *exe_scope)
8434{
8435 if (!type)
8436 return false;
8437 if (IsAggregateType(type))
8438 {
8439 return false;
8440 }
8441 else
8442 {
8443 clang::QualType qual_type(GetQualType(type));
8444
8445 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8446 switch (type_class)
8447 {
8448 case clang::Type::Typedef:
8449 {
8450 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008451 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008452 if (format == eFormatDefault)
8453 format = typedef_clang_type.GetFormat();
8454 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8455 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8456
8457 return typedef_clang_type.DumpTypeValue (s,
8458 format, // The format with which to display the element
8459 data, // Data buffer containing all bytes for this type
8460 byte_offset, // Offset into "data" where to grab value from
8461 typedef_byte_size, // Size of this type in bytes
8462 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
8463 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
8464 exe_scope);
8465 }
8466 break;
8467
8468 case clang::Type::Enum:
8469 // If our format is enum or default, show the enumeration value as
8470 // its enumeration string value, else just display it as requested.
8471 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
8472 {
8473 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8474 const clang::EnumDecl *enum_decl = enutype->getDecl();
8475 assert(enum_decl);
8476 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8477 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
8478 lldb::offset_t offset = byte_offset;
8479 if (is_signed)
8480 {
8481 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8482 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8483 {
8484 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
8485 {
8486 s->PutCString (enum_pos->getNameAsString().c_str());
8487 return true;
8488 }
8489 }
8490 // If we have gotten here we didn't get find the enumerator in the
8491 // enum decl, so just print the integer.
8492 s->Printf("%" PRIi64, enum_svalue);
8493 }
8494 else
8495 {
8496 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&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().getZExtValue() == enum_uvalue)
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("%" PRIu64, enum_uvalue);
8508 }
8509 return true;
8510 }
8511 // format was not enum, just fall through and dump the value as requested....
8512
8513 default:
8514 // We are down to a scalar type that we just need to display.
8515 {
8516 uint32_t item_count = 1;
8517 // A few formats, we might need to modify our size and count for depending
8518 // on how we are trying to display the value...
8519 switch (format)
8520 {
8521 default:
8522 case eFormatBoolean:
8523 case eFormatBinary:
8524 case eFormatComplex:
8525 case eFormatCString: // NULL terminated C strings
8526 case eFormatDecimal:
8527 case eFormatEnum:
8528 case eFormatHex:
8529 case eFormatHexUppercase:
8530 case eFormatFloat:
8531 case eFormatOctal:
8532 case eFormatOSType:
8533 case eFormatUnsigned:
8534 case eFormatPointer:
8535 case eFormatVectorOfChar:
8536 case eFormatVectorOfSInt8:
8537 case eFormatVectorOfUInt8:
8538 case eFormatVectorOfSInt16:
8539 case eFormatVectorOfUInt16:
8540 case eFormatVectorOfSInt32:
8541 case eFormatVectorOfUInt32:
8542 case eFormatVectorOfSInt64:
8543 case eFormatVectorOfUInt64:
8544 case eFormatVectorOfFloat32:
8545 case eFormatVectorOfFloat64:
8546 case eFormatVectorOfUInt128:
8547 break;
8548
8549 case eFormatChar:
8550 case eFormatCharPrintable:
8551 case eFormatCharArray:
8552 case eFormatBytes:
8553 case eFormatBytesWithASCII:
8554 item_count = byte_size;
8555 byte_size = 1;
8556 break;
8557
8558 case eFormatUnicode16:
8559 item_count = byte_size / 2;
8560 byte_size = 2;
8561 break;
8562
8563 case eFormatUnicode32:
8564 item_count = byte_size / 4;
8565 byte_size = 4;
8566 break;
8567 }
8568 return data.Dump (s,
8569 byte_offset,
8570 format,
8571 byte_size,
8572 item_count,
8573 UINT32_MAX,
8574 LLDB_INVALID_ADDRESS,
8575 bitfield_bit_size,
8576 bitfield_bit_offset,
8577 exe_scope);
8578 }
8579 break;
8580 }
8581 }
8582 return 0;
8583}
8584
8585
8586
8587void
8588ClangASTContext::DumpSummary (void* type, ExecutionContext *exe_ctx,
8589 Stream *s,
8590 const lldb_private::DataExtractor &data,
8591 lldb::offset_t data_byte_offset,
8592 size_t data_byte_size)
8593{
8594 uint32_t length = 0;
8595 if (IsCStringType (type, length))
8596 {
8597 if (exe_ctx)
8598 {
8599 Process *process = exe_ctx->GetProcessPtr();
8600 if (process)
8601 {
8602 lldb::offset_t offset = data_byte_offset;
8603 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
8604 std::vector<uint8_t> buf;
8605 if (length > 0)
8606 buf.resize (length);
8607 else
8608 buf.resize (256);
8609
8610 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
8611 buf.back() = '\0';
8612 size_t bytes_read;
8613 size_t total_cstr_len = 0;
8614 Error error;
8615 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
8616 {
8617 const size_t len = strlen((const char *)&buf.front());
8618 if (len == 0)
8619 break;
8620 if (total_cstr_len == 0)
8621 s->PutCString (" \"");
8622 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8623 total_cstr_len += len;
8624 if (len < buf.size())
8625 break;
8626 pointer_address += total_cstr_len;
8627 }
8628 if (total_cstr_len > 0)
8629 s->PutChar ('"');
8630 }
8631 }
8632 }
8633}
8634
8635void
8636ClangASTContext::DumpTypeDescription (void* type)
8637{
8638 StreamFile s (stdout, false);
8639 DumpTypeDescription (&s);
8640 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
8641 if (metadata)
8642 {
8643 metadata->Dump (&s);
8644 }
8645}
8646
8647void
8648ClangASTContext::DumpTypeDescription (void* type, Stream *s)
8649{
8650 if (type)
8651 {
8652 clang::QualType qual_type(GetQualType(type));
8653
8654 llvm::SmallVector<char, 1024> buf;
8655 llvm::raw_svector_ostream llvm_ostrm (buf);
8656
8657 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8658 switch (type_class)
8659 {
8660 case clang::Type::ObjCObject:
8661 case clang::Type::ObjCInterface:
8662 {
8663 GetCompleteType(type);
8664
8665 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8666 assert (objc_class_type);
8667 if (objc_class_type)
8668 {
8669 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8670 if (class_interface_decl)
8671 {
8672 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
8673 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
8674 }
8675 }
8676 }
8677 break;
8678
8679 case clang::Type::Typedef:
8680 {
8681 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
8682 if (typedef_type)
8683 {
8684 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
8685 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
8686 if (!clang_typedef_name.empty())
8687 {
8688 s->PutCString ("typedef ");
8689 s->PutCString (clang_typedef_name.c_str());
8690 }
8691 }
8692 }
8693 break;
8694
8695 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008696 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008697 return;
8698
8699 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008700 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008701 return;
8702
8703 case clang::Type::Record:
8704 {
8705 GetCompleteType(type);
8706
8707 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8708 const clang::RecordDecl *record_decl = record_type->getDecl();
8709 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8710
8711 if (cxx_record_decl)
8712 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8713 else
8714 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8715 }
8716 break;
8717
8718 default:
8719 {
8720 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
8721 if (tag_type)
8722 {
8723 clang::TagDecl *tag_decl = tag_type->getDecl();
8724 if (tag_decl)
8725 tag_decl->print(llvm_ostrm, 0);
8726 }
8727 else
8728 {
8729 std::string clang_type_name(qual_type.getAsString());
8730 if (!clang_type_name.empty())
8731 s->PutCString (clang_type_name.c_str());
8732 }
8733 }
8734 }
8735
Greg Claytond8d4a572015-08-11 21:38:15 +00008736 if (buf.size() > 0)
8737 {
8738 s->Write (buf.data(), buf.size());
8739 }
8740 }
8741}
Greg Clayton8b4edba2015-08-14 20:02:05 +00008742
Greg Clayton8b4edba2015-08-14 20:02:05 +00008743clang::ClassTemplateDecl *
Greg Clayton6071e6f2015-08-26 22:57:51 +00008744ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008745 lldb::AccessType access_type,
8746 const char *parent_name,
8747 int tag_decl_kind,
8748 const ClangASTContext::TemplateParameterInfos &template_param_infos)
8749{
8750 if (template_param_infos.IsValid())
8751 {
8752 std::string template_basename(parent_name);
8753 template_basename.erase (template_basename.find('<'));
8754
8755 return CreateClassTemplateDecl (decl_ctx,
8756 access_type,
8757 template_basename.c_str(),
8758 tag_decl_kind,
8759 template_param_infos);
8760 }
8761 return NULL;
8762}
8763
Greg Clayton6dc8d582015-08-18 22:32:36 +00008764void
8765ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl)
8766{
8767 ClangASTContext *ast = (ClangASTContext *)baton;
8768 SymbolFile *sym_file = ast->GetSymbolFile();
8769 if (sym_file)
8770 {
8771 CompilerType clang_type = GetTypeForDecl (decl);
8772 if (clang_type)
8773 sym_file->CompleteType (clang_type);
8774 }
8775}
8776
8777void
8778ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
8779{
8780 ClangASTContext *ast = (ClangASTContext *)baton;
8781 SymbolFile *sym_file = ast->GetSymbolFile();
8782 if (sym_file)
8783 {
8784 CompilerType clang_type = GetTypeForDecl (decl);
8785 if (clang_type)
8786 sym_file->CompleteType (clang_type);
8787 }
8788}
Greg Clayton8b4edba2015-08-14 20:02:05 +00008789
Greg Clayton261ac3f2015-08-28 01:01:03 +00008790
8791DWARFASTParser *
8792ClangASTContext::GetDWARFParser ()
8793{
8794 if (!m_dwarf_ast_parser_ap)
8795 m_dwarf_ast_parser_ap.reset(new DWARFASTParserClang(*this));
8796 return m_dwarf_ast_parser_ap.get();
8797}
8798
8799
Greg Clayton8b4edba2015-08-14 20:02:05 +00008800bool
Greg Clayton6dc8d582015-08-18 22:32:36 +00008801ClangASTContext::LayoutRecordType(void *baton,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008802 const clang::RecordDecl *record_decl,
8803 uint64_t &bit_size,
8804 uint64_t &alignment,
8805 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
8806 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
8807 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
8808{
Greg Clayton6dc8d582015-08-18 22:32:36 +00008809 ClangASTContext *ast = (ClangASTContext *)baton;
Greg Clayton261ac3f2015-08-28 01:01:03 +00008810 DWARFASTParserClang *dwarf_ast_parser = (DWARFASTParserClang *)ast->GetDWARFParser();
8811 return dwarf_ast_parser->LayoutRecordType(record_decl, bit_size, alignment, field_offsets, base_offsets, vbase_offsets);
Greg Clayton8b4edba2015-08-14 20:02:05 +00008812}
8813
Greg Clayton99558cc42015-08-24 23:46:31 +00008814//----------------------------------------------------------------------
8815// CompilerDeclContext functions
8816//----------------------------------------------------------------------
8817
8818bool
8819ClangASTContext::DeclContextIsStructUnionOrClass (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00008820{
Greg Clayton99558cc42015-08-24 23:46:31 +00008821 if (opaque_decl_ctx)
8822 return ((clang::DeclContext *)opaque_decl_ctx)->isRecord();
8823 else
8824 return false;
Greg Clayton8b4edba2015-08-14 20:02:05 +00008825}
8826
Greg Clayton99558cc42015-08-24 23:46:31 +00008827ConstString
8828ClangASTContext::DeclContextGetName (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00008829{
Greg Clayton99558cc42015-08-24 23:46:31 +00008830 if (opaque_decl_ctx)
8831 {
8832 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
8833 if (named_decl)
8834 return ConstString(named_decl->getName());
8835 }
8836 return ConstString();
8837}
8838
8839bool
8840ClangASTContext::DeclContextIsClassMethod (void *opaque_decl_ctx,
8841 lldb::LanguageType *language_ptr,
8842 bool *is_instance_method_ptr,
8843 ConstString *language_object_name_ptr)
8844{
8845 if (opaque_decl_ctx)
8846 {
8847 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
8848 if (ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
8849 {
8850 if (is_instance_method_ptr)
8851 *is_instance_method_ptr = objc_method->isInstanceMethod();
8852 if (language_ptr)
8853 *language_ptr = eLanguageTypeObjC;
8854 if (language_object_name_ptr)
8855 language_object_name_ptr->SetCString("self");
8856 return true;
8857 }
8858 else if (CXXMethodDecl *cxx_method = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
8859 {
8860 if (is_instance_method_ptr)
8861 *is_instance_method_ptr = cxx_method->isInstance();
8862 if (language_ptr)
8863 *language_ptr = eLanguageTypeC_plus_plus;
8864 if (language_object_name_ptr)
8865 language_object_name_ptr->SetCString("this");
8866 return true;
8867 }
8868 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
8869 {
8870 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
8871 if (metadata && metadata->HasObjectPtr())
8872 {
8873 if (is_instance_method_ptr)
8874 *is_instance_method_ptr = true;
8875 if (language_ptr)
8876 *language_ptr = eLanguageTypeObjC;
8877 if (language_object_name_ptr)
8878 language_object_name_ptr->SetCString (metadata->GetObjectPtrName());
8879 return true;
8880 }
8881 }
8882 }
8883 return false;
8884}
8885
8886clang::DeclContext *
8887ClangASTContext::DeclContextGetAsDeclContext (const CompilerDeclContext &dc)
8888{
8889 if (dc.IsClang())
8890 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
8891 return nullptr;
8892}
8893
8894
8895ObjCMethodDecl *
8896ClangASTContext::DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc)
8897{
8898 if (dc.IsClang())
8899 return llvm::dyn_cast<clang::ObjCMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8900 return nullptr;
8901}
8902
8903CXXMethodDecl *
8904ClangASTContext::DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc)
8905{
8906 if (dc.IsClang())
8907 return llvm::dyn_cast<clang::CXXMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8908 return nullptr;
8909}
8910
8911clang::FunctionDecl *
8912ClangASTContext::DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc)
8913{
8914 if (dc.IsClang())
8915 return llvm::dyn_cast<clang::FunctionDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8916 return nullptr;
8917}
8918
8919clang::NamespaceDecl *
8920ClangASTContext::DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc)
8921{
8922 if (dc.IsClang())
8923 return llvm::dyn_cast<clang::NamespaceDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
8924 return nullptr;
8925}
8926
8927ClangASTMetadata *
8928ClangASTContext::DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object)
8929{
8930 clang::ASTContext *ast = DeclContextGetClangASTContext (dc);
8931 if (ast)
8932 return ClangASTContext::GetMetadata (ast, object);
8933 return nullptr;
8934}
8935
8936clang::ASTContext *
8937ClangASTContext::DeclContextGetClangASTContext (const CompilerDeclContext &dc)
8938{
Greg Claytonf73034f2015-09-08 18:15:05 +00008939 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
8940 if (ast)
8941 return ast->getASTContext();
Greg Clayton99558cc42015-08-24 23:46:31 +00008942 return nullptr;
Greg Clayton8b4edba2015-08-14 20:02:05 +00008943}
8944