blob: 81f872f6a7094fc82dea22835376df7485191e9a [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>
Sean Callananfe38c852015-10-08 23:07:53 +000016#include <vector>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017
18// Other libraries and framework includes
Greg Clayton6beaaa62011-01-17 03:46:26 +000019
20// Clang headers like to use NDEBUG inside of them to enable/disable debug
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +000021// related features using "#ifndef NDEBUG" preprocessor blocks to do one thing
Greg Clayton6beaaa62011-01-17 03:46:26 +000022// or another. This is bad because it means that if clang was built in release
23// mode, it assumes that you are building in release mode which is not always
24// the case. You can end up with functions that are defined as empty in header
25// files when NDEBUG is not defined, and this can cause link errors with the
26// clang .a files that you have since you might be missing functions in the .a
27// file. So we have to define NDEBUG when including clang headers to avoid any
28// mismatches. This is covered by rdar://problem/8691220
29
Sean Callanan3b1d4f62011-10-26 17:46:51 +000030#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
Greg Clayton6beaaa62011-01-17 03:46:26 +000031#define LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000032#define NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000033// Need to include assert.h so it is as clang would expect it to be (disabled)
34#include <assert.h>
35#endif
36
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037#include "clang/AST/ASTContext.h"
38#include "clang/AST/ASTImporter.h"
Greg Claytonf74c4032012-12-03 18:29:55 +000039#include "clang/AST/Attr.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000040#include "clang/AST/CXXInheritance.h"
Greg Clayton8cf05932010-07-22 18:30:50 +000041#include "clang/AST/DeclObjC.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000042#include "clang/AST/DeclTemplate.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043#include "clang/AST/RecordLayout.h"
44#include "clang/AST/Type.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000045#include "clang/AST/VTableBuilder.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046#include "clang/Basic/Builtins.h"
Sean Callanan7e2863b2012-02-06 21:28:03 +000047#include "clang/Basic/Diagnostic.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048#include "clang/Basic/FileManager.h"
Sean Callanan79439e82010-11-18 02:56:27 +000049#include "clang/Basic/FileSystemOptions.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000050#include "clang/Basic/SourceManager.h"
51#include "clang/Basic/TargetInfo.h"
52#include "clang/Basic/TargetOptions.h"
53#include "clang/Frontend/FrontendOptions.h"
54#include "clang/Frontend/LangStandard.h"
Greg Clayton6beaaa62011-01-17 03:46:26 +000055
56#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000057#undef NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000058#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
59// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
60#include <assert.h>
61#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +000062
Greg Claytond8d4a572015-08-11 21:38:15 +000063#include "llvm/Support/Signals.h"
64
Greg Clayton514487e2011-02-15 21:59:32 +000065#include "lldb/Core/ArchSpec.h"
Greg Clayton73b472d2010-10-27 03:32:59 +000066#include "lldb/Core/Flags.h"
Sean Callananfb8b7092010-10-28 18:19:36 +000067#include "lldb/Core/Log.h"
Greg Clayton56939cb2015-09-17 22:23:34 +000068#include "lldb/Core/Module.h"
69#include "lldb/Core/PluginManager.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000070#include "lldb/Core/RegularExpression.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000071#include "lldb/Core/StreamFile.h"
Enrico Granata2267ad42014-09-16 17:28:40 +000072#include "lldb/Core/ThreadSafeDenseMap.h"
Greg Clayton57ee3062013-07-11 22:46:58 +000073#include "lldb/Core/UniqueCStringMap.h"
Sean Callanan4dbb2712015-09-25 20:35:58 +000074#include "Plugins/ExpressionParser/Clang/ClangUserExpression.h"
75#include "Plugins/ExpressionParser/Clang/ClangFunctionCaller.h"
76#include "Plugins/ExpressionParser/Clang/ClangUtilityFunction.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000077#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6dc8d582015-08-18 22:32:36 +000078#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000079#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Greg Clayton56939cb2015-09-17 22:23:34 +000080#include "lldb/Symbol/ObjectFile.h"
Greg Clayton261ac3f2015-08-28 01:01:03 +000081#include "lldb/Symbol/SymbolFile.h"
Sean Callanan5e9e1992011-10-26 01:06:27 +000082#include "lldb/Symbol/VerifyDecl.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000083#include "lldb/Target/ExecutionContext.h"
Greg Clayton56939cb2015-09-17 22:23:34 +000084#include "lldb/Target/Language.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000085#include "lldb/Target/ObjCLanguageRuntime.h"
Jim Ingham151c0322015-09-15 21:13:50 +000086#include "lldb/Target/Process.h"
87#include "lldb/Target/Target.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000088
Greg Clayton261ac3f2015-08-28 01:01:03 +000089#include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h"
90
Eli Friedman932197d2010-06-13 19:06:42 +000091#include <stdio.h>
92
Greg Clayton1341baf2013-07-11 23:36:31 +000093#include <mutex>
94
Greg Claytonc86103d2010-08-05 01:57:25 +000095using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000096using namespace lldb_private;
97using namespace llvm;
98using namespace clang;
99
Greg Clayton56939cb2015-09-17 22:23:34 +0000100namespace
101{
102 static inline bool ClangASTContextSupportsLanguage (lldb::LanguageType language)
103 {
104 return language == eLanguageTypeUnknown || // Clang is the default type system
105 Language::LanguageIsC (language) ||
106 Language::LanguageIsCPlusPlus (language) ||
107 Language::LanguageIsObjC (language);
108 }
109}
110
Enrico Granata2267ad42014-09-16 17:28:40 +0000111typedef lldb_private::ThreadSafeDenseMap<clang::ASTContext *, ClangASTContext*> ClangASTMap;
Enrico Granata5d84a692014-08-19 21:46:37 +0000112
113static ClangASTMap &
114GetASTMap()
115{
Enrico Granata2267ad42014-09-16 17:28:40 +0000116 static ClangASTMap *g_map_ptr = nullptr;
117 static std::once_flag g_once_flag;
118 std::call_once(g_once_flag, []() {
119 g_map_ptr = new ClangASTMap(); // leaked on purpose to avoid spins
120 });
121 return *g_map_ptr;
Enrico Granata5d84a692014-08-19 21:46:37 +0000122}
123
124
Greg Clayton57ee3062013-07-11 22:46:58 +0000125clang::AccessSpecifier
126ClangASTContext::ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000127{
128 switch (access)
129 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000130 default: break;
131 case eAccessNone: return AS_none;
132 case eAccessPublic: return AS_public;
133 case eAccessPrivate: return AS_private;
134 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000135 }
136 return AS_none;
137}
138
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000139static void
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000140ParseLangArgs (LangOptions &Opts, InputKind IK, const char* triple)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000141{
142 // FIXME: Cleanup per-file based stuff.
143
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000144 // Set some properties which depend solely on the input kind; it would be nice
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000145 // to move these to the language standard, and have the driver resolve the
146 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000147 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000148 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000149 } else if (IK == IK_ObjC ||
150 IK == IK_ObjCXX ||
151 IK == IK_PreprocessedObjC ||
152 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000153 Opts.ObjC1 = Opts.ObjC2 = 1;
154 }
155
156 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
157
158 if (LangStd == LangStandard::lang_unspecified) {
159 // Based on the base language, pick one.
160 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000161 case IK_None:
162 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000163 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000164 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000165 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166 LangStd = LangStandard::lang_opencl;
167 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000168 case IK_CUDA:
Artem Belevich52210ae2015-03-19 18:12:26 +0000169 case IK_PreprocessedCuda:
Sean Callananfb0b7582011-03-15 00:17:19 +0000170 LangStd = LangStandard::lang_cuda;
171 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000172 case IK_Asm:
173 case IK_C:
174 case IK_PreprocessedC:
175 case IK_ObjC:
176 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000177 LangStd = LangStandard::lang_gnu99;
178 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000179 case IK_CXX:
180 case IK_PreprocessedCXX:
181 case IK_ObjCXX:
182 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000183 LangStd = LangStandard::lang_gnucxx98;
184 break;
185 }
186 }
187
188 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
Filipe Cabecinhase818ca22012-11-12 21:26:32 +0000189 Opts.LineComment = Std.hasLineComments();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000190 Opts.C99 = Std.isC99();
191 Opts.CPlusPlus = Std.isCPlusPlus();
Chandler Carruth38336a12013-01-02 12:55:00 +0000192 Opts.CPlusPlus11 = Std.isCPlusPlus11();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000193 Opts.Digraphs = Std.hasDigraphs();
194 Opts.GNUMode = Std.isGNUMode();
195 Opts.GNUInline = !Std.isC99();
196 Opts.HexFloats = Std.hasHexFloats();
197 Opts.ImplicitInt = Std.hasImplicitInt();
Enrico Granatac921e342013-01-10 02:37:22 +0000198
199 Opts.WChar = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000200
201 // OpenCL has some additional defaults.
202 if (LangStd == LangStandard::lang_opencl) {
203 Opts.OpenCL = 1;
204 Opts.AltiVec = 1;
205 Opts.CXXOperatorNames = 1;
206 Opts.LaxVectorConversions = 1;
207 }
208
209 // OpenCL and C++ both have bool, true, false keywords.
210 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
211
212// if (Opts.CPlusPlus)
213// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
214//
215// if (Args.hasArg(OPT_fobjc_gc_only))
216// Opts.setGCMode(LangOptions::GCOnly);
217// else if (Args.hasArg(OPT_fobjc_gc))
218// Opts.setGCMode(LangOptions::HybridGC);
219//
220// if (Args.hasArg(OPT_print_ivar_layout))
221// Opts.ObjCGCBitmapPrint = 1;
222//
223// if (Args.hasArg(OPT_faltivec))
224// Opts.AltiVec = 1;
225//
226// if (Args.hasArg(OPT_pthread))
227// Opts.POSIXThreads = 1;
228//
229// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
230// "default");
231// if (Vis == "default")
Sean Callanan37f76e52013-02-19 19:16:37 +0000232 Opts.setValueVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000233// else if (Vis == "hidden")
234// Opts.setVisibilityMode(LangOptions::Hidden);
235// else if (Vis == "protected")
236// Opts.setVisibilityMode(LangOptions::Protected);
237// else
238// Diags.Report(diag::err_drv_invalid_value)
239// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
240
241// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
242
243 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
244 // is specified, or -std is set to a conforming mode.
245 Opts.Trigraphs = !Opts.GNUMode;
246// if (Args.hasArg(OPT_trigraphs))
247// Opts.Trigraphs = 1;
248//
249// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
250// OPT_fno_dollars_in_identifiers,
251// !Opts.AsmPreprocessor);
252// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
253// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
254// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
255// if (Args.hasArg(OPT_fno_lax_vector_conversions))
256// Opts.LaxVectorConversions = 0;
257// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
258// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
259// Opts.Blocks = Args.hasArg(OPT_fblocks);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000260 Opts.CharIsSigned = ArchSpec(triple).CharIsSignedByDefault();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000261// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
262// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
263// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
264// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
265// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
266// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
267// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
268// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
269// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
270// Diags);
271// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
272// Opts.ObjCConstantStringClass = getLastArgValue(Args,
273// OPT_fconstant_string_class);
274// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
275// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
276// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
277// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
278// Opts.Static = Args.hasArg(OPT_static_define);
279 Opts.OptimizeSize = 0;
280
281 // FIXME: Eliminate this dependency.
282// unsigned Opt =
283// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
284// Opts.Optimize = Opt != 0;
285 unsigned Opt = 0;
286
287 // This is the __NO_INLINE__ define, which just depends on things like the
288 // optimization level and -fno-inline, not actually whether the backend has
289 // inlining enabled.
290 //
291 // FIXME: This is affected by other options (-fno-inline).
Sean Callanan3d654b32012-09-24 22:25:51 +0000292 Opts.NoInlineDefine = !Opt;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000293
294// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
295// switch (SSP) {
296// default:
297// Diags.Report(diag::err_drv_invalid_value)
298// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
299// break;
300// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
301// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
302// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
303// }
304}
305
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000306
Greg Claytonf73034f2015-09-08 18:15:05 +0000307ClangASTContext::ClangASTContext (const char *target_triple) :
308 TypeSystem (TypeSystem::eKindClang),
Greg Clayton6dc8d582015-08-18 22:32:36 +0000309 m_target_triple (),
310 m_ast_ap (),
311 m_language_options_ap (),
312 m_source_manager_ap (),
313 m_diagnostics_engine_ap (),
314 m_target_options_rp (),
315 m_target_info_ap (),
316 m_identifier_table_ap (),
317 m_selector_table_ap (),
318 m_builtins_ap (),
Ed Masted4612ad2014-04-20 13:17:36 +0000319 m_callback_tag_decl (nullptr),
320 m_callback_objc_decl (nullptr),
321 m_callback_baton (nullptr),
Greg Claytond8d4a572015-08-11 21:38:15 +0000322 m_pointer_byte_size (0),
Greg Clayton261ac3f2015-08-28 01:01:03 +0000323 m_ast_owned (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000324{
325 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000326 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000327}
328
329//----------------------------------------------------------------------
330// Destructor
331//----------------------------------------------------------------------
332ClangASTContext::~ClangASTContext()
333{
Enrico Granata5d84a692014-08-19 21:46:37 +0000334 if (m_ast_ap.get())
335 {
Enrico Granata2267ad42014-09-16 17:28:40 +0000336 GetASTMap().Erase(m_ast_ap.get());
Greg Claytond8d4a572015-08-11 21:38:15 +0000337 if (!m_ast_owned)
338 m_ast_ap.release();
Enrico Granata5d84a692014-08-19 21:46:37 +0000339 }
340
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000341 m_builtins_ap.reset();
342 m_selector_table_ap.reset();
343 m_identifier_table_ap.reset();
344 m_target_info_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000345 m_target_options_rp.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000346 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000347 m_source_manager_ap.reset();
348 m_language_options_ap.reset();
Greg Clayton6beaaa62011-01-17 03:46:26 +0000349 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000350}
351
Greg Clayton56939cb2015-09-17 22:23:34 +0000352ConstString
353ClangASTContext::GetPluginNameStatic()
354{
355 return ConstString("clang");
356}
357
358ConstString
359ClangASTContext::GetPluginName()
360{
361 return ClangASTContext::GetPluginNameStatic();
362}
363
364uint32_t
365ClangASTContext::GetPluginVersion()
366{
367 return 1;
368}
369
370lldb::TypeSystemSP
Greg Clayton5beec212015-10-08 21:04:34 +0000371ClangASTContext::CreateInstance (lldb::LanguageType language, Module *module, Target *target)
Greg Clayton56939cb2015-09-17 22:23:34 +0000372{
373 if (ClangASTContextSupportsLanguage(language))
374 {
Greg Clayton5beec212015-10-08 21:04:34 +0000375 ArchSpec arch;
376 if (module)
377 arch = module->GetArchitecture();
378 else if (target)
379 arch = target->GetArchitecture();
380
381 if (arch.IsValid())
Greg Clayton56939cb2015-09-17 22:23:34 +0000382 {
Greg Clayton5beec212015-10-08 21:04:34 +0000383 ArchSpec fixed_arch = arch;
384 // LLVM wants this to be set to iOS or MacOSX; if we're working on
385 // a bare-boards type image, change the triple for llvm's benefit.
386 if (fixed_arch.GetTriple().getVendor() == llvm::Triple::Apple &&
387 fixed_arch.GetTriple().getOS() == llvm::Triple::UnknownOS)
Greg Clayton56939cb2015-09-17 22:23:34 +0000388 {
Greg Clayton5beec212015-10-08 21:04:34 +0000389 if (fixed_arch.GetTriple().getArch() == llvm::Triple::arm ||
390 fixed_arch.GetTriple().getArch() == llvm::Triple::aarch64 ||
391 fixed_arch.GetTriple().getArch() == llvm::Triple::thumb)
Greg Clayton56939cb2015-09-17 22:23:34 +0000392 {
Greg Clayton5beec212015-10-08 21:04:34 +0000393 fixed_arch.GetTriple().setOS(llvm::Triple::IOS);
Greg Clayton56939cb2015-09-17 22:23:34 +0000394 }
Greg Clayton5beec212015-10-08 21:04:34 +0000395 else
396 {
397 fixed_arch.GetTriple().setOS(llvm::Triple::MacOSX);
398 }
399 }
400
401 if (module)
402 {
403 std::shared_ptr<ClangASTContext> ast_sp(new ClangASTContext);
404 if (ast_sp)
405 {
406 ast_sp->SetArchitecture (fixed_arch);
407 }
408 return ast_sp;
409 }
410 else if (target)
411 {
412 std::shared_ptr<ClangASTContextForExpressions> ast_sp(new ClangASTContextForExpressions(*target));
413 if (ast_sp)
414 {
415 ast_sp->SetArchitecture(fixed_arch);
416 ast_sp->m_scratch_ast_source_ap.reset (new ClangASTSource(target->shared_from_this()));
417 ast_sp->m_scratch_ast_source_ap->InstallASTContext(ast_sp->getASTContext());
418 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(ast_sp->m_scratch_ast_source_ap->CreateProxy());
419 ast_sp->SetExternalSource(proxy_ast_source);
420 return ast_sp;
421 }
Greg Clayton56939cb2015-09-17 22:23:34 +0000422 }
423 }
Greg Clayton56939cb2015-09-17 22:23:34 +0000424 }
425 return lldb::TypeSystemSP();
426}
427
Sean Callananfe38c852015-10-08 23:07:53 +0000428void
429ClangASTContext::EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions)
430{
431 static std::vector<lldb::LanguageType> s_supported_languages_for_types({
432 lldb::eLanguageTypeC89,
433 lldb::eLanguageTypeC,
434 lldb::eLanguageTypeC11,
435 lldb::eLanguageTypeC_plus_plus,
436 lldb::eLanguageTypeC99,
437 lldb::eLanguageTypeObjC,
438 lldb::eLanguageTypeObjC_plus_plus,
439 lldb::eLanguageTypeC_plus_plus_03,
440 lldb::eLanguageTypeC_plus_plus_11,
441 lldb::eLanguageTypeC11,
442 lldb::eLanguageTypeC_plus_plus_14});
443
444 static std::vector<lldb::LanguageType> s_supported_languages_for_expressions({
445 lldb::eLanguageTypeC_plus_plus,
446 lldb::eLanguageTypeObjC_plus_plus,
447 lldb::eLanguageTypeC_plus_plus_03,
448 lldb::eLanguageTypeC_plus_plus_11,
449 lldb::eLanguageTypeC_plus_plus_14});
450
451 languages_for_types.insert(s_supported_languages_for_types.begin(), s_supported_languages_for_types.end());
452 languages_for_expressions.insert(s_supported_languages_for_expressions.begin(), s_supported_languages_for_expressions.end());
453}
454
Greg Clayton56939cb2015-09-17 22:23:34 +0000455
456void
457ClangASTContext::Initialize()
458{
459 PluginManager::RegisterPlugin (GetPluginNameStatic(),
460 "clang base AST context plug-in",
Sean Callananfe38c852015-10-08 23:07:53 +0000461 CreateInstance,
462 EnumerateSupportedLanguages);
Greg Clayton56939cb2015-09-17 22:23:34 +0000463}
464
465void
466ClangASTContext::Terminate()
467{
468 PluginManager::UnregisterPlugin (CreateInstance);
469}
470
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000471
472void
473ClangASTContext::Clear()
474{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000475 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000476 m_language_options_ap.reset();
477 m_source_manager_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000478 m_diagnostics_engine_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000479 m_target_options_rp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000480 m_target_info_ap.reset();
481 m_identifier_table_ap.reset();
482 m_selector_table_ap.reset();
483 m_builtins_ap.reset();
Greg Clayton57ee3062013-07-11 22:46:58 +0000484 m_pointer_byte_size = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000485}
486
487const char *
488ClangASTContext::GetTargetTriple ()
489{
490 return m_target_triple.c_str();
491}
492
493void
494ClangASTContext::SetTargetTriple (const char *target_triple)
495{
496 Clear();
497 m_target_triple.assign(target_triple);
498}
499
Greg Clayton514487e2011-02-15 21:59:32 +0000500void
501ClangASTContext::SetArchitecture (const ArchSpec &arch)
502{
Greg Clayton880cbb02011-07-30 01:26:02 +0000503 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000504}
505
Greg Clayton6beaaa62011-01-17 03:46:26 +0000506bool
507ClangASTContext::HasExternalSource ()
508{
509 ASTContext *ast = getASTContext();
510 if (ast)
Ed Masted4612ad2014-04-20 13:17:36 +0000511 return ast->getExternalSource () != nullptr;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000512 return false;
513}
514
515void
Todd Fiala955fe6f2014-02-27 17:18:23 +0000516ClangASTContext::SetExternalSource (llvm::IntrusiveRefCntPtr<ExternalASTSource> &ast_source_ap)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000517{
518 ASTContext *ast = getASTContext();
519 if (ast)
520 {
521 ast->setExternalSource (ast_source_ap);
522 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
523 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
524 }
525}
526
527void
528ClangASTContext::RemoveExternalSource ()
529{
530 ASTContext *ast = getASTContext();
531
532 if (ast)
533 {
Todd Fiala955fe6f2014-02-27 17:18:23 +0000534 llvm::IntrusiveRefCntPtr<ExternalASTSource> empty_ast_source_ap;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000535 ast->setExternalSource (empty_ast_source_ap);
536 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
537 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
538 }
539}
540
Greg Claytond8d4a572015-08-11 21:38:15 +0000541void
542ClangASTContext::setASTContext(clang::ASTContext *ast_ctx)
543{
544 if (!m_ast_owned) {
545 m_ast_ap.release();
546 }
547 m_ast_owned = false;
548 m_ast_ap.reset(ast_ctx);
549 GetASTMap().Insert(ast_ctx, this);
550}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000551
552ASTContext *
553ClangASTContext::getASTContext()
554{
Ed Masted4612ad2014-04-20 13:17:36 +0000555 if (m_ast_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000556 {
Greg Claytond8d4a572015-08-11 21:38:15 +0000557 m_ast_owned = true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000558 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
559 *getSourceManager(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000560 *getIdentifierTable(),
561 *getSelectorTable(),
Alp Tokercf55e882014-05-03 15:05:45 +0000562 *getBuiltinContext()));
Sean Callanan6d61b632015-04-09 17:42:48 +0000563
564 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Greg Clayton28eb7bf2015-05-07 00:07:44 +0000565
566 // This can be NULL if we don't know anything about the architecture or if the
567 // target for an architecture isn't enabled in the llvm/clang that we built
568 TargetInfo *target_info = getTargetInfo();
569 if (target_info)
570 m_ast_ap->InitBuiltinTypes(*target_info);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000571
Greg Clayton6beaaa62011-01-17 03:46:26 +0000572 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
573 {
574 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
575 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
576 }
577
Enrico Granata2267ad42014-09-16 17:28:40 +0000578 GetASTMap().Insert(m_ast_ap.get(), this);
Greg Clayton6dc8d582015-08-18 22:32:36 +0000579
580 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> ast_source_ap (new ClangExternalASTSourceCallbacks (ClangASTContext::CompleteTagDecl,
581 ClangASTContext::CompleteObjCInterfaceDecl,
582 nullptr,
583 ClangASTContext::LayoutRecordType,
584 this));
585 SetExternalSource (ast_source_ap);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000586 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000587 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000588}
589
Enrico Granata5d84a692014-08-19 21:46:37 +0000590ClangASTContext*
591ClangASTContext::GetASTContext (clang::ASTContext* ast)
592{
Enrico Granata2267ad42014-09-16 17:28:40 +0000593 ClangASTContext *clang_ast = GetASTMap().Lookup(ast);
Enrico Granata5d84a692014-08-19 21:46:37 +0000594 return clang_ast;
595}
596
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000597Builtin::Context *
598ClangASTContext::getBuiltinContext()
599{
Ed Masted4612ad2014-04-20 13:17:36 +0000600 if (m_builtins_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000601 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000602 return m_builtins_ap.get();
603}
604
605IdentifierTable *
606ClangASTContext::getIdentifierTable()
607{
Ed Masted4612ad2014-04-20 13:17:36 +0000608 if (m_identifier_table_ap.get() == nullptr)
609 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), nullptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000610 return m_identifier_table_ap.get();
611}
612
613LangOptions *
614ClangASTContext::getLanguageOptions()
615{
Ed Masted4612ad2014-04-20 13:17:36 +0000616 if (m_language_options_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000617 {
618 m_language_options_ap.reset(new LangOptions());
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000619 ParseLangArgs(*m_language_options_ap, IK_ObjCXX, GetTargetTriple());
Greg Clayton94e5d782010-06-13 17:34:29 +0000620// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000621 }
622 return m_language_options_ap.get();
623}
624
625SelectorTable *
626ClangASTContext::getSelectorTable()
627{
Ed Masted4612ad2014-04-20 13:17:36 +0000628 if (m_selector_table_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000629 m_selector_table_ap.reset (new SelectorTable());
630 return m_selector_table_ap.get();
631}
632
Sean Callanan79439e82010-11-18 02:56:27 +0000633clang::FileManager *
634ClangASTContext::getFileManager()
635{
Ed Masted4612ad2014-04-20 13:17:36 +0000636 if (m_file_manager_ap.get() == nullptr)
Greg Clayton38a61402010-12-02 23:20:03 +0000637 {
638 clang::FileSystemOptions file_system_options;
639 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
640 }
Sean Callanan79439e82010-11-18 02:56:27 +0000641 return m_file_manager_ap.get();
642}
643
Greg Claytone1a916a2010-07-21 22:12:05 +0000644clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000645ClangASTContext::getSourceManager()
646{
Ed Masted4612ad2014-04-20 13:17:36 +0000647 if (m_source_manager_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000648 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000649 return m_source_manager_ap.get();
650}
651
Sean Callanan880e6802011-10-07 23:18:13 +0000652clang::DiagnosticsEngine *
653ClangASTContext::getDiagnosticsEngine()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000654{
Ed Masted4612ad2014-04-20 13:17:36 +0000655 if (m_diagnostics_engine_ap.get() == nullptr)
Greg Claytona651b532010-11-19 21:46:54 +0000656 {
657 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callananec8f1ef2012-10-25 01:00:25 +0000658 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
Greg Claytona651b532010-11-19 21:46:54 +0000659 }
Sean Callanan880e6802011-10-07 23:18:13 +0000660 return m_diagnostics_engine_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000661}
662
Sean Callanan880e6802011-10-07 23:18:13 +0000663class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000664{
665public:
Sean Callanan880e6802011-10-07 23:18:13 +0000666 NullDiagnosticConsumer ()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000667 {
668 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
669 }
670
Sean Callanan880e6802011-10-07 23:18:13 +0000671 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000672 {
673 if (m_log)
674 {
Sean Callanan5b26f272012-02-04 08:49:35 +0000675 llvm::SmallVector<char, 32> diag_str(10);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000676 info.FormatDiagnostic(diag_str);
677 diag_str.push_back('\0');
678 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
679 }
680 }
Sean Callanan880e6802011-10-07 23:18:13 +0000681
682 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
683 {
684 return new NullDiagnosticConsumer ();
685 }
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000686private:
Greg Clayton5160ce52013-03-27 23:08:40 +0000687 Log * m_log;
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000688};
689
Sean Callanan880e6802011-10-07 23:18:13 +0000690DiagnosticConsumer *
691ClangASTContext::getDiagnosticConsumer()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000692{
Ed Masted4612ad2014-04-20 13:17:36 +0000693 if (m_diagnostic_consumer_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000694 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000695
Sean Callanan880e6802011-10-07 23:18:13 +0000696 return m_diagnostic_consumer_ap.get();
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000697}
698
Jason Molenda45938b92014-07-08 23:46:39 +0000699std::shared_ptr<TargetOptions> &
700ClangASTContext::getTargetOptions() {
Alp Tokeredc902f2014-07-05 03:06:05 +0000701 if (m_target_options_rp.get() == nullptr && !m_target_triple.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000702 {
Alp Toker5f838642014-07-06 05:36:57 +0000703 m_target_options_rp = std::make_shared<TargetOptions>();
Alp Tokeredc902f2014-07-05 03:06:05 +0000704 if (m_target_options_rp.get() != nullptr)
Sean Callananc5069ad2012-10-17 22:11:14 +0000705 m_target_options_rp->Triple = m_target_triple;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000706 }
Alp Toker5f838642014-07-06 05:36:57 +0000707 return m_target_options_rp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000708}
709
710
711TargetInfo *
712ClangASTContext::getTargetInfo()
713{
Greg Clayton70512312012-05-08 01:45:38 +0000714 // target_triple should be something like "x86_64-apple-macosx"
Ed Masted4612ad2014-04-20 13:17:36 +0000715 if (m_target_info_ap.get() == nullptr && !m_target_triple.empty())
Greg Clayton38d880a2012-11-16 21:35:22 +0000716 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), getTargetOptions()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000717 return m_target_info_ap.get();
718}
719
720#pragma mark Basic Types
721
722static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000723QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000724{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000725 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000726 if (qual_type_bit_size == bit_size)
727 return true;
728 return false;
729}
Greg Clayton56939cb2015-09-17 22:23:34 +0000730
Greg Claytona1e5dc82015-08-11 22:53:00 +0000731CompilerType
Greg Clayton56939cb2015-09-17 22:23:34 +0000732ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, size_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000733{
Greg Clayton57ee3062013-07-11 22:46:58 +0000734 return ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (getASTContext(), encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000735}
736
Greg Claytona1e5dc82015-08-11 22:53:00 +0000737CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +0000738ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000739{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000740 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +0000741 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000742 switch (encoding)
743 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000744 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000745 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000746 return CompilerType (ast, ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000747 break;
748
Greg Claytonc86103d2010-08-05 01:57:25 +0000749 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000750 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000751 return CompilerType (ast, ast->UnsignedCharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000752 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000753 return CompilerType (ast, ast->UnsignedShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000754 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000755 return CompilerType (ast, ast->UnsignedIntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000756 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000757 return CompilerType (ast, ast->UnsignedLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000758 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000759 return CompilerType (ast, ast->UnsignedLongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000760 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000761 return CompilerType (ast, ast->UnsignedInt128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000762 break;
763
Greg Claytonc86103d2010-08-05 01:57:25 +0000764 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000765 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000766 return CompilerType (ast, ast->CharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000767 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000768 return CompilerType (ast, ast->ShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000769 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000770 return CompilerType (ast, ast->IntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000771 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000772 return CompilerType (ast, ast->LongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000773 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000774 return CompilerType (ast, ast->LongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000775 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000776 return CompilerType (ast, ast->Int128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000777 break;
778
Greg Claytonc86103d2010-08-05 01:57:25 +0000779 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000780 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000781 return CompilerType (ast, ast->FloatTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000782 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000783 return CompilerType (ast, ast->DoubleTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000784 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000785 return CompilerType (ast, ast->LongDoubleTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000786 break;
787
Greg Claytonc86103d2010-08-05 01:57:25 +0000788 case eEncodingVector:
Johnny Chenc79c93a2012-03-07 01:12:24 +0000789 // Sanity check that bit_size is a multiple of 8's.
790 if (bit_size && !(bit_size & 0x7u))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000791 return CompilerType (ast, ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8));
Johnny Chenc79c93a2012-03-07 01:12:24 +0000792 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000793 }
794
Greg Claytona1e5dc82015-08-11 22:53:00 +0000795 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000796}
797
Greg Clayton57ee3062013-07-11 22:46:58 +0000798
799
800lldb::BasicType
801ClangASTContext::GetBasicTypeEnumeration (const ConstString &name)
802{
803 if (name)
804 {
805 typedef UniqueCStringMap<lldb::BasicType> TypeNameToBasicTypeMap;
806 static TypeNameToBasicTypeMap g_type_map;
807 static std::once_flag g_once_flag;
808 std::call_once(g_once_flag, [](){
809 // "void"
810 g_type_map.Append(ConstString("void").GetCString(), eBasicTypeVoid);
811
812 // "char"
813 g_type_map.Append(ConstString("char").GetCString(), eBasicTypeChar);
814 g_type_map.Append(ConstString("signed char").GetCString(), eBasicTypeSignedChar);
815 g_type_map.Append(ConstString("unsigned char").GetCString(), eBasicTypeUnsignedChar);
816 g_type_map.Append(ConstString("wchar_t").GetCString(), eBasicTypeWChar);
817 g_type_map.Append(ConstString("signed wchar_t").GetCString(), eBasicTypeSignedWChar);
818 g_type_map.Append(ConstString("unsigned wchar_t").GetCString(), eBasicTypeUnsignedWChar);
819 // "short"
820 g_type_map.Append(ConstString("short").GetCString(), eBasicTypeShort);
821 g_type_map.Append(ConstString("short int").GetCString(), eBasicTypeShort);
822 g_type_map.Append(ConstString("unsigned short").GetCString(), eBasicTypeUnsignedShort);
823 g_type_map.Append(ConstString("unsigned short int").GetCString(), eBasicTypeUnsignedShort);
824
825 // "int"
826 g_type_map.Append(ConstString("int").GetCString(), eBasicTypeInt);
827 g_type_map.Append(ConstString("signed int").GetCString(), eBasicTypeInt);
828 g_type_map.Append(ConstString("unsigned int").GetCString(), eBasicTypeUnsignedInt);
829 g_type_map.Append(ConstString("unsigned").GetCString(), eBasicTypeUnsignedInt);
830
831 // "long"
832 g_type_map.Append(ConstString("long").GetCString(), eBasicTypeLong);
833 g_type_map.Append(ConstString("long int").GetCString(), eBasicTypeLong);
834 g_type_map.Append(ConstString("unsigned long").GetCString(), eBasicTypeUnsignedLong);
835 g_type_map.Append(ConstString("unsigned long int").GetCString(), eBasicTypeUnsignedLong);
836
837 // "long long"
838 g_type_map.Append(ConstString("long long").GetCString(), eBasicTypeLongLong);
839 g_type_map.Append(ConstString("long long int").GetCString(), eBasicTypeLongLong);
840 g_type_map.Append(ConstString("unsigned long long").GetCString(), eBasicTypeUnsignedLongLong);
841 g_type_map.Append(ConstString("unsigned long long int").GetCString(), eBasicTypeUnsignedLongLong);
842
843 // "int128"
844 g_type_map.Append(ConstString("__int128_t").GetCString(), eBasicTypeInt128);
845 g_type_map.Append(ConstString("__uint128_t").GetCString(), eBasicTypeUnsignedInt128);
846
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000847 // Miscellaneous
Greg Clayton57ee3062013-07-11 22:46:58 +0000848 g_type_map.Append(ConstString("bool").GetCString(), eBasicTypeBool);
849 g_type_map.Append(ConstString("float").GetCString(), eBasicTypeFloat);
850 g_type_map.Append(ConstString("double").GetCString(), eBasicTypeDouble);
851 g_type_map.Append(ConstString("long double").GetCString(), eBasicTypeLongDouble);
852 g_type_map.Append(ConstString("id").GetCString(), eBasicTypeObjCID);
853 g_type_map.Append(ConstString("SEL").GetCString(), eBasicTypeObjCSel);
854 g_type_map.Append(ConstString("nullptr").GetCString(), eBasicTypeNullPtr);
855 g_type_map.Sort();
856 });
857
858 return g_type_map.Find(name.GetCString(), eBasicTypeInvalid);
859 }
860 return eBasicTypeInvalid;
861}
862
Greg Claytona1e5dc82015-08-11 22:53:00 +0000863CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000864ClangASTContext::GetBasicType (ASTContext *ast, const ConstString &name)
865{
866 if (ast)
867 {
868 lldb::BasicType basic_type = ClangASTContext::GetBasicTypeEnumeration (name);
869 return ClangASTContext::GetBasicType (ast, basic_type);
870 }
Greg Claytona1e5dc82015-08-11 22:53:00 +0000871 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +0000872}
873
874uint32_t
875ClangASTContext::GetPointerByteSize ()
876{
877 if (m_pointer_byte_size == 0)
Enrico Granata1cd5e922015-01-28 00:07:51 +0000878 m_pointer_byte_size = GetBasicType(lldb::eBasicTypeVoid).GetPointerType().GetByteSize(nullptr);
Greg Clayton57ee3062013-07-11 22:46:58 +0000879 return m_pointer_byte_size;
880}
881
Greg Claytona1e5dc82015-08-11 22:53:00 +0000882CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000883ClangASTContext::GetBasicType (lldb::BasicType basic_type)
884{
885 return GetBasicType (getASTContext(), basic_type);
886}
887
Greg Claytona1e5dc82015-08-11 22:53:00 +0000888CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000889ClangASTContext::GetBasicType (ASTContext *ast, lldb::BasicType basic_type)
890{
891 if (ast)
892 {
Bruce Mitchener48ea9002015-09-23 00:18:24 +0000893 lldb::opaque_compiler_type_t clang_type = nullptr;
Greg Clayton57ee3062013-07-11 22:46:58 +0000894
895 switch (basic_type)
896 {
897 case eBasicTypeInvalid:
898 case eBasicTypeOther:
899 break;
900 case eBasicTypeVoid:
901 clang_type = ast->VoidTy.getAsOpaquePtr();
902 break;
903 case eBasicTypeChar:
904 clang_type = ast->CharTy.getAsOpaquePtr();
905 break;
906 case eBasicTypeSignedChar:
907 clang_type = ast->SignedCharTy.getAsOpaquePtr();
908 break;
909 case eBasicTypeUnsignedChar:
910 clang_type = ast->UnsignedCharTy.getAsOpaquePtr();
911 break;
912 case eBasicTypeWChar:
913 clang_type = ast->getWCharType().getAsOpaquePtr();
914 break;
915 case eBasicTypeSignedWChar:
916 clang_type = ast->getSignedWCharType().getAsOpaquePtr();
917 break;
918 case eBasicTypeUnsignedWChar:
919 clang_type = ast->getUnsignedWCharType().getAsOpaquePtr();
920 break;
921 case eBasicTypeChar16:
922 clang_type = ast->Char16Ty.getAsOpaquePtr();
923 break;
924 case eBasicTypeChar32:
925 clang_type = ast->Char32Ty.getAsOpaquePtr();
926 break;
927 case eBasicTypeShort:
928 clang_type = ast->ShortTy.getAsOpaquePtr();
929 break;
930 case eBasicTypeUnsignedShort:
931 clang_type = ast->UnsignedShortTy.getAsOpaquePtr();
932 break;
933 case eBasicTypeInt:
934 clang_type = ast->IntTy.getAsOpaquePtr();
935 break;
936 case eBasicTypeUnsignedInt:
937 clang_type = ast->UnsignedIntTy.getAsOpaquePtr();
938 break;
939 case eBasicTypeLong:
940 clang_type = ast->LongTy.getAsOpaquePtr();
941 break;
942 case eBasicTypeUnsignedLong:
943 clang_type = ast->UnsignedLongTy.getAsOpaquePtr();
944 break;
945 case eBasicTypeLongLong:
946 clang_type = ast->LongLongTy.getAsOpaquePtr();
947 break;
948 case eBasicTypeUnsignedLongLong:
949 clang_type = ast->UnsignedLongLongTy.getAsOpaquePtr();
950 break;
951 case eBasicTypeInt128:
952 clang_type = ast->Int128Ty.getAsOpaquePtr();
953 break;
954 case eBasicTypeUnsignedInt128:
955 clang_type = ast->UnsignedInt128Ty.getAsOpaquePtr();
956 break;
957 case eBasicTypeBool:
958 clang_type = ast->BoolTy.getAsOpaquePtr();
959 break;
960 case eBasicTypeHalf:
961 clang_type = ast->HalfTy.getAsOpaquePtr();
962 break;
963 case eBasicTypeFloat:
964 clang_type = ast->FloatTy.getAsOpaquePtr();
965 break;
966 case eBasicTypeDouble:
967 clang_type = ast->DoubleTy.getAsOpaquePtr();
968 break;
969 case eBasicTypeLongDouble:
970 clang_type = ast->LongDoubleTy.getAsOpaquePtr();
971 break;
972 case eBasicTypeFloatComplex:
973 clang_type = ast->FloatComplexTy.getAsOpaquePtr();
974 break;
975 case eBasicTypeDoubleComplex:
976 clang_type = ast->DoubleComplexTy.getAsOpaquePtr();
977 break;
978 case eBasicTypeLongDoubleComplex:
979 clang_type = ast->LongDoubleComplexTy.getAsOpaquePtr();
980 break;
981 case eBasicTypeObjCID:
982 clang_type = ast->getObjCIdType().getAsOpaquePtr();
983 break;
984 case eBasicTypeObjCClass:
985 clang_type = ast->getObjCClassType().getAsOpaquePtr();
986 break;
987 case eBasicTypeObjCSel:
988 clang_type = ast->getObjCSelType().getAsOpaquePtr();
989 break;
990 case eBasicTypeNullPtr:
991 clang_type = ast->NullPtrTy.getAsOpaquePtr();
992 break;
993 }
994
995 if (clang_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +0000996 return CompilerType (GetASTContext(ast), clang_type);
Greg Clayton57ee3062013-07-11 22:46:58 +0000997 }
Greg Claytona1e5dc82015-08-11 22:53:00 +0000998 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +0000999}
1000
1001
Greg Claytona1e5dc82015-08-11 22:53:00 +00001002CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001003ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
1004{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001005 ASTContext *ast = getASTContext();
Sean Callanan38d4df52012-04-03 01:10:10 +00001006
1007#define streq(a,b) strcmp(a,b) == 0
Ed Masted4612ad2014-04-20 13:17:36 +00001008 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001009 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001010 {
1011 switch (dw_ate)
1012 {
Sean Callanan38d4df52012-04-03 01:10:10 +00001013 default:
1014 break;
Greg Clayton605684e2011-10-28 23:06:08 +00001015
Sean Callanan38d4df52012-04-03 01:10:10 +00001016 case DW_ATE_address:
1017 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001018 return CompilerType (ast, ast->VoidPtrTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001019 break;
1020
1021 case DW_ATE_boolean:
1022 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001023 return CompilerType (ast, ast->BoolTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001024 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001025 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001026 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001027 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001028 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001029 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001030 break;
1031
1032 case DW_ATE_lo_user:
1033 // This has been seen to mean DW_AT_complex_integer
1034 if (type_name)
Greg Clayton605684e2011-10-28 23:06:08 +00001035 {
Sean Callanan38d4df52012-04-03 01:10:10 +00001036 if (::strstr(type_name, "complex"))
1037 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001038 CompilerType complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
1039 return CompilerType (ast, ast->getComplexType (GetQualType(complex_int_clang_type)));
Sean Callanan38d4df52012-04-03 01:10:10 +00001040 }
Greg Clayton605684e2011-10-28 23:06:08 +00001041 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001042 break;
1043
1044 case DW_ATE_complex_float:
1045 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001046 return CompilerType (ast, ast->FloatComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001047 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001048 return CompilerType (ast, ast->DoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001049 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001050 return CompilerType (ast, ast->LongDoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001051 else
Greg Clayton605684e2011-10-28 23:06:08 +00001052 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001053 CompilerType complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
1054 return CompilerType (ast, ast->getComplexType (GetQualType(complex_float_clang_type)));
Greg Clayton605684e2011-10-28 23:06:08 +00001055 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001056 break;
1057
1058 case DW_ATE_float:
Greg Clayton8012cad2014-11-17 19:39:20 +00001059 if (streq(type_name, "float") && QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001060 return CompilerType (ast, ast->FloatTy);
Greg Clayton8012cad2014-11-17 19:39:20 +00001061 if (streq(type_name, "double") && QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001062 return CompilerType (ast, ast->DoubleTy);
Greg Clayton8012cad2014-11-17 19:39:20 +00001063 if (streq(type_name, "long double") && QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001064 return CompilerType (ast, ast->LongDoubleTy);
Bruce Mitchenere171da52015-07-22 00:16:02 +00001065 // Fall back to not requiring a name match
Sean Callanan38d4df52012-04-03 01:10:10 +00001066 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001067 return CompilerType (ast, ast->FloatTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001068 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001069 return CompilerType (ast, ast->DoubleTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001070 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001071 return CompilerType (ast, ast->LongDoubleTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001072 break;
1073
1074 case DW_ATE_signed:
1075 if (type_name)
1076 {
1077 if (streq(type_name, "wchar_t") &&
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001078 QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy) &&
Greg Clayton28eb7bf2015-05-07 00:07:44 +00001079 (getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001080 return CompilerType (ast, ast->WCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001081 if (streq(type_name, "void") &&
1082 QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001083 return CompilerType (ast, ast->VoidTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001084 if (strstr(type_name, "long long") &&
1085 QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001086 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001087 if (strstr(type_name, "long") &&
1088 QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001089 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001090 if (strstr(type_name, "short") &&
1091 QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001092 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001093 if (strstr(type_name, "char"))
1094 {
1095 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001096 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001097 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001098 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001099 }
1100 if (strstr(type_name, "int"))
1101 {
1102 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001103 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001104 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001105 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001106 }
1107 }
1108 // We weren't able to match up a type name, just search by size
1109 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001110 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001111 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001112 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001113 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001114 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001115 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001116 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001117 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001118 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001119 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001120 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001121 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001122
Sean Callanan38d4df52012-04-03 01:10:10 +00001123 case DW_ATE_signed_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001124 if (ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
Sean Callanan38d4df52012-04-03 01:10:10 +00001125 {
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001126 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001127 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001128 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001129 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001130 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001131 break;
1132
1133 case DW_ATE_unsigned:
1134 if (type_name)
1135 {
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001136 if (streq(type_name, "wchar_t"))
1137 {
1138 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
1139 {
Greg Clayton28eb7bf2015-05-07 00:07:44 +00001140 if (!(getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001141 return CompilerType (ast, ast->WCharTy);
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001142 }
1143 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001144 if (strstr(type_name, "long long"))
1145 {
1146 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001147 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001148 }
1149 else if (strstr(type_name, "long"))
1150 {
1151 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001152 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001153 }
1154 else if (strstr(type_name, "short"))
1155 {
1156 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001157 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001158 }
1159 else if (strstr(type_name, "char"))
1160 {
1161 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001162 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001163 }
1164 else if (strstr(type_name, "int"))
1165 {
1166 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001167 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001168 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001169 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001170 }
1171 }
1172 // We weren't able to match up a type name, just search by size
1173 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001174 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001175 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001176 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001177 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001178 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001179 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001180 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001181 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001182 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001183 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001184 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001185 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001186
Sean Callanan38d4df52012-04-03 01:10:10 +00001187 case DW_ATE_unsigned_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001188 if (!ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
1189 {
1190 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001191 return CompilerType (ast, ast->CharTy);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001192 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001193 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001194 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001195 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001196 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001197 break;
1198
1199 case DW_ATE_imaginary_float:
1200 break;
1201
1202 case DW_ATE_UTF:
1203 if (type_name)
1204 {
1205 if (streq(type_name, "char16_t"))
1206 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001207 return CompilerType (ast, ast->Char16Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001208 }
1209 else if (streq(type_name, "char32_t"))
1210 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001211 return CompilerType (ast, ast->Char32Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001212 }
1213 }
1214 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001215 }
1216 }
1217 // This assert should fire for anything that we don't catch above so we know
1218 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +00001219 if (type_name)
1220 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001221 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 +00001222 }
1223 else
1224 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001225 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 +00001226 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001227 return CompilerType ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001228}
1229
Greg Claytona1e5dc82015-08-11 22:53:00 +00001230CompilerType
Sean Callanan77502262011-05-12 23:54:16 +00001231ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
1232{
Greg Clayton57ee3062013-07-11 22:46:58 +00001233 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001234 return CompilerType (ast, ast->UnknownAnyTy);
1235 return CompilerType();
Sean Callanan77502262011-05-12 23:54:16 +00001236}
1237
Greg Claytona1e5dc82015-08-11 22:53:00 +00001238CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001239ClangASTContext::GetCStringType (bool is_const)
1240{
Greg Clayton57ee3062013-07-11 22:46:58 +00001241 ASTContext *ast = getASTContext();
1242 QualType char_type(ast->CharTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001243
1244 if (is_const)
1245 char_type.addConst();
1246
Greg Claytona1e5dc82015-08-11 22:53:00 +00001247 return CompilerType (ast, ast->getPointerType(char_type));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001248}
1249
Sean Callanan09ab4b72011-11-30 22:11:59 +00001250clang::DeclContext *
1251ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
1252{
1253 return ast->getTranslationUnitDecl();
1254}
1255
Greg Clayton526e5af2010-11-13 03:52:47 +00001256clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001257ClangASTContext::CopyDecl (ASTContext *dst_ast,
1258 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001259 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001260{
Sean Callanan79439e82010-11-18 02:56:27 +00001261 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001262 FileManager file_manager (file_system_options);
1263 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001264 *src_ast, file_manager,
1265 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001266
1267 return importer.Import(source_decl);
1268}
1269
Sean Callanan23a30272010-07-16 00:00:27 +00001270bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00001271ClangASTContext::AreTypesSame (CompilerType type1,
1272 CompilerType type2,
Greg Clayton84db9102012-03-26 23:03:23 +00001273 bool ignore_qualifiers)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001274{
Greg Claytonf73034f2015-09-08 18:15:05 +00001275 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type1.GetTypeSystem());
1276 if (!ast || ast != type2.GetTypeSystem())
Greg Clayton57ee3062013-07-11 22:46:58 +00001277 return false;
1278
1279 if (type1.GetOpaqueQualType() == type2.GetOpaqueQualType())
Greg Clayton55995eb2012-04-06 17:38:55 +00001280 return true;
1281
Greg Claytond8d4a572015-08-11 21:38:15 +00001282 QualType type1_qual = GetQualType(type1);
1283 QualType type2_qual = GetQualType(type2);
Sean Callanan5056ab02012-02-18 02:01:03 +00001284
1285 if (ignore_qualifiers)
1286 {
1287 type1_qual = type1_qual.getUnqualifiedType();
1288 type2_qual = type2_qual.getUnqualifiedType();
1289 }
1290
Greg Claytonf73034f2015-09-08 18:15:05 +00001291 return ast->getASTContext()->hasSameType (type1_qual, type2_qual);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001292}
1293
Greg Claytona1e5dc82015-08-11 22:53:00 +00001294CompilerType
Sean Callanan9998acd2014-12-05 01:21:59 +00001295ClangASTContext::GetTypeForDecl (clang::NamedDecl *decl)
1296{
1297 if (clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
1298 return GetTypeForDecl(interface_decl);
1299 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
1300 return GetTypeForDecl(tag_decl);
Greg Claytona1e5dc82015-08-11 22:53:00 +00001301 return CompilerType();
Sean Callanan9998acd2014-12-05 01:21:59 +00001302}
1303
Greg Clayton6beaaa62011-01-17 03:46:26 +00001304
Greg Claytona1e5dc82015-08-11 22:53:00 +00001305CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001306ClangASTContext::GetTypeForDecl (TagDecl *decl)
1307{
1308 // No need to call the getASTContext() accessor (which can create the AST
1309 // if it isn't created yet, because we can't have created a decl in this
1310 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001311 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001312 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001313 return CompilerType (ast, ast->getTagDeclType(decl));
1314 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001315}
1316
Greg Claytona1e5dc82015-08-11 22:53:00 +00001317CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001318ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1319{
1320 // No need to call the getASTContext() accessor (which can create the AST
1321 // if it isn't created yet, because we can't have created a decl in this
1322 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001323 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001324 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001325 return CompilerType (ast, ast->getObjCInterfaceType(decl));
1326 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001327}
1328
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001329#pragma mark Structure, Unions, Classes
1330
Greg Claytona1e5dc82015-08-11 22:53:00 +00001331CompilerType
Greg Claytonc4ffd662013-03-08 01:37:30 +00001332ClangASTContext::CreateRecordType (DeclContext *decl_ctx,
1333 AccessType access_type,
1334 const char *name,
1335 int kind,
1336 LanguageType language,
1337 ClangASTMetadata *metadata)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001338{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001339 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001340 assert (ast != nullptr);
Sean Callananad880762012-04-18 01:06:17 +00001341
Ed Masted4612ad2014-04-20 13:17:36 +00001342 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001343 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001344
Greg Clayton9e409562010-07-28 02:04:09 +00001345
Greg Claytone1be9962011-08-24 23:50:00 +00001346 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001347 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001348 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001349 bool isInternal = false;
Sean Callananad880762012-04-18 01:06:17 +00001350 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
Greg Clayton9e409562010-07-28 02:04:09 +00001351 }
1352
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001353 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1354 // we will need to update this code. I was told to currently always use
1355 // the CXXRecordDecl class since we often don't know from debug information
1356 // if something is struct or a class, so we default to always use the more
1357 // complete definition just in case.
Sean Callanan11e32d32014-02-18 00:31:38 +00001358
1359 bool is_anonymous = (!name) || (!name[0]);
1360
Greg Claytonf0705c82011-10-22 03:33:13 +00001361 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1362 (TagDecl::TagKind)kind,
1363 decl_ctx,
1364 SourceLocation(),
1365 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001366 is_anonymous ? nullptr : &ast->Idents.get(name));
Sean Callanan11e32d32014-02-18 00:31:38 +00001367
1368 if (is_anonymous)
1369 decl->setAnonymousStructOrUnion(true);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001370
Greg Claytonc4ffd662013-03-08 01:37:30 +00001371 if (decl)
Greg Clayton55561e92011-10-26 03:31:36 +00001372 {
Greg Claytonc4ffd662013-03-08 01:37:30 +00001373 if (metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001374 SetMetadata(ast, decl, *metadata);
Greg Claytonc4ffd662013-03-08 01:37:30 +00001375
Greg Clayton55561e92011-10-26 03:31:36 +00001376 if (access_type != eAccessNone)
1377 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Claytonc4ffd662013-03-08 01:37:30 +00001378
1379 if (decl_ctx)
1380 decl_ctx->addDecl (decl);
1381
Greg Claytona1e5dc82015-08-11 22:53:00 +00001382 return CompilerType(ast, ast->getTagDeclType(decl));
Greg Clayton55561e92011-10-26 03:31:36 +00001383 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001384 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001385}
1386
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001387static TemplateParameterList *
1388CreateTemplateParameterList (ASTContext *ast,
Sean Callanan3d654b32012-09-24 22:25:51 +00001389 const ClangASTContext::TemplateParameterInfos &template_param_infos,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001390 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1391{
1392 const bool parameter_pack = false;
1393 const bool is_typename = false;
1394 const unsigned depth = 0;
1395 const size_t num_template_params = template_param_infos.GetSize();
1396 for (size_t i=0; i<num_template_params; ++i)
1397 {
1398 const char *name = template_param_infos.names[i];
Greg Clayton283b2652013-04-23 22:38:02 +00001399
Ed Masted4612ad2014-04-20 13:17:36 +00001400 IdentifierInfo *identifier_info = nullptr;
Greg Clayton283b2652013-04-23 22:38:02 +00001401 if (name && name[0])
1402 identifier_info = &ast->Idents.get(name);
Sean Callanan3d654b32012-09-24 22:25:51 +00001403 if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001404 {
1405 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1406 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1407 SourceLocation(),
1408 SourceLocation(),
1409 depth,
1410 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001411 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001412 template_param_infos.args[i].getIntegralType(),
1413 parameter_pack,
Ed Masted4612ad2014-04-20 13:17:36 +00001414 nullptr));
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001415
1416 }
1417 else
1418 {
1419 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1420 ast->getTranslationUnitDecl(), // Is this the right decl context?
1421 SourceLocation(),
1422 SourceLocation(),
1423 depth,
1424 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001425 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001426 is_typename,
1427 parameter_pack));
1428 }
1429 }
1430
1431 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1432 SourceLocation(),
1433 SourceLocation(),
1434 &template_param_decls.front(),
1435 template_param_decls.size(),
1436 SourceLocation());
1437 return template_param_list;
1438}
1439
1440clang::FunctionTemplateDecl *
1441ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1442 clang::FunctionDecl *func_decl,
1443 const char *name,
1444 const TemplateParameterInfos &template_param_infos)
1445{
1446// /// \brief Create a function template node.
1447 ASTContext *ast = getASTContext();
1448
1449 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1450
1451 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1452 template_param_infos,
1453 template_param_decls);
1454 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1455 decl_ctx,
1456 func_decl->getLocation(),
1457 func_decl->getDeclName(),
1458 template_param_list,
1459 func_decl);
1460
1461 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1462 i < template_param_decl_count;
1463 ++i)
1464 {
1465 // TODO: verify which decl context we should put template_param_decls into..
1466 template_param_decls[i]->setDeclContext (func_decl);
1467 }
1468
1469 return func_tmpl_decl;
1470}
1471
1472void
1473ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1474 clang::FunctionTemplateDecl *func_tmpl_decl,
1475 const TemplateParameterInfos &infos)
1476{
1477 TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1478 infos.args.data(),
1479 infos.args.size());
1480
1481 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1482 &template_args,
Ed Masted4612ad2014-04-20 13:17:36 +00001483 nullptr);
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001484}
1485
1486
Greg Claytonf0705c82011-10-22 03:33:13 +00001487ClassTemplateDecl *
1488ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001489 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001490 const char *class_name,
1491 int kind,
1492 const TemplateParameterInfos &template_param_infos)
1493{
1494 ASTContext *ast = getASTContext();
1495
Ed Masted4612ad2014-04-20 13:17:36 +00001496 ClassTemplateDecl *class_template_decl = nullptr;
1497 if (decl_ctx == nullptr)
Greg Claytonf0705c82011-10-22 03:33:13 +00001498 decl_ctx = ast->getTranslationUnitDecl();
1499
1500 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1501 DeclarationName decl_name (&identifier_info);
1502
1503 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001504
1505 for (NamedDecl *decl : result)
Greg Claytonf0705c82011-10-22 03:33:13 +00001506 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001507 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
Greg Claytonf0705c82011-10-22 03:33:13 +00001508 if (class_template_decl)
1509 return class_template_decl;
1510 }
1511
1512 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf0705c82011-10-22 03:33:13 +00001513
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001514 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1515 template_param_infos,
1516 template_param_decls);
Greg Claytonf0705c82011-10-22 03:33:13 +00001517
1518 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1519 (TagDecl::TagKind)kind,
1520 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1521 SourceLocation(),
1522 SourceLocation(),
1523 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001524
1525 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1526 i < template_param_decl_count;
1527 ++i)
1528 {
1529 template_param_decls[i]->setDeclContext (template_cxx_decl);
1530 }
1531
Sean Callananb5c79622011-11-19 01:35:08 +00001532 // With templated classes, we say that a class is templated with
1533 // specializations, but that the bare class has no functions.
Sean Callananfa4fab72013-02-01 06:55:48 +00001534 //template_cxx_decl->startDefinition();
1535 //template_cxx_decl->completeDefinition();
Sean Callananb5c79622011-11-19 01:35:08 +00001536
Greg Claytonf0705c82011-10-22 03:33:13 +00001537 class_template_decl = ClassTemplateDecl::Create (*ast,
1538 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1539 SourceLocation(),
1540 decl_name,
1541 template_param_list,
1542 template_cxx_decl,
Ed Masted4612ad2014-04-20 13:17:36 +00001543 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001544
1545 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001546 {
Greg Clayton55561e92011-10-26 03:31:36 +00001547 if (access_type != eAccessNone)
1548 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan5b26f272012-02-04 08:49:35 +00001549
1550 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1551 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1552
Greg Claytonf0705c82011-10-22 03:33:13 +00001553 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001554
1555#ifdef LLDB_CONFIGURATION_DEBUG
1556 VerifyDecl(class_template_decl);
1557#endif
1558 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001559
1560 return class_template_decl;
1561}
1562
1563
1564ClassTemplateSpecializationDecl *
1565ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1566 ClassTemplateDecl *class_template_decl,
1567 int kind,
1568 const TemplateParameterInfos &template_param_infos)
1569{
1570 ASTContext *ast = getASTContext();
1571 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1572 (TagDecl::TagKind)kind,
1573 decl_ctx,
1574 SourceLocation(),
1575 SourceLocation(),
1576 class_template_decl,
1577 &template_param_infos.args.front(),
1578 template_param_infos.args.size(),
Ed Masted4612ad2014-04-20 13:17:36 +00001579 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001580
Sean Callananfa4fab72013-02-01 06:55:48 +00001581 class_template_specialization_decl->setSpecializationKind(TSK_ExplicitSpecialization);
1582
Greg Claytonf0705c82011-10-22 03:33:13 +00001583 return class_template_specialization_decl;
1584}
1585
Greg Claytona1e5dc82015-08-11 22:53:00 +00001586CompilerType
Greg Claytonf0705c82011-10-22 03:33:13 +00001587ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1588{
1589 if (class_template_specialization_decl)
1590 {
1591 ASTContext *ast = getASTContext();
1592 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001593 return CompilerType(ast, ast->getTagDeclType(class_template_specialization_decl));
Greg Claytonf0705c82011-10-22 03:33:13 +00001594 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001595 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001596}
1597
Greg Clayton090d0982011-06-19 03:43:27 +00001598static inline bool
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001599check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001600{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001601 // Special-case call since it can take any number of operands
1602 if(op_kind == OO_Call)
1603 return true;
1604
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001605 // The parameter count doesn't include "this"
Greg Clayton090d0982011-06-19 03:43:27 +00001606 if (num_params == 0)
1607 return unary;
1608 if (num_params == 1)
1609 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001610 else
Greg Clayton090d0982011-06-19 03:43:27 +00001611 return false;
1612}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001613
Greg Clayton090d0982011-06-19 03:43:27 +00001614bool
1615ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1616{
Sean Callanan5b26f272012-02-04 08:49:35 +00001617 switch (op_kind)
1618 {
1619 default:
1620 break;
1621 // C++ standard allows any number of arguments to new/delete
1622 case OO_New:
1623 case OO_Array_New:
1624 case OO_Delete:
1625 case OO_Array_Delete:
1626 return true;
1627 }
1628
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001629#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 +00001630 switch (op_kind)
1631 {
1632#include "clang/Basic/OperatorKinds.def"
1633 default: break;
1634 }
1635 return false;
1636}
1637
Greg Clayton57ee3062013-07-11 22:46:58 +00001638clang::AccessSpecifier
1639ClangASTContext::UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs)
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001640{
1641 clang::AccessSpecifier ret = lhs;
1642
1643 // Make the access equal to the stricter of the field and the nested field's access
1644 switch (ret)
1645 {
1646 case clang::AS_none:
1647 break;
1648 case clang::AS_private:
1649 break;
1650 case clang::AS_protected:
1651 if (rhs == AS_private)
1652 ret = AS_private;
1653 break;
1654 case clang::AS_public:
1655 ret = rhs;
1656 break;
1657 }
1658
1659 return ret;
1660}
1661
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001662bool
1663ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1664{
1665 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1666}
1667
1668bool
1669ClangASTContext::FieldIsBitfield
1670(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001671 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001672 FieldDecl* field,
1673 uint32_t& bitfield_bit_size
1674)
1675{
Ed Masted4612ad2014-04-20 13:17:36 +00001676 if (ast == nullptr || field == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001677 return false;
1678
1679 if (field->isBitField())
1680 {
1681 Expr* bit_width_expr = field->getBitWidth();
1682 if (bit_width_expr)
1683 {
1684 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001685 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001686 {
1687 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1688 return true;
1689 }
1690 }
1691 }
1692 return false;
1693}
1694
1695bool
1696ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1697{
Ed Masted4612ad2014-04-20 13:17:36 +00001698 if (record_decl == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001699 return false;
1700
1701 if (!record_decl->field_empty())
1702 return true;
1703
1704 // No fields, lets check this is a CXX record and check the base classes
1705 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1706 if (cxx_record_decl)
1707 {
1708 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1709 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1710 base_class != base_class_end;
1711 ++base_class)
1712 {
1713 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1714 if (RecordHasFields(base_class_decl))
1715 return true;
1716 }
1717 }
1718 return false;
1719}
1720
Greg Clayton8cf05932010-07-22 18:30:50 +00001721#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001722
Greg Claytona1e5dc82015-08-11 22:53:00 +00001723CompilerType
Sean Callananad880762012-04-18 01:06:17 +00001724ClangASTContext::CreateObjCClass
Greg Clayton8cf05932010-07-22 18:30:50 +00001725(
1726 const char *name,
1727 DeclContext *decl_ctx,
1728 bool isForwardDecl,
Sean Callananad880762012-04-18 01:06:17 +00001729 bool isInternal,
Jim Ingham379397632012-10-27 02:54:13 +00001730 ClangASTMetadata *metadata
Greg Clayton8cf05932010-07-22 18:30:50 +00001731)
1732{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001733 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001734 assert (ast != nullptr);
Greg Clayton8cf05932010-07-22 18:30:50 +00001735 assert (name && name[0]);
Ed Masted4612ad2014-04-20 13:17:36 +00001736 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001737 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00001738
Greg Clayton6beaaa62011-01-17 03:46:26 +00001739 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001740 decl_ctx,
1741 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001742 &ast->Idents.get(name),
Ed Masted4612ad2014-04-20 13:17:36 +00001743 nullptr,
Pavel Labath67add942015-07-07 10:11:16 +00001744 nullptr,
Greg Clayton8cf05932010-07-22 18:30:50 +00001745 SourceLocation(),
Sean Callanan5b26f272012-02-04 08:49:35 +00001746 /*isForwardDecl,*/
Greg Clayton8cf05932010-07-22 18:30:50 +00001747 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00001748
Jim Ingham379397632012-10-27 02:54:13 +00001749 if (decl && metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001750 SetMetadata(ast, decl, *metadata);
Sean Callananad880762012-04-18 01:06:17 +00001751
Greg Claytona1e5dc82015-08-11 22:53:00 +00001752 return CompilerType (ast, ast->getObjCInterfaceType(decl));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001753}
1754
1755static inline bool
1756BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
1757{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001758 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001759}
1760
Greg Clayton57ee3062013-07-11 22:46:58 +00001761uint32_t
1762ClangASTContext::GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001763{
1764 uint32_t num_bases = 0;
1765 if (cxx_record_decl)
1766 {
1767 if (omit_empty_base_classes)
1768 {
1769 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1770 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1771 base_class != base_class_end;
1772 ++base_class)
1773 {
1774 // Skip empty base classes
1775 if (omit_empty_base_classes)
1776 {
1777 if (BaseSpecifierIsEmpty (base_class))
1778 continue;
1779 }
1780 ++num_bases;
1781 }
1782 }
1783 else
1784 num_bases = cxx_record_decl->getNumBases();
1785 }
1786 return num_bases;
1787}
1788
1789
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001790#pragma mark Namespace Declarations
1791
1792NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00001793ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001794{
Ed Masted4612ad2014-04-20 13:17:36 +00001795 NamespaceDecl *namespace_decl = nullptr;
Greg Clayton9d3d6882011-10-31 23:51:19 +00001796 ASTContext *ast = getASTContext();
1797 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
Ed Masted4612ad2014-04-20 13:17:36 +00001798 if (decl_ctx == nullptr)
Greg Clayton9d3d6882011-10-31 23:51:19 +00001799 decl_ctx = translation_unit_decl;
1800
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001801 if (name)
1802 {
Greg Clayton030a2042011-10-14 21:34:45 +00001803 IdentifierInfo &identifier_info = ast->Idents.get(name);
1804 DeclarationName decl_name (&identifier_info);
1805 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001806 for (NamedDecl *decl : result)
Greg Clayton030a2042011-10-14 21:34:45 +00001807 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001808 namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
Greg Clayton030a2042011-10-14 21:34:45 +00001809 if (namespace_decl)
1810 return namespace_decl;
1811 }
1812
Sean Callanan5b26f272012-02-04 08:49:35 +00001813 namespace_decl = NamespaceDecl::Create(*ast,
1814 decl_ctx,
1815 false,
1816 SourceLocation(),
1817 SourceLocation(),
1818 &identifier_info,
Ed Masted4612ad2014-04-20 13:17:36 +00001819 nullptr);
Greg Clayton030a2042011-10-14 21:34:45 +00001820
Greg Clayton9d3d6882011-10-31 23:51:19 +00001821 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001822 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001823 else
1824 {
1825 if (decl_ctx == translation_unit_decl)
1826 {
1827 namespace_decl = translation_unit_decl->getAnonymousNamespace();
1828 if (namespace_decl)
1829 return namespace_decl;
1830
Sean Callanan5b26f272012-02-04 08:49:35 +00001831 namespace_decl = NamespaceDecl::Create(*ast,
1832 decl_ctx,
1833 false,
1834 SourceLocation(),
1835 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001836 nullptr,
1837 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001838 translation_unit_decl->setAnonymousNamespace (namespace_decl);
1839 translation_unit_decl->addDecl (namespace_decl);
1840 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
1841 }
1842 else
1843 {
1844 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
1845 if (parent_namespace_decl)
1846 {
1847 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
1848 if (namespace_decl)
1849 return namespace_decl;
Sean Callanan5b26f272012-02-04 08:49:35 +00001850 namespace_decl = NamespaceDecl::Create(*ast,
1851 decl_ctx,
1852 false,
1853 SourceLocation(),
1854 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001855 nullptr,
1856 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001857 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
1858 parent_namespace_decl->addDecl (namespace_decl);
1859 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
1860 }
1861 else
1862 {
1863 // BAD!!!
1864 }
1865 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001866 }
1867#ifdef LLDB_CONFIGURATION_DEBUG
1868 VerifyDecl(namespace_decl);
1869#endif
Greg Clayton030a2042011-10-14 21:34:45 +00001870 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001871}
1872
1873
Paul Hermand628cbb2015-09-15 23:44:17 +00001874clang::BlockDecl *
1875ClangASTContext::CreateBlockDeclaration (clang::DeclContext *ctx)
1876{
1877 if (ctx != nullptr)
1878 {
1879 clang::BlockDecl *decl = clang::BlockDecl::Create(*getASTContext(), ctx, clang::SourceLocation());
1880 ctx->addDecl(decl);
1881 return decl;
1882 }
1883 return nullptr;
1884}
1885
Paul Hermanea188fc2015-09-16 18:48:30 +00001886clang::DeclContext *
1887FindLCABetweenDecls(clang::DeclContext *left, clang::DeclContext *right, clang::DeclContext *root)
1888{
1889 if (root == nullptr)
1890 return nullptr;
1891
1892 std::set<clang::DeclContext *> path_left;
1893 for (clang::DeclContext *d = left; d != nullptr; d = d->getParent())
1894 path_left.insert(d);
1895
1896 for (clang::DeclContext *d = right; d != nullptr; d = d->getParent())
1897 if (path_left.find(d) != path_left.end())
1898 return d;
1899
1900 return nullptr;
1901}
1902
Paul Hermand628cbb2015-09-15 23:44:17 +00001903clang::UsingDirectiveDecl *
1904ClangASTContext::CreateUsingDirectiveDeclaration (clang::DeclContext *decl_ctx, clang::NamespaceDecl *ns_decl)
1905{
1906 if (decl_ctx != nullptr && ns_decl != nullptr)
1907 {
Paul Hermanea188fc2015-09-16 18:48:30 +00001908 clang::TranslationUnitDecl *translation_unit = (clang::TranslationUnitDecl *)GetTranslationUnitDecl(getASTContext());
Paul Hermand628cbb2015-09-15 23:44:17 +00001909 clang::UsingDirectiveDecl *using_decl = clang::UsingDirectiveDecl::Create(*getASTContext(),
1910 decl_ctx,
1911 clang::SourceLocation(),
1912 clang::SourceLocation(),
1913 clang::NestedNameSpecifierLoc(),
1914 clang::SourceLocation(),
1915 ns_decl,
Paul Hermanea188fc2015-09-16 18:48:30 +00001916 FindLCABetweenDecls(decl_ctx, ns_decl, translation_unit));
Paul Hermand628cbb2015-09-15 23:44:17 +00001917 decl_ctx->addDecl(using_decl);
1918 return using_decl;
1919 }
1920 return nullptr;
1921}
1922
1923clang::UsingDecl *
1924ClangASTContext::CreateUsingDeclaration (clang::DeclContext *current_decl_ctx, clang::NamedDecl *target)
1925{
1926 if (current_decl_ctx != nullptr && target != nullptr)
1927 {
1928 clang::UsingDecl *using_decl = clang::UsingDecl::Create(*getASTContext(),
1929 current_decl_ctx,
1930 clang::SourceLocation(),
1931 clang::NestedNameSpecifierLoc(),
1932 clang::DeclarationNameInfo(),
1933 false);
1934 clang::UsingShadowDecl *shadow_decl = clang::UsingShadowDecl::Create(*getASTContext(),
1935 current_decl_ctx,
1936 clang::SourceLocation(),
1937 using_decl,
1938 target);
1939 using_decl->addShadowDecl(shadow_decl);
1940 current_decl_ctx->addDecl(using_decl);
1941 return using_decl;
1942 }
1943 return nullptr;
1944}
1945
1946clang::VarDecl *
1947ClangASTContext::CreateVariableDeclaration (clang::DeclContext *decl_context, const char *name, clang::QualType type)
1948{
1949 if (decl_context != nullptr)
1950 {
1951 clang::VarDecl *var_decl = clang::VarDecl::Create(*getASTContext(),
1952 decl_context,
1953 clang::SourceLocation(),
1954 clang::SourceLocation(),
1955 name && name[0] ? &getASTContext()->Idents.getOwn(name) : nullptr,
1956 type,
1957 nullptr,
1958 clang::SC_None);
1959 var_decl->setAccess(clang::AS_public);
1960 decl_context->addDecl(var_decl);
Paul Hermand628cbb2015-09-15 23:44:17 +00001961 return var_decl;
1962 }
1963 return nullptr;
1964}
1965
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001966#pragma mark Function Types
1967
1968FunctionDecl *
Greg Clayton57ee3062013-07-11 22:46:58 +00001969ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx,
1970 const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001971 const CompilerType &function_clang_type,
Greg Clayton57ee3062013-07-11 22:46:58 +00001972 int storage,
1973 bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001974{
Ed Masted4612ad2014-04-20 13:17:36 +00001975 FunctionDecl *func_decl = nullptr;
Greg Clayton147e1fa2011-10-14 22:47:18 +00001976 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001977 if (decl_ctx == nullptr)
Greg Clayton147e1fa2011-10-14 22:47:18 +00001978 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001979
Greg Clayton0d551042013-06-28 21:08:47 +00001980
1981 const bool hasWrittenPrototype = true;
1982 const bool isConstexprSpecified = false;
1983
Greg Clayton147e1fa2011-10-14 22:47:18 +00001984 if (name && name[0])
1985 {
1986 func_decl = FunctionDecl::Create (*ast,
1987 decl_ctx,
1988 SourceLocation(),
1989 SourceLocation(),
1990 DeclarationName (&ast->Idents.get(name)),
Greg Claytond8d4a572015-08-11 21:38:15 +00001991 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00001992 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00001993 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00001994 is_inline,
1995 hasWrittenPrototype,
1996 isConstexprSpecified);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001997 }
Greg Clayton147e1fa2011-10-14 22:47:18 +00001998 else
1999 {
2000 func_decl = FunctionDecl::Create (*ast,
2001 decl_ctx,
2002 SourceLocation(),
2003 SourceLocation(),
2004 DeclarationName (),
Greg Claytond8d4a572015-08-11 21:38:15 +00002005 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00002006 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00002007 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00002008 is_inline,
2009 hasWrittenPrototype,
2010 isConstexprSpecified);
Greg Clayton147e1fa2011-10-14 22:47:18 +00002011 }
2012 if (func_decl)
2013 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00002014
2015#ifdef LLDB_CONFIGURATION_DEBUG
2016 VerifyDecl(func_decl);
2017#endif
2018
Greg Clayton147e1fa2011-10-14 22:47:18 +00002019 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002020}
2021
Greg Claytona1e5dc82015-08-11 22:53:00 +00002022CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00002023ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002024 const CompilerType& result_type,
2025 const CompilerType *args,
Sean Callananc81256a2010-09-16 20:40:25 +00002026 unsigned num_args,
2027 bool is_variadic,
2028 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002029{
Ed Masted4612ad2014-04-20 13:17:36 +00002030 assert (ast != nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002031 std::vector<QualType> qual_type_args;
2032 for (unsigned i=0; i<num_args; ++i)
Greg Claytond8d4a572015-08-11 21:38:15 +00002033 qual_type_args.push_back (GetQualType(args[i]));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002034
2035 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00002036 FunctionProtoType::ExtProtoInfo proto_info;
2037 proto_info.Variadic = is_variadic;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00002038 proto_info.ExceptionSpec = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00002039 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00002040 proto_info.RefQualifier = RQ_None;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00002041
Greg Claytona1e5dc82015-08-11 22:53:00 +00002042 return CompilerType (ast, ast->getFunctionType (GetQualType(result_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00002043 qual_type_args,
Greg Claytond8d4a572015-08-11 21:38:15 +00002044 proto_info));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002045}
2046
2047ParmVarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00002048ClangASTContext::CreateParameterDeclaration (const char *name, const CompilerType &param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002049{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002050 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002051 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00002052 return ParmVarDecl::Create(*ast,
2053 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002054 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00002055 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00002056 name && name[0] ? &ast->Idents.get(name) : nullptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00002057 GetQualType(param_type),
Ed Masted4612ad2014-04-20 13:17:36 +00002058 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00002059 (clang::StorageClass)storage,
Ed Masted4612ad2014-04-20 13:17:36 +00002060 nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002061}
2062
2063void
2064ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
2065{
2066 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00002067 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002068}
2069
2070
2071#pragma mark Array Types
2072
Greg Claytona1e5dc82015-08-11 22:53:00 +00002073CompilerType
2074ClangASTContext::CreateArrayType (const CompilerType &element_type,
Greg Clayton1c8ef472013-04-05 23:27:21 +00002075 size_t element_count,
2076 bool is_vector)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002077{
Greg Clayton57ee3062013-07-11 22:46:58 +00002078 if (element_type.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002079 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002080 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002081 assert (ast != nullptr);
Greg Clayton4ef877f2012-12-06 02:33:54 +00002082
Greg Clayton1c8ef472013-04-05 23:27:21 +00002083 if (is_vector)
2084 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00002085 return CompilerType (ast, ast->getExtVectorType(GetQualType(element_type), element_count));
Greg Clayton4ef877f2012-12-06 02:33:54 +00002086 }
2087 else
2088 {
Greg Clayton1c8ef472013-04-05 23:27:21 +00002089
2090 llvm::APInt ap_element_count (64, element_count);
2091 if (element_count == 0)
2092 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00002093 return CompilerType (ast, ast->getIncompleteArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00002094 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00002095 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00002096 }
2097 else
2098 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00002099 return CompilerType (ast, ast->getConstantArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00002100 ap_element_count,
2101 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00002102 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00002103 }
Greg Clayton4ef877f2012-12-06 02:33:54 +00002104 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002105 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002106 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002107}
2108
Greg Claytona1e5dc82015-08-11 22:53:00 +00002109CompilerType
Enrico Granata76b08d52014-10-29 23:08:02 +00002110ClangASTContext::GetOrCreateStructForIdentifier (const ConstString &type_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002111 const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields,
Enrico Granataa449e862014-10-30 00:53:28 +00002112 bool packed)
Enrico Granata76b08d52014-10-29 23:08:02 +00002113{
Greg Claytona1e5dc82015-08-11 22:53:00 +00002114 CompilerType type;
Enrico Granata76b08d52014-10-29 23:08:02 +00002115 if ((type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
2116 return type;
2117 type = CreateRecordType(nullptr, lldb::eAccessPublic, type_name.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC);
Greg Claytond8d4a572015-08-11 21:38:15 +00002118 StartTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00002119 for (const auto& field : type_fields)
Greg Claytond8d4a572015-08-11 21:38:15 +00002120 AddFieldToRecordType(type, field.first, field.second, lldb::eAccessPublic, 0);
Enrico Granataa449e862014-10-30 00:53:28 +00002121 if (packed)
Greg Claytond8d4a572015-08-11 21:38:15 +00002122 SetIsPacked(type);
2123 CompleteTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00002124 return type;
2125}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002126
2127#pragma mark Enumeration Types
2128
Greg Claytona1e5dc82015-08-11 22:53:00 +00002129CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00002130ClangASTContext::CreateEnumerationType
Greg Claytonca512b32011-01-14 04:54:56 +00002131(
Greg Claytond8d4a572015-08-11 21:38:15 +00002132 const char *name,
2133 DeclContext *decl_ctx,
2134 const Declaration &decl,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002135 const CompilerType &integer_clang_type
Greg Claytond8d4a572015-08-11 21:38:15 +00002136 )
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002137{
2138 // TODO: Do something intelligent with the Declaration object passed in
2139 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00002140 ASTContext *ast = getASTContext();
Greg Claytond8d4a572015-08-11 21:38:15 +00002141
Greg Claytone02b8502010-10-12 04:29:14 +00002142 // TODO: ask about these...
Greg Claytond8d4a572015-08-11 21:38:15 +00002143 // const bool IsScoped = false;
2144 // const bool IsFixed = false;
2145
Greg Clayton6beaaa62011-01-17 03:46:26 +00002146 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00002147 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00002148 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00002149 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00002150 name && name[0] ? &ast->Idents.get(name) : nullptr,
2151 nullptr,
Sean Callanan48114472010-12-13 01:26:27 +00002152 false, // IsScoped
2153 false, // IsScopedUsingClassTag
2154 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00002155
2156
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002157 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00002158 {
2159 // TODO: check if we should be setting the promotion type too?
Greg Claytond8d4a572015-08-11 21:38:15 +00002160 enum_decl->setIntegerType(GetQualType(integer_clang_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00002161
2162 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
2163
Greg Claytona1e5dc82015-08-11 22:53:00 +00002164 return CompilerType (ast, ast->getTagDeclType(enum_decl));
Greg Clayton83ff3892010-09-12 23:17:56 +00002165 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002166 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002167}
2168
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002169// Disable this for now since I can't seem to get a nicely formatted float
2170// out of the APFloat class without just getting the float, double or quad
2171// and then using a formatted print on it which defeats the purpose. We ideally
2172// would like to get perfect string values for any kind of float semantics
2173// so we can support remote targets. The code below also requires a patch to
2174// llvm::APInt.
2175//bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002176//ClangASTContext::ConvertFloatValueToString (ASTContext *ast, lldb::opaque_compiler_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 +00002177//{
2178// uint32_t count = 0;
2179// bool is_complex = false;
2180// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
2181// {
2182// unsigned num_bytes_per_float = byte_size / count;
2183// unsigned num_bits_per_float = num_bytes_per_float * 8;
2184//
2185// float_str.clear();
2186// uint32_t i;
2187// for (i=0; i<count; i++)
2188// {
2189// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
2190// bool is_ieee = false;
2191// APFloat ap_float(ap_int, is_ieee);
2192// char s[1024];
2193// unsigned int hex_digits = 0;
2194// bool upper_case = false;
2195//
2196// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
2197// {
2198// if (i > 0)
2199// float_str.append(", ");
2200// float_str.append(s);
2201// if (i == 1 && is_complex)
2202// float_str.append(1, 'i');
2203// }
2204// }
2205// return !float_str.empty();
2206// }
2207// return false;
2208//}
2209
Greg Claytona1e5dc82015-08-11 22:53:00 +00002210CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002211ClangASTContext::GetIntTypeFromBitSize (clang::ASTContext *ast,
2212 size_t bit_size, bool is_signed)
2213{
2214 if (ast)
2215 {
2216 if (is_signed)
2217 {
2218 if (bit_size == ast->getTypeSize(ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002219 return CompilerType(ast, ast->SignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002220
2221 if (bit_size == ast->getTypeSize(ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002222 return CompilerType(ast, ast->ShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002223
2224 if (bit_size == ast->getTypeSize(ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002225 return CompilerType(ast, ast->IntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002226
2227 if (bit_size == ast->getTypeSize(ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002228 return CompilerType(ast, ast->LongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002229
2230 if (bit_size == ast->getTypeSize(ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002231 return CompilerType(ast, ast->LongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002232
2233 if (bit_size == ast->getTypeSize(ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002234 return CompilerType(ast, ast->Int128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002235 }
2236 else
2237 {
2238 if (bit_size == ast->getTypeSize(ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002239 return CompilerType(ast, ast->UnsignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002240
2241 if (bit_size == ast->getTypeSize(ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002242 return CompilerType(ast, ast->UnsignedShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002243
2244 if (bit_size == ast->getTypeSize(ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002245 return CompilerType(ast, ast->UnsignedIntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002246
2247 if (bit_size == ast->getTypeSize(ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002248 return CompilerType(ast, ast->UnsignedLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002249
2250 if (bit_size == ast->getTypeSize(ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002251 return CompilerType(ast, ast->UnsignedLongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002252
2253 if (bit_size == ast->getTypeSize(ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002254 return CompilerType(ast, ast->UnsignedInt128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002255 }
2256 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002257 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002258}
2259
Greg Claytona1e5dc82015-08-11 22:53:00 +00002260CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002261ClangASTContext::GetPointerSizedIntType (clang::ASTContext *ast, bool is_signed)
2262{
2263 if (ast)
2264 return GetIntTypeFromBitSize(ast, ast->getTypeSize(ast->VoidPtrTy), is_signed);
Greg Claytona1e5dc82015-08-11 22:53:00 +00002265 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002266}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002267
Enrico Granata86027e92012-03-24 01:11:14 +00002268bool
Greg Claytona2721472011-06-25 00:44:06 +00002269ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
2270 clang::Decl *decl)
2271{
2272 if (!decl)
2273 return false;
2274
2275 ExternalASTSource *ast_source = ast->getExternalSource();
2276
2277 if (!ast_source)
2278 return false;
2279
2280 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
2281 {
Greg Clayton219cf312012-03-30 00:51:13 +00002282 if (tag_decl->isCompleteDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002283 return true;
2284
2285 if (!tag_decl->hasExternalLexicalStorage())
2286 return false;
2287
2288 ast_source->CompleteType(tag_decl);
2289
2290 return !tag_decl->getTypeForDecl()->isIncompleteType();
2291 }
2292 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
2293 {
Sean Callanan5b26f272012-02-04 08:49:35 +00002294 if (objc_interface_decl->getDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002295 return true;
2296
2297 if (!objc_interface_decl->hasExternalLexicalStorage())
2298 return false;
2299
2300 ast_source->CompleteType(objc_interface_decl);
2301
Sean Callanan5b26f272012-02-04 08:49:35 +00002302 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytona2721472011-06-25 00:44:06 +00002303 }
2304 else
2305 {
2306 return false;
2307 }
2308}
2309
Sean Callanan60217122012-04-13 00:10:03 +00002310void
Greg Claytond0029442013-03-27 01:48:02 +00002311ClangASTContext::SetMetadataAsUserID (const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002312 user_id_t user_id)
2313{
2314 ClangASTMetadata meta_data;
2315 meta_data.SetUserID (user_id);
2316 SetMetadata (object, meta_data);
2317}
2318
2319void
Sean Callanan60217122012-04-13 00:10:03 +00002320ClangASTContext::SetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002321 const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002322 ClangASTMetadata &metadata)
Sean Callanan60217122012-04-13 00:10:03 +00002323{
2324 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002325 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002326
2327 if (external_source)
2328 external_source->SetMetadata(object, metadata);
2329}
2330
Jim Ingham379397632012-10-27 02:54:13 +00002331ClangASTMetadata *
Sean Callanan60217122012-04-13 00:10:03 +00002332ClangASTContext::GetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002333 const void *object)
Sean Callanan60217122012-04-13 00:10:03 +00002334{
2335 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002336 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002337
2338 if (external_source && external_source->HasMetadata(object))
2339 return external_source->GetMetadata(object);
2340 else
Ed Masted4612ad2014-04-20 13:17:36 +00002341 return nullptr;
Sean Callanan60217122012-04-13 00:10:03 +00002342}
2343
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002344clang::DeclContext *
2345ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
2346{
Sean Callanana87bee82011-08-19 06:19:25 +00002347 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002348}
2349
2350clang::DeclContext *
2351ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
2352{
Sean Callanana87bee82011-08-19 06:19:25 +00002353 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002354}
2355
Greg Claytond8d4a572015-08-11 21:38:15 +00002356bool
2357ClangASTContext::SetTagTypeKind (clang::QualType tag_qual_type, int kind) const
2358{
2359 const clang::Type *clang_type = tag_qual_type.getTypePtr();
2360 if (clang_type)
2361 {
2362 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(clang_type);
2363 if (tag_type)
2364 {
2365 clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(tag_type->getDecl());
2366 if (tag_decl)
2367 {
2368 tag_decl->setTagKind ((clang::TagDecl::TagKind)kind);
2369 return true;
2370 }
2371 }
2372 }
2373 return false;
2374}
2375
2376
2377bool
2378ClangASTContext::SetDefaultAccessForRecordFields (clang::RecordDecl* record_decl,
2379 int default_accessibility,
2380 int *assigned_accessibilities,
2381 size_t num_assigned_accessibilities)
2382{
2383 if (record_decl)
2384 {
2385 uint32_t field_idx;
2386 clang::RecordDecl::field_iterator field, field_end;
2387 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2388 field != field_end;
2389 ++field, ++field_idx)
2390 {
2391 // If no accessibility was assigned, assign the correct one
2392 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2393 field->setAccess ((clang::AccessSpecifier)default_accessibility);
2394 }
2395 return true;
2396 }
2397 return false;
2398}
2399
2400clang::DeclContext *
Greg Clayton99558cc42015-08-24 23:46:31 +00002401ClangASTContext::GetDeclContextForType (const CompilerType& type)
2402{
2403 return GetDeclContextForType(GetQualType(type));
2404}
2405
2406clang::DeclContext *
Greg Claytond8d4a572015-08-11 21:38:15 +00002407ClangASTContext::GetDeclContextForType (clang::QualType type)
2408{
2409 if (type.isNull())
2410 return nullptr;
2411
2412 clang::QualType qual_type = type.getCanonicalType();
2413 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2414 switch (type_class)
2415 {
Greg Claytond8d4a572015-08-11 21:38:15 +00002416 case clang::Type::ObjCInterface: return llvm::cast<clang::ObjCObjectType>(qual_type.getTypePtr())->getInterface();
2417 case clang::Type::ObjCObjectPointer: return GetDeclContextForType (llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
2418 case clang::Type::Record: return llvm::cast<clang::RecordType>(qual_type)->getDecl();
2419 case clang::Type::Enum: return llvm::cast<clang::EnumType>(qual_type)->getDecl();
2420 case clang::Type::Typedef: return GetDeclContextForType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
2421 case clang::Type::Elaborated: return GetDeclContextForType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
2422 case clang::Type::Paren: return GetDeclContextForType (llvm::cast<clang::ParenType>(qual_type)->desugar());
Greg Clayton99558cc42015-08-24 23:46:31 +00002423 default:
2424 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00002425 }
2426 // No DeclContext in this type...
2427 return nullptr;
2428}
2429
2430static bool
2431GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true)
2432{
2433 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2434 switch (type_class)
2435 {
2436 case clang::Type::ConstantArray:
2437 case clang::Type::IncompleteArray:
2438 case clang::Type::VariableArray:
2439 {
2440 const clang::ArrayType *array_type = llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
2441
2442 if (array_type)
2443 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
2444 }
2445 break;
2446
2447 case clang::Type::Record:
2448 case clang::Type::Enum:
2449 {
2450 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
2451 if (tag_type)
2452 {
2453 clang::TagDecl *tag_decl = tag_type->getDecl();
2454 if (tag_decl)
2455 {
2456 if (tag_decl->isCompleteDefinition())
2457 return true;
2458
2459 if (!allow_completion)
2460 return false;
2461
2462 if (tag_decl->hasExternalLexicalStorage())
2463 {
2464 if (ast)
2465 {
2466 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2467 if (external_ast_source)
2468 {
2469 external_ast_source->CompleteType(tag_decl);
2470 return !tag_type->isIncompleteType();
2471 }
2472 }
2473 }
2474 return false;
2475 }
2476 }
2477
2478 }
2479 break;
2480
2481 case clang::Type::ObjCObject:
2482 case clang::Type::ObjCInterface:
2483 {
2484 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
2485 if (objc_class_type)
2486 {
2487 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2488 // We currently can't complete objective C types through the newly added ASTContext
2489 // because it only supports TagDecl objects right now...
2490 if (class_interface_decl)
2491 {
2492 if (class_interface_decl->getDefinition())
2493 return true;
2494
2495 if (!allow_completion)
2496 return false;
2497
2498 if (class_interface_decl->hasExternalLexicalStorage())
2499 {
2500 if (ast)
2501 {
2502 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2503 if (external_ast_source)
2504 {
2505 external_ast_source->CompleteType (class_interface_decl);
2506 return !objc_class_type->isIncompleteType();
2507 }
2508 }
2509 }
2510 return false;
2511 }
2512 }
2513 }
2514 break;
2515
2516 case clang::Type::Typedef:
2517 return GetCompleteQualType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
2518
2519 case clang::Type::Elaborated:
2520 return GetCompleteQualType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType(), allow_completion);
2521
2522 case clang::Type::Paren:
2523 return GetCompleteQualType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar(), allow_completion);
2524
2525 default:
2526 break;
2527 }
2528
2529 return true;
2530}
2531
2532static clang::ObjCIvarDecl::AccessControl
2533ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
2534{
2535 switch (access)
2536 {
2537 case eAccessNone: return clang::ObjCIvarDecl::None;
2538 case eAccessPublic: return clang::ObjCIvarDecl::Public;
2539 case eAccessPrivate: return clang::ObjCIvarDecl::Private;
2540 case eAccessProtected: return clang::ObjCIvarDecl::Protected;
2541 case eAccessPackage: return clang::ObjCIvarDecl::Package;
2542 }
2543 return clang::ObjCIvarDecl::None;
2544}
2545
2546
2547//----------------------------------------------------------------------
2548// Tests
2549//----------------------------------------------------------------------
2550
2551bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002552ClangASTContext::IsAggregateType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002553{
2554 clang::QualType qual_type (GetCanonicalQualType(type));
2555
2556 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2557 switch (type_class)
2558 {
2559 case clang::Type::IncompleteArray:
2560 case clang::Type::VariableArray:
2561 case clang::Type::ConstantArray:
2562 case clang::Type::ExtVector:
2563 case clang::Type::Vector:
2564 case clang::Type::Record:
2565 case clang::Type::ObjCObject:
2566 case clang::Type::ObjCInterface:
2567 return true;
2568 case clang::Type::Elaborated:
2569 return IsAggregateType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2570 case clang::Type::Typedef:
2571 return IsAggregateType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2572 case clang::Type::Paren:
2573 return IsAggregateType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2574 default:
2575 break;
2576 }
2577 // The clang type does have a value
2578 return false;
2579}
2580
2581bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002582ClangASTContext::IsArrayType (lldb::opaque_compiler_type_t type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002583 CompilerType *element_type_ptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00002584 uint64_t *size,
2585 bool *is_incomplete)
2586{
2587 clang::QualType qual_type (GetCanonicalQualType(type));
2588
2589 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2590 switch (type_class)
2591 {
2592 default:
2593 break;
2594
2595 case clang::Type::ConstantArray:
2596 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002597 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::ConstantArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002598 if (size)
2599 *size = llvm::cast<clang::ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
2600 return true;
2601
2602 case clang::Type::IncompleteArray:
2603 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002604 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::IncompleteArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002605 if (size)
2606 *size = 0;
2607 if (is_incomplete)
2608 *is_incomplete = true;
2609 return true;
2610
2611 case clang::Type::VariableArray:
2612 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002613 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::VariableArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002614 if (size)
2615 *size = 0;
2616 return true;
2617
2618 case clang::Type::DependentSizedArray:
2619 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002620 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::DependentSizedArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002621 if (size)
2622 *size = 0;
2623 return true;
2624
2625 case clang::Type::Typedef:
2626 return IsArrayType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2627 element_type_ptr,
2628 size,
2629 is_incomplete);
2630 case clang::Type::Elaborated:
2631 return IsArrayType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2632 element_type_ptr,
2633 size,
2634 is_incomplete);
2635 case clang::Type::Paren:
2636 return IsArrayType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
2637 element_type_ptr,
2638 size,
2639 is_incomplete);
2640 }
2641 if (element_type_ptr)
2642 element_type_ptr->Clear();
2643 if (size)
2644 *size = 0;
2645 if (is_incomplete)
2646 *is_incomplete = false;
Bruce Mitchener778e7ab2015-09-16 00:00:16 +00002647 return false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002648}
2649
2650bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002651ClangASTContext::IsVectorType (lldb::opaque_compiler_type_t type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002652 CompilerType *element_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00002653 uint64_t *size)
2654{
2655 clang::QualType qual_type (GetCanonicalQualType(type));
2656
2657 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2658 switch (type_class)
2659 {
2660 case clang::Type::Vector:
2661 {
2662 const clang::VectorType *vector_type = qual_type->getAs<clang::VectorType>();
2663 if (vector_type)
2664 {
2665 if (size)
2666 *size = vector_type->getNumElements();
2667 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002668 *element_type = CompilerType(getASTContext(), vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002669 }
2670 return true;
2671 }
2672 break;
2673 case clang::Type::ExtVector:
2674 {
2675 const clang::ExtVectorType *ext_vector_type = qual_type->getAs<clang::ExtVectorType>();
2676 if (ext_vector_type)
2677 {
2678 if (size)
2679 *size = ext_vector_type->getNumElements();
2680 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002681 *element_type = CompilerType(getASTContext(), ext_vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002682 }
2683 return true;
2684 }
2685 default:
2686 break;
2687 }
2688 return false;
2689}
2690
2691bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002692ClangASTContext::IsRuntimeGeneratedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002693{
2694 clang::DeclContext* decl_ctx = ClangASTContext::GetASTContext(getASTContext())->GetDeclContextForType(GetQualType(type));
2695 if (!decl_ctx)
2696 return false;
2697
2698 if (!llvm::isa<clang::ObjCInterfaceDecl>(decl_ctx))
2699 return false;
2700
2701 clang::ObjCInterfaceDecl *result_iface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
2702
2703 ClangASTMetadata* ast_metadata = ClangASTContext::GetMetadata(getASTContext(), result_iface_decl);
2704 if (!ast_metadata)
2705 return false;
2706 return (ast_metadata->GetISAPtr() != 0);
2707}
2708
2709bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002710ClangASTContext::IsCharType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002711{
2712 return GetQualType(type).getUnqualifiedType()->isCharType();
2713}
2714
2715
2716bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002717ClangASTContext::IsCompleteType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002718{
2719 const bool allow_completion = false;
2720 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
2721}
2722
2723bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002724ClangASTContext::IsConst(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002725{
2726 return GetQualType(type).isConstQualified();
2727}
2728
2729bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002730ClangASTContext::IsCStringType (lldb::opaque_compiler_type_t type, uint32_t &length)
Greg Claytond8d4a572015-08-11 21:38:15 +00002731{
Greg Claytona1e5dc82015-08-11 22:53:00 +00002732 CompilerType pointee_or_element_clang_type;
Greg Claytond8d4a572015-08-11 21:38:15 +00002733 length = 0;
2734 Flags type_flags (GetTypeInfo (type, &pointee_or_element_clang_type));
2735
2736 if (!pointee_or_element_clang_type.IsValid())
2737 return false;
2738
2739 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
2740 {
2741 if (pointee_or_element_clang_type.IsCharType())
2742 {
2743 if (type_flags.Test (eTypeIsArray))
2744 {
2745 // We know the size of the array and it could be a C string
2746 // since it is an array of characters
2747 length = llvm::cast<clang::ConstantArrayType>(GetCanonicalQualType(type).getTypePtr())->getSize().getLimitedValue();
2748 }
2749 return true;
2750
2751 }
2752 }
2753 return false;
2754}
2755
2756bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002757ClangASTContext::IsFunctionType (lldb::opaque_compiler_type_t type, bool *is_variadic_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00002758{
2759 if (type)
2760 {
2761 clang::QualType qual_type (GetCanonicalQualType(type));
2762
2763 if (qual_type->isFunctionType())
2764 {
2765 if (is_variadic_ptr)
2766 {
2767 const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2768 if (function_proto_type)
2769 *is_variadic_ptr = function_proto_type->isVariadic();
2770 else
2771 *is_variadic_ptr = false;
2772 }
2773 return true;
2774 }
2775
2776 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2777 switch (type_class)
2778 {
2779 default:
2780 break;
2781 case clang::Type::Typedef:
2782 return IsFunctionType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), nullptr);
2783 case clang::Type::Elaborated:
2784 return IsFunctionType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), nullptr);
2785 case clang::Type::Paren:
2786 return IsFunctionType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), nullptr);
2787 case clang::Type::LValueReference:
2788 case clang::Type::RValueReference:
2789 {
2790 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2791 if (reference_type)
2792 return IsFunctionType(reference_type->getPointeeType().getAsOpaquePtr(), nullptr);
2793 }
2794 break;
2795 }
2796 }
2797 return false;
2798}
2799
2800// Used to detect "Homogeneous Floating-point Aggregates"
2801uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002802ClangASTContext::IsHomogeneousAggregate (lldb::opaque_compiler_type_t type, CompilerType* base_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00002803{
2804 if (!type)
2805 return 0;
2806
2807 clang::QualType qual_type(GetCanonicalQualType(type));
2808 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2809 switch (type_class)
2810 {
2811 case clang::Type::Record:
2812 if (GetCompleteType (type))
2813 {
2814 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2815 if (cxx_record_decl)
2816 {
2817 if (cxx_record_decl->getNumBases() ||
2818 cxx_record_decl->isDynamicClass())
2819 return 0;
2820 }
2821 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
2822 if (record_type)
2823 {
2824 const clang::RecordDecl *record_decl = record_type->getDecl();
2825 if (record_decl)
2826 {
2827 // We are looking for a structure that contains only floating point types
2828 clang::RecordDecl::field_iterator field_pos, field_end = record_decl->field_end();
2829 uint32_t num_fields = 0;
2830 bool is_hva = false;
2831 bool is_hfa = false;
2832 clang::QualType base_qual_type;
2833 for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos)
2834 {
2835 clang::QualType field_qual_type = field_pos->getType();
2836 if (field_qual_type->isFloatingType())
2837 {
2838 if (field_qual_type->isComplexType())
2839 return 0;
2840 else
2841 {
2842 if (num_fields == 0)
2843 base_qual_type = field_qual_type;
2844 else
2845 {
2846 if (is_hva)
2847 return 0;
2848 is_hfa = true;
2849 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
2850 return 0;
2851 }
2852 }
2853 }
2854 else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType())
2855 {
2856 const clang::VectorType *array = field_qual_type.getTypePtr()->getAs<clang::VectorType>();
2857 if (array && array->getNumElements() <= 4)
2858 {
2859 if (num_fields == 0)
2860 base_qual_type = array->getElementType();
2861 else
2862 {
2863 if (is_hfa)
2864 return 0;
2865 is_hva = true;
2866 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
2867 return 0;
2868 }
2869 }
2870 else
2871 return 0;
2872 }
2873 else
2874 return 0;
2875 ++num_fields;
2876 }
2877 if (base_type_ptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002878 *base_type_ptr = CompilerType (getASTContext(), base_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00002879 return num_fields;
2880 }
2881 }
2882 }
2883 break;
2884
2885 case clang::Type::Typedef:
2886 return IsHomogeneousAggregate(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), base_type_ptr);
2887
2888 case clang::Type::Elaborated:
2889 return IsHomogeneousAggregate(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), base_type_ptr);
2890 default:
2891 break;
2892 }
2893 return 0;
2894}
2895
2896size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002897ClangASTContext::GetNumberOfFunctionArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002898{
2899 if (type)
2900 {
2901 clang::QualType qual_type (GetCanonicalQualType(type));
2902 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2903 if (func)
2904 return func->getNumParams();
2905 }
2906 return 0;
2907}
2908
Greg Claytona1e5dc82015-08-11 22:53:00 +00002909CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002910ClangASTContext::GetFunctionArgumentAtIndex (lldb::opaque_compiler_type_t type, const size_t index)
Greg Claytond8d4a572015-08-11 21:38:15 +00002911{
2912 if (type)
2913 {
2914 clang::QualType qual_type (GetCanonicalQualType(type));
2915 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
2916 if (func)
2917 {
2918 if (index < func->getNumParams())
Greg Claytona1e5dc82015-08-11 22:53:00 +00002919 return CompilerType(getASTContext(), func->getParamType(index));
Greg Claytond8d4a572015-08-11 21:38:15 +00002920 }
2921 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002922 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00002923}
2924
2925bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002926ClangASTContext::IsFunctionPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002927{
2928 if (type)
2929 {
2930 clang::QualType qual_type (GetCanonicalQualType(type));
2931
2932 if (qual_type->isFunctionPointerType())
2933 return true;
2934
2935 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2936 switch (type_class)
2937 {
2938 default:
2939 break;
2940 case clang::Type::Typedef:
2941 return IsFunctionPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2942 case clang::Type::Elaborated:
2943 return IsFunctionPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2944 case clang::Type::Paren:
2945 return IsFunctionPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2946
2947 case clang::Type::LValueReference:
2948 case clang::Type::RValueReference:
2949 {
2950 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
2951 if (reference_type)
2952 return IsFunctionPointerType(reference_type->getPointeeType().getAsOpaquePtr());
2953 }
2954 break;
2955 }
2956 }
2957 return false;
2958
2959}
2960
2961bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002962ClangASTContext::IsIntegerType (lldb::opaque_compiler_type_t type, bool &is_signed)
Greg Claytond8d4a572015-08-11 21:38:15 +00002963{
2964 if (!type)
2965 return false;
2966
2967 clang::QualType qual_type (GetCanonicalQualType(type));
2968 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
2969
2970 if (builtin_type)
2971 {
2972 if (builtin_type->isInteger())
2973 {
2974 is_signed = builtin_type->isSignedInteger();
2975 return true;
2976 }
2977 }
2978
2979 return false;
2980}
2981
2982bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002983ClangASTContext::IsPointerType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002984{
2985 if (type)
2986 {
2987 clang::QualType qual_type (GetCanonicalQualType(type));
2988 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2989 switch (type_class)
2990 {
2991 case clang::Type::Builtin:
2992 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
2993 {
2994 default:
2995 break;
2996 case clang::BuiltinType::ObjCId:
2997 case clang::BuiltinType::ObjCClass:
2998 return true;
2999 }
3000 return false;
3001 case clang::Type::ObjCObjectPointer:
3002 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003003 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003004 return true;
3005 case clang::Type::BlockPointer:
3006 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003007 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003008 return true;
3009 case clang::Type::Pointer:
3010 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003011 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003012 return true;
3013 case clang::Type::MemberPointer:
3014 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003015 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003016 return true;
3017 case clang::Type::Typedef:
3018 return IsPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
3019 case clang::Type::Elaborated:
3020 return IsPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3021 case clang::Type::Paren:
3022 return IsPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3023 default:
3024 break;
3025 }
3026 }
3027 if (pointee_type)
3028 pointee_type->Clear();
3029 return false;
3030}
3031
3032
3033bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003034ClangASTContext::IsPointerOrReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003035{
3036 if (type)
3037 {
3038 clang::QualType qual_type (GetCanonicalQualType(type));
3039 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3040 switch (type_class)
3041 {
3042 case clang::Type::Builtin:
3043 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3044 {
3045 default:
3046 break;
3047 case clang::BuiltinType::ObjCId:
3048 case clang::BuiltinType::ObjCClass:
3049 return true;
3050 }
3051 return false;
3052 case clang::Type::ObjCObjectPointer:
3053 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003054 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003055 return true;
3056 case clang::Type::BlockPointer:
3057 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003058 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003059 return true;
3060 case clang::Type::Pointer:
3061 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003062 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003063 return true;
3064 case clang::Type::MemberPointer:
3065 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003066 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003067 return true;
3068 case clang::Type::LValueReference:
3069 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003070 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003071 return true;
3072 case clang::Type::RValueReference:
3073 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003074 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003075 return true;
3076 case clang::Type::Typedef:
3077 return IsPointerOrReferenceType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
3078 case clang::Type::Elaborated:
3079 return IsPointerOrReferenceType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3080 case clang::Type::Paren:
3081 return IsPointerOrReferenceType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3082 default:
3083 break;
3084 }
3085 }
3086 if (pointee_type)
3087 pointee_type->Clear();
3088 return false;
3089}
3090
3091
3092bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003093ClangASTContext::IsReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool* is_rvalue)
Greg Claytond8d4a572015-08-11 21:38:15 +00003094{
3095 if (type)
3096 {
3097 clang::QualType qual_type (GetCanonicalQualType(type));
3098 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3099
3100 switch (type_class)
3101 {
3102 case clang::Type::LValueReference:
3103 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003104 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003105 if (is_rvalue)
3106 *is_rvalue = false;
3107 return true;
3108 case clang::Type::RValueReference:
3109 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003110 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003111 if (is_rvalue)
3112 *is_rvalue = true;
3113 return true;
3114 case clang::Type::Typedef:
3115 return IsReferenceType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type, is_rvalue);
3116 case clang::Type::Elaborated:
3117 return IsReferenceType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type, is_rvalue);
3118 case clang::Type::Paren:
3119 return IsReferenceType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type, is_rvalue);
3120
3121 default:
3122 break;
3123 }
3124 }
3125 if (pointee_type)
3126 pointee_type->Clear();
3127 return false;
3128}
3129
3130bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003131ClangASTContext::IsFloatingPointType (lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex)
Greg Claytond8d4a572015-08-11 21:38:15 +00003132{
3133 if (type)
3134 {
3135 clang::QualType qual_type (GetCanonicalQualType(type));
3136
3137 if (const clang::BuiltinType *BT = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal()))
3138 {
3139 clang::BuiltinType::Kind kind = BT->getKind();
3140 if (kind >= clang::BuiltinType::Float && kind <= clang::BuiltinType::LongDouble)
3141 {
3142 count = 1;
3143 is_complex = false;
3144 return true;
3145 }
3146 }
3147 else if (const clang::ComplexType *CT = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal()))
3148 {
3149 if (IsFloatingPointType (CT->getElementType().getAsOpaquePtr(), count, is_complex))
3150 {
3151 count = 2;
3152 is_complex = true;
3153 return true;
3154 }
3155 }
3156 else if (const clang::VectorType *VT = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal()))
3157 {
3158 if (IsFloatingPointType (VT->getElementType().getAsOpaquePtr(), count, is_complex))
3159 {
3160 count = VT->getNumElements();
3161 is_complex = false;
3162 return true;
3163 }
3164 }
3165 }
3166 count = 0;
3167 is_complex = false;
3168 return false;
3169}
3170
3171
3172bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003173ClangASTContext::IsDefined(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003174{
3175 if (!type)
3176 return false;
3177
3178 clang::QualType qual_type(GetQualType(type));
3179 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
3180 if (tag_type)
3181 {
3182 clang::TagDecl *tag_decl = tag_type->getDecl();
3183 if (tag_decl)
3184 return tag_decl->isCompleteDefinition();
3185 return false;
3186 }
3187 else
3188 {
3189 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3190 if (objc_class_type)
3191 {
3192 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3193 if (class_interface_decl)
3194 return class_interface_decl->getDefinition() != nullptr;
3195 return false;
3196 }
3197 }
3198 return true;
3199}
3200
3201bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003202ClangASTContext::IsObjCClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003203{
3204 if (type)
3205 {
3206 clang::QualType qual_type (GetCanonicalQualType(type));
3207
3208 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3209
3210 if (obj_pointer_type)
3211 return obj_pointer_type->isObjCClassType();
3212 }
3213 return false;
3214}
3215
3216bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003217ClangASTContext::IsObjCObjectOrInterfaceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003218{
Ryan Brown57bee1e2015-09-14 22:45:11 +00003219 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00003220 return GetCanonicalQualType(type)->isObjCObjectOrInterfaceType();
3221 return false;
3222}
3223
3224bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003225ClangASTContext::IsPolymorphicClass (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003226{
3227 if (type)
3228 {
3229 clang::QualType qual_type(GetCanonicalQualType(type));
3230 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3231 switch (type_class)
3232 {
3233 case clang::Type::Record:
3234 if (GetCompleteType(type))
3235 {
3236 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3237 const clang::RecordDecl *record_decl = record_type->getDecl();
3238 if (record_decl)
3239 {
3240 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3241 if (cxx_record_decl)
3242 return cxx_record_decl->isPolymorphic();
3243 }
3244 }
3245 break;
3246
3247 default:
3248 break;
3249 }
3250 }
3251 return false;
3252}
3253
3254bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003255ClangASTContext::IsPossibleDynamicType (lldb::opaque_compiler_type_t type, CompilerType *dynamic_pointee_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00003256 bool check_cplusplus,
3257 bool check_objc)
3258{
3259 clang::QualType pointee_qual_type;
3260 if (type)
3261 {
3262 clang::QualType qual_type (GetCanonicalQualType(type));
3263 bool success = false;
3264 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3265 switch (type_class)
3266 {
3267 case clang::Type::Builtin:
3268 if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
3269 {
3270 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003271 dynamic_pointee_type->SetCompilerType(this, type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003272 return true;
3273 }
3274 break;
3275
3276 case clang::Type::ObjCObjectPointer:
3277 if (check_objc)
3278 {
3279 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003280 dynamic_pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003281 return true;
3282 }
3283 break;
3284
3285 case clang::Type::Pointer:
3286 pointee_qual_type = llvm::cast<clang::PointerType>(qual_type)->getPointeeType();
3287 success = true;
3288 break;
3289
3290 case clang::Type::LValueReference:
3291 case clang::Type::RValueReference:
3292 pointee_qual_type = llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType();
3293 success = true;
3294 break;
3295
3296 case clang::Type::Typedef:
3297 return IsPossibleDynamicType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3298 dynamic_pointee_type,
3299 check_cplusplus,
3300 check_objc);
3301
3302 case clang::Type::Elaborated:
3303 return IsPossibleDynamicType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3304 dynamic_pointee_type,
3305 check_cplusplus,
3306 check_objc);
3307
3308 case clang::Type::Paren:
3309 return IsPossibleDynamicType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
3310 dynamic_pointee_type,
3311 check_cplusplus,
3312 check_objc);
3313 default:
3314 break;
3315 }
3316
3317 if (success)
3318 {
3319 // Check to make sure what we are pointing too is a possible dynamic C++ type
3320 // We currently accept any "void *" (in case we have a class that has been
3321 // watered down to an opaque pointer) and virtual C++ classes.
3322 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
3323 switch (pointee_type_class)
3324 {
3325 case clang::Type::Builtin:
3326 switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind())
3327 {
3328 case clang::BuiltinType::UnknownAny:
3329 case clang::BuiltinType::Void:
3330 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003331 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003332 return true;
Zachary Turnerdd07e002015-09-16 18:08:45 +00003333 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00003334 break;
3335 }
3336 break;
3337
3338 case clang::Type::Record:
3339 if (check_cplusplus)
3340 {
3341 clang::CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
3342 if (cxx_record_decl)
3343 {
3344 bool is_complete = cxx_record_decl->isCompleteDefinition();
3345
3346 if (is_complete)
3347 success = cxx_record_decl->isDynamicClass();
3348 else
3349 {
3350 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), cxx_record_decl);
3351 if (metadata)
3352 success = metadata->GetIsDynamicCXXType();
3353 else
3354 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00003355 is_complete = CompilerType(getASTContext(), pointee_qual_type).GetCompleteType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003356 if (is_complete)
3357 success = cxx_record_decl->isDynamicClass();
3358 else
3359 success = false;
3360 }
3361 }
3362
3363 if (success)
3364 {
3365 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003366 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003367 return true;
3368 }
3369 }
3370 }
3371 break;
3372
3373 case clang::Type::ObjCObject:
3374 case clang::Type::ObjCInterface:
3375 if (check_objc)
3376 {
3377 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003378 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003379 return true;
3380 }
3381 break;
3382
3383 default:
3384 break;
3385 }
3386 }
3387 }
3388 if (dynamic_pointee_type)
3389 dynamic_pointee_type->Clear();
3390 return false;
3391}
3392
3393
3394bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003395ClangASTContext::IsScalarType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003396{
3397 if (!type)
3398 return false;
3399
3400 return (GetTypeInfo (type, nullptr) & eTypeIsScalar) != 0;
3401}
3402
3403bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003404ClangASTContext::IsTypedefType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003405{
3406 if (!type)
3407 return false;
3408 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
3409}
3410
3411bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003412ClangASTContext::IsVoidType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003413{
3414 if (!type)
3415 return false;
3416 return GetCanonicalQualType(type)->isVoidType();
3417}
3418
3419bool
Greg Clayton56939cb2015-09-17 22:23:34 +00003420ClangASTContext::SupportsLanguage (lldb::LanguageType language)
3421{
3422 return ClangASTContextSupportsLanguage(language);
3423}
3424
3425bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003426ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003427{
3428 if (type)
3429 {
3430 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003431 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00003432 {
Ryan Brown57bee1e2015-09-14 22:45:11 +00003433 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3434 if (cxx_record_decl)
3435 {
3436 class_name.assign(cxx_record_decl->getIdentifier()->getNameStart());
3437 return true;
3438 }
Greg Claytond8d4a572015-08-11 21:38:15 +00003439 }
3440 }
3441 class_name.clear();
3442 return false;
3443}
3444
3445
3446bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003447ClangASTContext::IsCXXClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003448{
3449 if (!type)
3450 return false;
3451
3452 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003453 if (!qual_type.isNull() && qual_type->getAsCXXRecordDecl() != nullptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003454 return true;
3455 return false;
3456}
3457
3458bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003459ClangASTContext::IsBeingDefined (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003460{
3461 if (!type)
3462 return false;
3463 clang::QualType qual_type (GetCanonicalQualType(type));
3464 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
3465 if (tag_type)
3466 return tag_type->isBeingDefined();
3467 return false;
3468}
3469
3470bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003471ClangASTContext::IsObjCObjectPointerType (const CompilerType& type, CompilerType *class_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003472{
3473 if (!type)
3474 return false;
3475
3476 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003477
3478 if (!qual_type.isNull() && qual_type->isObjCObjectPointerType())
Greg Claytond8d4a572015-08-11 21:38:15 +00003479 {
3480 if (class_type_ptr)
3481 {
3482 if (!qual_type->isObjCClassType() &&
3483 !qual_type->isObjCIdType())
3484 {
3485 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3486 if (obj_pointer_type == nullptr)
3487 class_type_ptr->Clear();
3488 else
Greg Clayton99558cc42015-08-24 23:46:31 +00003489 class_type_ptr->SetCompilerType (type.GetTypeSystem(), clang::QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003490 }
3491 }
3492 return true;
3493 }
3494 if (class_type_ptr)
3495 class_type_ptr->Clear();
3496 return false;
3497}
3498
3499bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003500ClangASTContext::GetObjCClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003501{
3502 if (!type)
3503 return false;
3504
3505 clang::QualType qual_type (GetCanonicalQualType(type));
3506
3507 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3508 if (object_type)
3509 {
3510 const clang::ObjCInterfaceDecl *interface = object_type->getInterface();
3511 if (interface)
3512 {
3513 class_name = interface->getNameAsString();
3514 return true;
3515 }
3516 }
3517 return false;
3518}
3519
3520
3521//----------------------------------------------------------------------
3522// Type Completion
3523//----------------------------------------------------------------------
3524
3525bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003526ClangASTContext::GetCompleteType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003527{
3528 if (!type)
3529 return false;
3530 const bool allow_completion = true;
3531 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
3532}
3533
3534ConstString
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003535ClangASTContext::GetTypeName (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003536{
3537 std::string type_name;
3538 if (type)
3539 {
3540 clang::PrintingPolicy printing_policy (getASTContext()->getPrintingPolicy());
3541 clang::QualType qual_type(GetQualType(type));
3542 printing_policy.SuppressTagKeyword = true;
3543 printing_policy.LangOpts.WChar = true;
3544 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
3545 if (typedef_type)
3546 {
3547 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
3548 type_name = typedef_decl->getQualifiedNameAsString();
3549 }
3550 else
3551 {
3552 type_name = qual_type.getAsString(printing_policy);
3553 }
3554 }
3555 return ConstString(type_name);
3556}
3557
3558uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003559ClangASTContext::GetTypeInfo (lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003560{
3561 if (!type)
3562 return 0;
3563
3564 if (pointee_or_element_clang_type)
3565 pointee_or_element_clang_type->Clear();
3566
3567 clang::QualType qual_type (GetQualType(type));
3568
3569 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3570 switch (type_class)
3571 {
3572 case clang::Type::Builtin:
3573 {
3574 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3575
3576 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
3577 switch (builtin_type->getKind())
3578 {
3579 case clang::BuiltinType::ObjCId:
3580 case clang::BuiltinType::ObjCClass:
3581 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003582 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003583 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3584 break;
3585
3586 case clang::BuiltinType::ObjCSel:
3587 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003588 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->CharTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003589 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3590 break;
3591
3592 case clang::BuiltinType::Bool:
3593 case clang::BuiltinType::Char_U:
3594 case clang::BuiltinType::UChar:
3595 case clang::BuiltinType::WChar_U:
3596 case clang::BuiltinType::Char16:
3597 case clang::BuiltinType::Char32:
3598 case clang::BuiltinType::UShort:
3599 case clang::BuiltinType::UInt:
3600 case clang::BuiltinType::ULong:
3601 case clang::BuiltinType::ULongLong:
3602 case clang::BuiltinType::UInt128:
3603 case clang::BuiltinType::Char_S:
3604 case clang::BuiltinType::SChar:
3605 case clang::BuiltinType::WChar_S:
3606 case clang::BuiltinType::Short:
3607 case clang::BuiltinType::Int:
3608 case clang::BuiltinType::Long:
3609 case clang::BuiltinType::LongLong:
3610 case clang::BuiltinType::Int128:
3611 case clang::BuiltinType::Float:
3612 case clang::BuiltinType::Double:
3613 case clang::BuiltinType::LongDouble:
3614 builtin_type_flags |= eTypeIsScalar;
3615 if (builtin_type->isInteger())
3616 {
3617 builtin_type_flags |= eTypeIsInteger;
3618 if (builtin_type->isSignedInteger())
3619 builtin_type_flags |= eTypeIsSigned;
3620 }
3621 else if (builtin_type->isFloatingPoint())
3622 builtin_type_flags |= eTypeIsFloat;
3623 break;
3624 default:
3625 break;
3626 }
3627 return builtin_type_flags;
3628 }
3629
3630 case clang::Type::BlockPointer:
3631 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003632 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003633 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3634
3635 case clang::Type::Complex:
3636 {
3637 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3638 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal());
3639 if (complex_type)
3640 {
3641 clang::QualType complex_element_type (complex_type->getElementType());
3642 if (complex_element_type->isIntegerType())
3643 complex_type_flags |= eTypeIsFloat;
3644 else if (complex_element_type->isFloatingType())
3645 complex_type_flags |= eTypeIsInteger;
3646 }
3647 return complex_type_flags;
3648 }
3649 break;
3650
3651 case clang::Type::ConstantArray:
3652 case clang::Type::DependentSizedArray:
3653 case clang::Type::IncompleteArray:
3654 case clang::Type::VariableArray:
3655 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003656 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ArrayType>(qual_type.getTypePtr())->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003657 return eTypeHasChildren | eTypeIsArray;
3658
3659 case clang::Type::DependentName: return 0;
3660 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
3661 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
3662 case clang::Type::Decltype: return 0;
3663
3664 case clang::Type::Enum:
3665 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003666 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::EnumType>(qual_type)->getDecl()->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003667 return eTypeIsEnumeration | eTypeHasValue;
3668
3669 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003670 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003671 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003672 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003673
3674 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
3675 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
3676 case clang::Type::InjectedClassName: return 0;
3677
3678 case clang::Type::LValueReference:
3679 case clang::Type::RValueReference:
3680 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003681 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003682 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3683
3684 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
3685
3686 case clang::Type::ObjCObjectPointer:
3687 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003688 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003689 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
3690
3691 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3692 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3693
3694 case clang::Type::Pointer:
3695 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003696 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003697 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3698
3699 case clang::Type::Record:
3700 if (qual_type->getAsCXXRecordDecl())
3701 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3702 else
3703 return eTypeHasChildren | eTypeIsStructUnion;
3704 break;
3705 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
3706 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
3707 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
3708
3709 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003710 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 +00003711 case clang::Type::TypeOfExpr: return 0;
3712 case clang::Type::TypeOf: return 0;
3713 case clang::Type::UnresolvedUsing: return 0;
3714
3715 case clang::Type::ExtVector:
3716 case clang::Type::Vector:
3717 {
3718 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
3719 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal());
3720 if (vector_type)
3721 {
3722 if (vector_type->isIntegerType())
3723 vector_type_flags |= eTypeIsFloat;
3724 else if (vector_type->isFloatingType())
3725 vector_type_flags |= eTypeIsInteger;
3726 }
3727 return vector_type_flags;
3728 }
3729 default: return 0;
3730 }
3731 return 0;
3732}
3733
3734
3735
3736lldb::LanguageType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003737ClangASTContext::GetMinimumLanguage (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003738{
3739 if (!type)
3740 return lldb::eLanguageTypeC;
3741
3742 // If the type is a reference, then resolve it to what it refers to first:
3743 clang::QualType qual_type (GetCanonicalQualType(type).getNonReferenceType());
3744 if (qual_type->isAnyPointerType())
3745 {
3746 if (qual_type->isObjCObjectPointerType())
3747 return lldb::eLanguageTypeObjC;
3748
3749 clang::QualType pointee_type (qual_type->getPointeeType());
3750 if (pointee_type->getPointeeCXXRecordDecl() != nullptr)
3751 return lldb::eLanguageTypeC_plus_plus;
3752 if (pointee_type->isObjCObjectOrInterfaceType())
3753 return lldb::eLanguageTypeObjC;
3754 if (pointee_type->isObjCClassType())
3755 return lldb::eLanguageTypeObjC;
3756 if (pointee_type.getTypePtr() == getASTContext()->ObjCBuiltinIdTy.getTypePtr())
3757 return lldb::eLanguageTypeObjC;
3758 }
3759 else
3760 {
3761 if (qual_type->isObjCObjectOrInterfaceType())
3762 return lldb::eLanguageTypeObjC;
3763 if (qual_type->getAsCXXRecordDecl())
3764 return lldb::eLanguageTypeC_plus_plus;
3765 switch (qual_type->getTypeClass())
3766 {
3767 default:
3768 break;
3769 case clang::Type::Builtin:
3770 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3771 {
3772 default:
3773 case clang::BuiltinType::Void:
3774 case clang::BuiltinType::Bool:
3775 case clang::BuiltinType::Char_U:
3776 case clang::BuiltinType::UChar:
3777 case clang::BuiltinType::WChar_U:
3778 case clang::BuiltinType::Char16:
3779 case clang::BuiltinType::Char32:
3780 case clang::BuiltinType::UShort:
3781 case clang::BuiltinType::UInt:
3782 case clang::BuiltinType::ULong:
3783 case clang::BuiltinType::ULongLong:
3784 case clang::BuiltinType::UInt128:
3785 case clang::BuiltinType::Char_S:
3786 case clang::BuiltinType::SChar:
3787 case clang::BuiltinType::WChar_S:
3788 case clang::BuiltinType::Short:
3789 case clang::BuiltinType::Int:
3790 case clang::BuiltinType::Long:
3791 case clang::BuiltinType::LongLong:
3792 case clang::BuiltinType::Int128:
3793 case clang::BuiltinType::Float:
3794 case clang::BuiltinType::Double:
3795 case clang::BuiltinType::LongDouble:
3796 break;
3797
3798 case clang::BuiltinType::NullPtr:
3799 return eLanguageTypeC_plus_plus;
3800
3801 case clang::BuiltinType::ObjCId:
3802 case clang::BuiltinType::ObjCClass:
3803 case clang::BuiltinType::ObjCSel:
3804 return eLanguageTypeObjC;
3805
3806 case clang::BuiltinType::Dependent:
3807 case clang::BuiltinType::Overload:
3808 case clang::BuiltinType::BoundMember:
3809 case clang::BuiltinType::UnknownAny:
3810 break;
3811 }
3812 break;
3813 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003814 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
Greg Claytond8d4a572015-08-11 21:38:15 +00003815 }
3816 }
3817 return lldb::eLanguageTypeC;
3818}
3819
3820lldb::TypeClass
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003821ClangASTContext::GetTypeClass (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003822{
3823 if (!type)
3824 return lldb::eTypeClassInvalid;
3825
3826 clang::QualType qual_type(GetQualType(type));
3827
3828 switch (qual_type->getTypeClass())
3829 {
3830 case clang::Type::UnaryTransform: break;
3831 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
3832 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
3833 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
3834 case clang::Type::VariableArray: return lldb::eTypeClassArray;
3835 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
3836 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
3837 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
3838 case clang::Type::ExtVector: return lldb::eTypeClassVector;
3839 case clang::Type::Vector: return lldb::eTypeClassVector;
3840 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
3841 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
3842 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
3843 case clang::Type::Pointer: return lldb::eTypeClassPointer;
3844 case clang::Type::LValueReference: return lldb::eTypeClassReference;
3845 case clang::Type::RValueReference: return lldb::eTypeClassReference;
3846 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
3847 case clang::Type::Complex:
3848 if (qual_type->isComplexType())
3849 return lldb::eTypeClassComplexFloat;
3850 else
3851 return lldb::eTypeClassComplexInteger;
3852 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
3853 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
3854 case clang::Type::Record:
3855 {
3856 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3857 const clang::RecordDecl *record_decl = record_type->getDecl();
3858 if (record_decl->isUnion())
3859 return lldb::eTypeClassUnion;
3860 else if (record_decl->isStruct())
3861 return lldb::eTypeClassStruct;
3862 else
3863 return lldb::eTypeClassClass;
3864 }
3865 break;
3866 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
3867 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
3868 case clang::Type::UnresolvedUsing: break;
3869 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003870 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003871 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003872 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00003873
3874 case clang::Type::Attributed: break;
3875 case clang::Type::TemplateTypeParm: break;
3876 case clang::Type::SubstTemplateTypeParm: break;
3877 case clang::Type::SubstTemplateTypeParmPack:break;
3878 case clang::Type::Auto: break;
3879 case clang::Type::InjectedClassName: break;
3880 case clang::Type::DependentName: break;
3881 case clang::Type::DependentTemplateSpecialization: break;
3882 case clang::Type::PackExpansion: break;
3883
3884 case clang::Type::TypeOfExpr: break;
3885 case clang::Type::TypeOf: break;
3886 case clang::Type::Decltype: break;
3887 case clang::Type::TemplateSpecialization: break;
3888 case clang::Type::Atomic: break;
3889
3890 // pointer type decayed from an array or function type.
3891 case clang::Type::Decayed: break;
3892 case clang::Type::Adjusted: break;
3893 }
3894 // We don't know hot to display this type...
3895 return lldb::eTypeClassOther;
3896
3897}
3898
3899unsigned
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003900ClangASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003901{
3902 if (type)
3903 return GetQualType(type).getQualifiers().getCVRQualifiers();
3904 return 0;
3905}
3906
3907//----------------------------------------------------------------------
3908// Creating related types
3909//----------------------------------------------------------------------
3910
Greg Claytona1e5dc82015-08-11 22:53:00 +00003911CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003912ClangASTContext::GetArrayElementType (lldb::opaque_compiler_type_t type, uint64_t *stride)
Greg Claytond8d4a572015-08-11 21:38:15 +00003913{
3914 if (type)
3915 {
3916 clang::QualType qual_type(GetCanonicalQualType(type));
3917
3918 const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
3919
3920 if (!array_eletype)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003921 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003922
Greg Claytona1e5dc82015-08-11 22:53:00 +00003923 CompilerType element_type (getASTContext(), array_eletype->getCanonicalTypeUnqualified());
Greg Claytond8d4a572015-08-11 21:38:15 +00003924
3925 // TODO: the real stride will be >= this value.. find the real one!
3926 if (stride)
3927 *stride = element_type.GetByteSize(nullptr);
3928
3929 return element_type;
3930
3931 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003932 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003933}
3934
Greg Claytona1e5dc82015-08-11 22:53:00 +00003935CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003936ClangASTContext::GetCanonicalType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003937{
3938 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003939 return CompilerType (getASTContext(), GetCanonicalQualType(type));
3940 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003941}
3942
3943static clang::QualType
3944GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
3945{
3946 if (qual_type->isPointerType())
3947 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
3948 else
3949 qual_type = qual_type.getUnqualifiedType();
3950 qual_type.removeLocalConst();
3951 qual_type.removeLocalRestrict();
3952 qual_type.removeLocalVolatile();
3953 return qual_type;
3954}
3955
Greg Claytona1e5dc82015-08-11 22:53:00 +00003956CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003957ClangASTContext::GetFullyUnqualifiedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003958{
3959 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003960 return CompilerType(getASTContext(), GetFullyUnqualifiedType_Impl(getASTContext(), GetQualType(type)));
3961 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003962}
3963
3964
3965int
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003966ClangASTContext::GetFunctionArgumentCount (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003967{
3968 if (type)
3969 {
3970 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3971 if (func)
3972 return func->getNumParams();
3973 }
3974 return -1;
3975}
3976
Greg Claytona1e5dc82015-08-11 22:53:00 +00003977CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003978ClangASTContext::GetFunctionArgumentTypeAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00003979{
3980 if (type)
3981 {
3982 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
3983 if (func)
3984 {
3985 const uint32_t num_args = func->getNumParams();
3986 if (idx < num_args)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003987 return CompilerType(getASTContext(), func->getParamType(idx));
Greg Claytond8d4a572015-08-11 21:38:15 +00003988 }
3989 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003990 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003991}
3992
Greg Claytona1e5dc82015-08-11 22:53:00 +00003993CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003994ClangASTContext::GetFunctionReturnType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003995{
3996 if (type)
3997 {
3998 clang::QualType qual_type(GetCanonicalQualType(type));
3999 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
4000 if (func)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004001 return CompilerType(getASTContext(), func->getReturnType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004002 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004003 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004004}
4005
4006size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004007ClangASTContext::GetNumMemberFunctions (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004008{
4009 size_t num_functions = 0;
4010 if (type)
4011 {
4012 clang::QualType qual_type(GetCanonicalQualType(type));
4013 switch (qual_type->getTypeClass()) {
4014 case clang::Type::Record:
4015 if (GetCompleteQualType (getASTContext(), qual_type))
4016 {
4017 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4018 const clang::RecordDecl *record_decl = record_type->getDecl();
4019 assert(record_decl);
4020 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4021 if (cxx_record_decl)
4022 num_functions = std::distance(cxx_record_decl->method_begin(), cxx_record_decl->method_end());
4023 }
4024 break;
4025
4026 case clang::Type::ObjCObjectPointer:
4027 if (GetCompleteType(type))
4028 {
4029 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4030 if (objc_class_type)
4031 {
4032 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4033 if (class_interface_decl)
4034 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4035 }
4036 }
4037 break;
4038
4039 case clang::Type::ObjCObject:
4040 case clang::Type::ObjCInterface:
4041 if (GetCompleteType(type))
4042 {
4043 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4044 if (objc_class_type)
4045 {
4046 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4047 if (class_interface_decl)
4048 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4049 }
4050 }
4051 break;
4052
4053
4054 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004055 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004056
4057 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004058 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004059
4060 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004061 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004062
4063 default:
4064 break;
4065 }
4066 }
4067 return num_functions;
4068}
4069
4070TypeMemberFunctionImpl
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004071ClangASTContext::GetMemberFunctionAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004072{
4073 std::string name("");
4074 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
Greg Claytona1e5dc82015-08-11 22:53:00 +00004075 CompilerType clang_type{};
Greg Claytond8d4a572015-08-11 21:38:15 +00004076 clang::ObjCMethodDecl *method_decl(nullptr);
4077 if (type)
4078 {
4079 clang::QualType qual_type(GetCanonicalQualType(type));
4080 switch (qual_type->getTypeClass()) {
4081 case clang::Type::Record:
4082 if (GetCompleteQualType (getASTContext(), qual_type))
4083 {
4084 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4085 const clang::RecordDecl *record_decl = record_type->getDecl();
4086 assert(record_decl);
4087 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4088 if (cxx_record_decl)
4089 {
4090 auto method_iter = cxx_record_decl->method_begin();
4091 auto method_end = cxx_record_decl->method_end();
4092 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4093 {
4094 std::advance(method_iter, idx);
4095 auto method_decl = method_iter->getCanonicalDecl();
4096 if (method_decl)
4097 {
4098 if (!method_decl->getName().empty())
4099 name.assign(method_decl->getName().data());
4100 else
4101 name.clear();
4102 if (method_decl->isStatic())
4103 kind = lldb::eMemberFunctionKindStaticMethod;
4104 else if (llvm::isa<clang::CXXConstructorDecl>(method_decl))
4105 kind = lldb::eMemberFunctionKindConstructor;
4106 else if (llvm::isa<clang::CXXDestructorDecl>(method_decl))
4107 kind = lldb::eMemberFunctionKindDestructor;
4108 else
4109 kind = lldb::eMemberFunctionKindInstanceMethod;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004110 clang_type = CompilerType(getASTContext(),method_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004111 }
4112 }
4113 }
4114 }
4115 break;
4116
4117 case clang::Type::ObjCObjectPointer:
4118 if (GetCompleteType(type))
4119 {
4120 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4121 if (objc_class_type)
4122 {
4123 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4124 if (class_interface_decl)
4125 {
4126 auto method_iter = class_interface_decl->meth_begin();
4127 auto method_end = class_interface_decl->meth_end();
4128 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4129 {
4130 std::advance(method_iter, idx);
4131 method_decl = method_iter->getCanonicalDecl();
4132 if (method_decl)
4133 {
4134 name = method_decl->getSelector().getAsString();
4135 if (method_decl->isClassMethod())
4136 kind = lldb::eMemberFunctionKindStaticMethod;
4137 else
4138 kind = lldb::eMemberFunctionKindInstanceMethod;
4139 }
4140 }
4141 }
4142 }
4143 }
4144 break;
4145
4146 case clang::Type::ObjCObject:
4147 case clang::Type::ObjCInterface:
4148 if (GetCompleteType(type))
4149 {
4150 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4151 if (objc_class_type)
4152 {
4153 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4154 if (class_interface_decl)
4155 {
4156 auto method_iter = class_interface_decl->meth_begin();
4157 auto method_end = class_interface_decl->meth_end();
4158 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4159 {
4160 std::advance(method_iter, idx);
4161 method_decl = method_iter->getCanonicalDecl();
4162 if (method_decl)
4163 {
4164 name = method_decl->getSelector().getAsString();
4165 if (method_decl->isClassMethod())
4166 kind = lldb::eMemberFunctionKindStaticMethod;
4167 else
4168 kind = lldb::eMemberFunctionKindInstanceMethod;
4169 }
4170 }
4171 }
4172 }
4173 }
4174 break;
4175
4176 case clang::Type::Typedef:
4177 return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx);
4178
4179 case clang::Type::Elaborated:
4180 return GetMemberFunctionAtIndex(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx);
4181
4182 case clang::Type::Paren:
4183 return GetMemberFunctionAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx);
4184
4185 default:
4186 break;
4187 }
4188 }
4189
4190 if (kind == eMemberFunctionKindUnknown)
4191 return TypeMemberFunctionImpl();
4192 if (method_decl)
4193 return TypeMemberFunctionImpl(method_decl, name, kind);
4194 if (type)
4195 return TypeMemberFunctionImpl(clang_type, name, kind);
4196
4197 return TypeMemberFunctionImpl();
4198}
4199
Greg Claytona1e5dc82015-08-11 22:53:00 +00004200CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004201ClangASTContext::GetNonReferenceType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004202{
4203 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004204 return CompilerType(getASTContext(), GetQualType(type).getNonReferenceType());
4205 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004206}
4207
Greg Claytona1e5dc82015-08-11 22:53:00 +00004208CompilerType
4209ClangASTContext::CreateTypedefType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00004210 const char *typedef_name,
Greg Clayton99558cc42015-08-24 23:46:31 +00004211 const CompilerDeclContext &compiler_decl_ctx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004212{
4213 if (type && typedef_name && typedef_name[0])
4214 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004215 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004216 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004217 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004218 clang::ASTContext* clang_ast = ast->getASTContext();
4219 clang::QualType qual_type (GetQualType(type));
Greg Clayton99558cc42015-08-24 23:46:31 +00004220
4221 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004222 if (decl_ctx == nullptr)
4223 decl_ctx = ast->getASTContext()->getTranslationUnitDecl();
Greg Clayton99558cc42015-08-24 23:46:31 +00004224
Greg Claytond8d4a572015-08-11 21:38:15 +00004225 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4226 decl_ctx,
4227 clang::SourceLocation(),
4228 clang::SourceLocation(),
4229 &clang_ast->Idents.get(typedef_name),
4230 clang_ast->getTrivialTypeSourceInfo(qual_type));
4231
4232 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4233
4234 // Get a uniqued clang::QualType for the typedef decl type
Greg Claytona1e5dc82015-08-11 22:53:00 +00004235 return CompilerType (clang_ast, clang_ast->getTypedefType (decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00004236 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004237 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004238
4239}
4240
Greg Claytona1e5dc82015-08-11 22:53:00 +00004241CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004242ClangASTContext::GetPointeeType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004243{
4244 if (type)
4245 {
4246 clang::QualType qual_type(GetQualType(type));
Greg Claytona1e5dc82015-08-11 22:53:00 +00004247 return CompilerType (getASTContext(), qual_type.getTypePtr()->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004248 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004249 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004250}
4251
Greg Claytona1e5dc82015-08-11 22:53:00 +00004252CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004253ClangASTContext::GetPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004254{
4255 if (type)
4256 {
4257 clang::QualType qual_type (GetQualType(type));
4258
4259 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4260 switch (type_class)
4261 {
4262 case clang::Type::ObjCObject:
4263 case clang::Type::ObjCInterface:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004264 return CompilerType(getASTContext(), getASTContext()->getObjCObjectPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004265
4266 default:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004267 return CompilerType(getASTContext(), getASTContext()->getPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004268 }
4269 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004270 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004271}
4272
Greg Clayton56939cb2015-09-17 22:23:34 +00004273
4274CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004275ClangASTContext::GetLValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004276{
4277 if (type)
4278 return CompilerType(this, getASTContext()->getLValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4279 else
4280 return CompilerType();
4281}
4282
4283CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004284ClangASTContext::GetRValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004285{
4286 if (type)
4287 return CompilerType(this, getASTContext()->getRValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4288 else
4289 return CompilerType();
4290}
4291
4292CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004293ClangASTContext::AddConstModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004294{
4295 if (type)
4296 {
4297 clang::QualType result(GetQualType(type));
4298 result.addConst();
4299 return CompilerType (this, result.getAsOpaquePtr());
4300 }
4301 return CompilerType();
4302}
4303
4304CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004305ClangASTContext::AddVolatileModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004306{
4307 if (type)
4308 {
4309 clang::QualType result(GetQualType(type));
4310 result.addVolatile();
4311 return CompilerType (this, result.getAsOpaquePtr());
4312 }
4313 return CompilerType();
4314
4315}
4316
4317CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004318ClangASTContext::AddRestrictModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004319{
4320 if (type)
4321 {
4322 clang::QualType result(GetQualType(type));
4323 result.addRestrict();
4324 return CompilerType (this, result.getAsOpaquePtr());
4325 }
4326 return CompilerType();
4327
4328}
4329
4330CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004331ClangASTContext::CreateTypedef (lldb::opaque_compiler_type_t type, const char *typedef_name, const CompilerDeclContext &compiler_decl_ctx)
Greg Clayton56939cb2015-09-17 22:23:34 +00004332{
4333 if (type)
4334 {
4335 clang::ASTContext* clang_ast = getASTContext();
4336 clang::QualType qual_type (GetQualType(type));
4337
4338 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
4339 if (decl_ctx == nullptr)
4340 decl_ctx = getASTContext()->getTranslationUnitDecl();
4341
4342 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4343 decl_ctx,
4344 clang::SourceLocation(),
4345 clang::SourceLocation(),
4346 &clang_ast->Idents.get(typedef_name),
4347 clang_ast->getTrivialTypeSourceInfo(qual_type));
4348
4349 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4350
4351 // Get a uniqued clang::QualType for the typedef decl type
4352 return CompilerType (this, clang_ast->getTypedefType (decl).getAsOpaquePtr());
4353
4354 }
4355 return CompilerType();
4356
4357}
4358
Greg Claytona1e5dc82015-08-11 22:53:00 +00004359CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004360ClangASTContext::GetTypedefedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004361{
4362 if (type)
4363 {
4364 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4365 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004366 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004367 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004368 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004369}
4370
Greg Claytona1e5dc82015-08-11 22:53:00 +00004371CompilerType
4372ClangASTContext::RemoveFastQualifiers (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004373{
Ryan Brown57bee1e2015-09-14 22:45:11 +00004374 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00004375 {
4376 clang::QualType qual_type(GetQualType(type));
4377 qual_type.getQualifiers().removeFastQualifiers();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004378 return CompilerType (type.GetTypeSystem(), qual_type.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004379 }
4380 return type;
4381}
4382
4383
4384//----------------------------------------------------------------------
4385// Create related types using the current type's AST
4386//----------------------------------------------------------------------
4387
Greg Claytona1e5dc82015-08-11 22:53:00 +00004388CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00004389ClangASTContext::GetBasicTypeFromAST (lldb::BasicType basic_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004390{
Greg Clayton99558cc42015-08-24 23:46:31 +00004391 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004392}
4393//----------------------------------------------------------------------
4394// Exploring the type
4395//----------------------------------------------------------------------
4396
4397uint64_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004398ClangASTContext::GetBitSize (lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope)
Greg Claytond8d4a572015-08-11 21:38:15 +00004399{
4400 if (GetCompleteType (type))
4401 {
4402 clang::QualType qual_type(GetCanonicalQualType(type));
4403 switch (qual_type->getTypeClass())
4404 {
4405 case clang::Type::ObjCInterface:
4406 case clang::Type::ObjCObject:
4407 {
4408 ExecutionContext exe_ctx (exe_scope);
4409 Process *process = exe_ctx.GetProcessPtr();
4410 if (process)
4411 {
4412 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4413 if (objc_runtime)
4414 {
4415 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004416 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00004417 return bit_size;
4418 }
4419 }
4420 else
4421 {
4422 static bool g_printed = false;
4423 if (!g_printed)
4424 {
4425 StreamString s;
4426 DumpTypeDescription(&s);
4427
4428 llvm::outs() << "warning: trying to determine the size of type ";
4429 llvm::outs() << s.GetString() << "\n";
4430 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
4431 llvm::outs() << "backtrace:\n";
4432 llvm::sys::PrintStackTrace(llvm::outs());
4433 llvm::outs() << "\n";
4434 g_printed = true;
4435 }
4436 }
4437 }
4438 // fallthrough
4439 default:
4440 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
4441 if (bit_size == 0)
4442 {
4443 if (qual_type->isIncompleteArrayType())
4444 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
4445 }
4446 if (qual_type->isObjCObjectOrInterfaceType())
4447 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
4448 return bit_size;
4449 }
4450 }
4451 return 0;
4452}
4453
4454size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004455ClangASTContext::GetTypeBitAlign (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004456{
4457 if (GetCompleteType(type))
4458 return getASTContext()->getTypeAlign(GetQualType(type));
4459 return 0;
4460}
4461
4462
4463lldb::Encoding
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004464ClangASTContext::GetEncoding (lldb::opaque_compiler_type_t type, uint64_t &count)
Greg Claytond8d4a572015-08-11 21:38:15 +00004465{
4466 if (!type)
4467 return lldb::eEncodingInvalid;
4468
4469 count = 1;
4470 clang::QualType qual_type(GetCanonicalQualType(type));
4471
4472 switch (qual_type->getTypeClass())
4473 {
4474 case clang::Type::UnaryTransform:
4475 break;
4476
4477 case clang::Type::FunctionNoProto:
4478 case clang::Type::FunctionProto:
4479 break;
4480
4481 case clang::Type::IncompleteArray:
4482 case clang::Type::VariableArray:
4483 break;
4484
4485 case clang::Type::ConstantArray:
4486 break;
4487
4488 case clang::Type::ExtVector:
4489 case clang::Type::Vector:
4490 // TODO: Set this to more than one???
4491 break;
4492
4493 case clang::Type::Builtin:
4494 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4495 {
Greg Claytond8d4a572015-08-11 21:38:15 +00004496 case clang::BuiltinType::Void:
4497 break;
4498
4499 case clang::BuiltinType::Bool:
4500 case clang::BuiltinType::Char_S:
4501 case clang::BuiltinType::SChar:
4502 case clang::BuiltinType::WChar_S:
4503 case clang::BuiltinType::Char16:
4504 case clang::BuiltinType::Char32:
4505 case clang::BuiltinType::Short:
4506 case clang::BuiltinType::Int:
4507 case clang::BuiltinType::Long:
4508 case clang::BuiltinType::LongLong:
4509 case clang::BuiltinType::Int128: return lldb::eEncodingSint;
4510
4511 case clang::BuiltinType::Char_U:
4512 case clang::BuiltinType::UChar:
4513 case clang::BuiltinType::WChar_U:
4514 case clang::BuiltinType::UShort:
4515 case clang::BuiltinType::UInt:
4516 case clang::BuiltinType::ULong:
4517 case clang::BuiltinType::ULongLong:
4518 case clang::BuiltinType::UInt128: return lldb::eEncodingUint;
4519
4520 case clang::BuiltinType::Float:
4521 case clang::BuiltinType::Double:
4522 case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
4523
4524 case clang::BuiltinType::ObjCClass:
4525 case clang::BuiltinType::ObjCId:
4526 case clang::BuiltinType::ObjCSel: return lldb::eEncodingUint;
4527
4528 case clang::BuiltinType::NullPtr: return lldb::eEncodingUint;
4529
4530 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4531 case clang::BuiltinType::Kind::BoundMember:
4532 case clang::BuiltinType::Kind::BuiltinFn:
4533 case clang::BuiltinType::Kind::Dependent:
4534 case clang::BuiltinType::Kind::Half:
Ed Mastec6dd6512015-09-23 18:32:34 +00004535 case clang::BuiltinType::Kind::OCLClkEvent:
Greg Claytond8d4a572015-08-11 21:38:15 +00004536 case clang::BuiltinType::Kind::OCLEvent:
4537 case clang::BuiltinType::Kind::OCLImage1d:
4538 case clang::BuiltinType::Kind::OCLImage1dArray:
4539 case clang::BuiltinType::Kind::OCLImage1dBuffer:
4540 case clang::BuiltinType::Kind::OCLImage2d:
4541 case clang::BuiltinType::Kind::OCLImage2dArray:
Ed Mastec6dd6512015-09-23 18:32:34 +00004542 case clang::BuiltinType::Kind::OCLImage2dArrayDepth:
4543 case clang::BuiltinType::Kind::OCLImage2dArrayMSAA:
4544 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepth:
4545 case clang::BuiltinType::Kind::OCLImage2dDepth:
4546 case clang::BuiltinType::Kind::OCLImage2dMSAA:
4547 case clang::BuiltinType::Kind::OCLImage2dMSAADepth:
Greg Claytond8d4a572015-08-11 21:38:15 +00004548 case clang::BuiltinType::Kind::OCLImage3d:
Ed Mastec6dd6512015-09-23 18:32:34 +00004549 case clang::BuiltinType::Kind::OCLQueue:
4550 case clang::BuiltinType::Kind::OCLNDRange:
4551 case clang::BuiltinType::Kind::OCLReserveID:
Greg Claytond8d4a572015-08-11 21:38:15 +00004552 case clang::BuiltinType::Kind::OCLSampler:
Ed Mastec6dd6512015-09-23 18:32:34 +00004553 case clang::BuiltinType::Kind::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00004554 case clang::BuiltinType::Kind::Overload:
4555 case clang::BuiltinType::Kind::PseudoObject:
4556 case clang::BuiltinType::Kind::UnknownAny:
4557 break;
4558 }
4559 break;
4560 // All pointer types are represented as unsigned integer encodings.
4561 // We may nee to add a eEncodingPointer if we ever need to know the
4562 // difference
4563 case clang::Type::ObjCObjectPointer:
4564 case clang::Type::BlockPointer:
4565 case clang::Type::Pointer:
4566 case clang::Type::LValueReference:
4567 case clang::Type::RValueReference:
4568 case clang::Type::MemberPointer: return lldb::eEncodingUint;
4569 case clang::Type::Complex:
4570 {
4571 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4572 if (qual_type->isComplexType())
4573 encoding = lldb::eEncodingIEEE754;
4574 else
4575 {
4576 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
4577 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004578 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004579 else
4580 encoding = lldb::eEncodingSint;
4581 }
4582 count = 2;
4583 return encoding;
4584 }
4585
4586 case clang::Type::ObjCInterface: break;
4587 case clang::Type::Record: break;
4588 case clang::Type::Enum: return lldb::eEncodingSint;
4589 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004590 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004591
4592 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004593 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004594
4595 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004596 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004597
4598 case clang::Type::DependentSizedArray:
4599 case clang::Type::DependentSizedExtVector:
4600 case clang::Type::UnresolvedUsing:
4601 case clang::Type::Attributed:
4602 case clang::Type::TemplateTypeParm:
4603 case clang::Type::SubstTemplateTypeParm:
4604 case clang::Type::SubstTemplateTypeParmPack:
4605 case clang::Type::Auto:
4606 case clang::Type::InjectedClassName:
4607 case clang::Type::DependentName:
4608 case clang::Type::DependentTemplateSpecialization:
4609 case clang::Type::PackExpansion:
4610 case clang::Type::ObjCObject:
4611
4612 case clang::Type::TypeOfExpr:
4613 case clang::Type::TypeOf:
4614 case clang::Type::Decltype:
4615 case clang::Type::TemplateSpecialization:
4616 case clang::Type::Atomic:
4617 case clang::Type::Adjusted:
4618 break;
4619
4620 // pointer type decayed from an array or function type.
4621 case clang::Type::Decayed:
4622 break;
4623 }
4624 count = 0;
4625 return lldb::eEncodingInvalid;
4626}
4627
4628lldb::Format
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004629ClangASTContext::GetFormat (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004630{
4631 if (!type)
4632 return lldb::eFormatDefault;
4633
4634 clang::QualType qual_type(GetCanonicalQualType(type));
4635
4636 switch (qual_type->getTypeClass())
4637 {
4638 case clang::Type::UnaryTransform:
4639 break;
4640
4641 case clang::Type::FunctionNoProto:
4642 case clang::Type::FunctionProto:
4643 break;
4644
4645 case clang::Type::IncompleteArray:
4646 case clang::Type::VariableArray:
4647 break;
4648
4649 case clang::Type::ConstantArray:
4650 return lldb::eFormatVoid; // no value
4651
4652 case clang::Type::ExtVector:
4653 case clang::Type::Vector:
4654 break;
4655
4656 case clang::Type::Builtin:
4657 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4658 {
4659 //default: assert(0 && "Unknown builtin type!");
4660 case clang::BuiltinType::UnknownAny:
4661 case clang::BuiltinType::Void:
4662 case clang::BuiltinType::BoundMember:
4663 break;
4664
4665 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
4666 case clang::BuiltinType::Char_S:
4667 case clang::BuiltinType::SChar:
4668 case clang::BuiltinType::WChar_S:
4669 case clang::BuiltinType::Char_U:
4670 case clang::BuiltinType::UChar:
4671 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
4672 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
4673 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
4674 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
4675 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
4676 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
4677 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
4678 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
4679 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
4680 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
4681 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
4682 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
4683 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
4684 case clang::BuiltinType::Float: return lldb::eFormatFloat;
4685 case clang::BuiltinType::Double: return lldb::eFormatFloat;
4686 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
Zachary Turnerdd07e002015-09-16 18:08:45 +00004687 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00004688 return lldb::eFormatHex;
4689 }
4690 break;
4691 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
4692 case clang::Type::BlockPointer: return lldb::eFormatHex;
4693 case clang::Type::Pointer: return lldb::eFormatHex;
4694 case clang::Type::LValueReference:
4695 case clang::Type::RValueReference: return lldb::eFormatHex;
4696 case clang::Type::MemberPointer: break;
4697 case clang::Type::Complex:
4698 {
4699 if (qual_type->isComplexType())
4700 return lldb::eFormatComplex;
4701 else
4702 return lldb::eFormatComplexInteger;
4703 }
4704 case clang::Type::ObjCInterface: break;
4705 case clang::Type::Record: break;
4706 case clang::Type::Enum: return lldb::eFormatEnum;
4707 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004708 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004709 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004710 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004711 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004712 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004713 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004714 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004715 case clang::Type::DependentSizedArray:
4716 case clang::Type::DependentSizedExtVector:
4717 case clang::Type::UnresolvedUsing:
4718 case clang::Type::Attributed:
4719 case clang::Type::TemplateTypeParm:
4720 case clang::Type::SubstTemplateTypeParm:
4721 case clang::Type::SubstTemplateTypeParmPack:
4722 case clang::Type::InjectedClassName:
4723 case clang::Type::DependentName:
4724 case clang::Type::DependentTemplateSpecialization:
4725 case clang::Type::PackExpansion:
4726 case clang::Type::ObjCObject:
4727
4728 case clang::Type::TypeOfExpr:
4729 case clang::Type::TypeOf:
4730 case clang::Type::Decltype:
4731 case clang::Type::TemplateSpecialization:
4732 case clang::Type::Atomic:
4733 case clang::Type::Adjusted:
4734 break;
4735
4736 // pointer type decayed from an array or function type.
4737 case clang::Type::Decayed:
4738 break;
4739 }
4740 // We don't know hot to display this type...
4741 return lldb::eFormatBytes;
4742}
4743
4744static bool
4745ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
4746{
4747 while (class_interface_decl)
4748 {
4749 if (class_interface_decl->ivar_size() > 0)
4750 return true;
4751
4752 if (check_superclass)
4753 class_interface_decl = class_interface_decl->getSuperClass();
4754 else
4755 break;
4756 }
4757 return false;
4758}
4759
4760uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004761ClangASTContext::GetNumChildren (lldb::opaque_compiler_type_t type, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00004762{
4763 if (!type)
4764 return 0;
4765
4766 uint32_t num_children = 0;
4767 clang::QualType qual_type(GetQualType(type));
4768 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4769 switch (type_class)
4770 {
4771 case clang::Type::Builtin:
4772 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4773 {
4774 case clang::BuiltinType::ObjCId: // child is Class
4775 case clang::BuiltinType::ObjCClass: // child is Class
4776 num_children = 1;
4777 break;
4778
4779 default:
4780 break;
4781 }
4782 break;
4783
4784 case clang::Type::Complex: return 0;
4785
4786 case clang::Type::Record:
4787 if (GetCompleteQualType (getASTContext(), qual_type))
4788 {
4789 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4790 const clang::RecordDecl *record_decl = record_type->getDecl();
4791 assert(record_decl);
4792 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4793 if (cxx_record_decl)
4794 {
4795 if (omit_empty_base_classes)
4796 {
4797 // Check each base classes to see if it or any of its
4798 // base classes contain any fields. This can help
4799 // limit the noise in variable views by not having to
4800 // show base classes that contain no members.
4801 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
4802 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
4803 base_class != base_class_end;
4804 ++base_class)
4805 {
4806 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
4807
4808 // Skip empty base classes
4809 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
4810 continue;
4811
4812 num_children++;
4813 }
4814 }
4815 else
4816 {
4817 // Include all base classes
4818 num_children += cxx_record_decl->getNumBases();
4819 }
4820
4821 }
4822 clang::RecordDecl::field_iterator field, field_end;
4823 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
4824 ++num_children;
4825 }
4826 break;
4827
4828 case clang::Type::ObjCObject:
4829 case clang::Type::ObjCInterface:
4830 if (GetCompleteQualType (getASTContext(), qual_type))
4831 {
4832 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4833 assert (objc_class_type);
4834 if (objc_class_type)
4835 {
4836 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4837
4838 if (class_interface_decl)
4839 {
4840
4841 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
4842 if (superclass_interface_decl)
4843 {
4844 if (omit_empty_base_classes)
4845 {
4846 if (ObjCDeclHasIVars (superclass_interface_decl, true))
4847 ++num_children;
4848 }
4849 else
4850 ++num_children;
4851 }
4852
4853 num_children += class_interface_decl->ivar_size();
4854 }
4855 }
4856 }
4857 break;
4858
4859 case clang::Type::ObjCObjectPointer:
4860 {
4861 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
4862 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004863 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004864 // If this type points to a simple type, then it has 1 child
4865 if (num_pointee_children == 0)
4866 num_children = 1;
4867 else
4868 num_children = num_pointee_children;
4869 }
4870 break;
4871
4872 case clang::Type::Vector:
4873 case clang::Type::ExtVector:
4874 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
4875 break;
4876
4877 case clang::Type::ConstantArray:
4878 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4879 break;
4880
4881 case clang::Type::Pointer:
4882 {
4883 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
4884 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00004885 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004886 if (num_pointee_children == 0)
4887 {
4888 // We have a pointer to a pointee type that claims it has no children.
4889 // We will want to look at
4890 num_children = GetNumPointeeChildren (pointee_type);
4891 }
4892 else
4893 num_children = num_pointee_children;
4894 }
4895 break;
4896
4897 case clang::Type::LValueReference:
4898 case clang::Type::RValueReference:
4899 {
4900 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
4901 clang::QualType pointee_type = reference_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004902 uint32_t num_pointee_children = CompilerType (getASTContext(), pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004903 // If this type points to a simple type, then it has 1 child
4904 if (num_pointee_children == 0)
4905 num_children = 1;
4906 else
4907 num_children = num_pointee_children;
4908 }
4909 break;
4910
4911
4912 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004913 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004914 break;
4915
4916 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004917 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004918 break;
4919
4920 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004921 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00004922 break;
4923 default:
4924 break;
4925 }
4926 return num_children;
4927}
4928
Greg Clayton56939cb2015-09-17 22:23:34 +00004929CompilerType
4930ClangASTContext::GetBuiltinTypeByName (const ConstString &name)
4931{
4932 return GetBasicType (GetBasicTypeEnumeration (name));
4933}
4934
Greg Claytond8d4a572015-08-11 21:38:15 +00004935lldb::BasicType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004936ClangASTContext::GetBasicTypeEnumeration (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004937{
4938 if (type)
4939 {
4940 clang::QualType qual_type(GetQualType(type));
4941 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4942 if (type_class == clang::Type::Builtin)
4943 {
4944 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4945 {
4946 case clang::BuiltinType::Void: return eBasicTypeVoid;
4947 case clang::BuiltinType::Bool: return eBasicTypeBool;
4948 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
4949 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
4950 case clang::BuiltinType::Char16: return eBasicTypeChar16;
4951 case clang::BuiltinType::Char32: return eBasicTypeChar32;
4952 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
4953 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
4954 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
4955 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
4956 case clang::BuiltinType::Short: return eBasicTypeShort;
4957 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
4958 case clang::BuiltinType::Int: return eBasicTypeInt;
4959 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
4960 case clang::BuiltinType::Long: return eBasicTypeLong;
4961 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
4962 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
4963 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
4964 case clang::BuiltinType::Int128: return eBasicTypeInt128;
4965 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
4966
4967 case clang::BuiltinType::Half: return eBasicTypeHalf;
4968 case clang::BuiltinType::Float: return eBasicTypeFloat;
4969 case clang::BuiltinType::Double: return eBasicTypeDouble;
4970 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
4971
4972 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
4973 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
4974 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
4975 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
Zachary Turnerdd07e002015-09-16 18:08:45 +00004976 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00004977 return eBasicTypeOther;
4978 }
4979 }
4980 }
4981 return eBasicTypeInvalid;
4982}
4983
Greg Clayton99558cc42015-08-24 23:46:31 +00004984void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004985ClangASTContext::ForEachEnumerator (lldb::opaque_compiler_type_t type, std::function <bool (const CompilerType &integer_type, const ConstString &name, const llvm::APSInt &value)> const &callback)
Greg Clayton99558cc42015-08-24 23:46:31 +00004986{
4987 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
4988 if (enum_type)
4989 {
4990 const clang::EnumDecl *enum_decl = enum_type->getDecl();
4991 if (enum_decl)
4992 {
4993 CompilerType integer_type(this, enum_decl->getIntegerType().getAsOpaquePtr());
4994
4995 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
4996 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
4997 {
4998 ConstString name(enum_pos->getNameAsString().c_str());
4999 if (!callback (integer_type, name, enum_pos->getInitVal()))
5000 break;
5001 }
5002 }
5003 }
5004}
5005
Greg Claytond8d4a572015-08-11 21:38:15 +00005006
5007#pragma mark Aggregate Types
5008
5009uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005010ClangASTContext::GetNumFields (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005011{
5012 if (!type)
5013 return 0;
5014
5015 uint32_t count = 0;
5016 clang::QualType qual_type(GetCanonicalQualType(type));
5017 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5018 switch (type_class)
5019 {
5020 case clang::Type::Record:
5021 if (GetCompleteType(type))
5022 {
5023 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
5024 if (record_type)
5025 {
5026 clang::RecordDecl *record_decl = record_type->getDecl();
5027 if (record_decl)
5028 {
5029 uint32_t field_idx = 0;
5030 clang::RecordDecl::field_iterator field, field_end;
5031 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5032 ++field_idx;
5033 count = field_idx;
5034 }
5035 }
5036 }
5037 break;
5038
5039 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005040 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005041 break;
5042
5043 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005044 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005045 break;
5046
5047 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005048 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005049 break;
5050
5051 case clang::Type::ObjCObjectPointer:
5052 if (GetCompleteType(type))
5053 {
5054 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5055 if (objc_class_type)
5056 {
5057 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
5058
5059 if (class_interface_decl)
5060 count = class_interface_decl->ivar_size();
5061 }
5062 }
5063 break;
5064
5065 case clang::Type::ObjCObject:
5066 case clang::Type::ObjCInterface:
5067 if (GetCompleteType(type))
5068 {
5069 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5070 if (objc_class_type)
5071 {
5072 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5073
5074 if (class_interface_decl)
5075 count = class_interface_decl->ivar_size();
5076 }
5077 }
5078 break;
5079
5080 default:
5081 break;
5082 }
5083 return count;
5084}
5085
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005086static lldb::opaque_compiler_type_t
Greg Claytond8d4a572015-08-11 21:38:15 +00005087GetObjCFieldAtIndex (clang::ASTContext *ast,
5088 clang::ObjCInterfaceDecl *class_interface_decl,
5089 size_t idx,
5090 std::string& name,
5091 uint64_t *bit_offset_ptr,
5092 uint32_t *bitfield_bit_size_ptr,
5093 bool *is_bitfield_ptr)
5094{
5095 if (class_interface_decl)
5096 {
5097 if (idx < (class_interface_decl->ivar_size()))
5098 {
5099 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5100 uint32_t ivar_idx = 0;
5101
5102 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
5103 {
5104 if (ivar_idx == idx)
5105 {
5106 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5107
5108 clang::QualType ivar_qual_type(ivar_decl->getType());
5109
5110 name.assign(ivar_decl->getNameAsString());
5111
5112 if (bit_offset_ptr)
5113 {
5114 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
5115 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
5116 }
5117
5118 const bool is_bitfield = ivar_pos->isBitField();
5119
5120 if (bitfield_bit_size_ptr)
5121 {
5122 *bitfield_bit_size_ptr = 0;
5123
5124 if (is_bitfield && ast)
5125 {
5126 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
5127 llvm::APSInt bitfield_apsint;
5128 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
5129 {
5130 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5131 }
5132 }
5133 }
5134 if (is_bitfield_ptr)
5135 *is_bitfield_ptr = is_bitfield;
5136
5137 return ivar_qual_type.getAsOpaquePtr();
5138 }
5139 }
5140 }
5141 }
5142 return nullptr;
5143}
5144
Greg Claytona1e5dc82015-08-11 22:53:00 +00005145CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005146ClangASTContext::GetFieldAtIndex (lldb::opaque_compiler_type_t type, size_t idx,
Greg Claytond8d4a572015-08-11 21:38:15 +00005147 std::string& name,
5148 uint64_t *bit_offset_ptr,
5149 uint32_t *bitfield_bit_size_ptr,
5150 bool *is_bitfield_ptr)
5151{
5152 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005153 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005154
5155 clang::QualType qual_type(GetCanonicalQualType(type));
5156 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5157 switch (type_class)
5158 {
5159 case clang::Type::Record:
5160 if (GetCompleteType(type))
5161 {
5162 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5163 const clang::RecordDecl *record_decl = record_type->getDecl();
5164 uint32_t field_idx = 0;
5165 clang::RecordDecl::field_iterator field, field_end;
5166 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
5167 {
5168 if (idx == field_idx)
5169 {
5170 // Print the member type if requested
5171 // Print the member name and equal sign
5172 name.assign(field->getNameAsString());
5173
5174 // Figure out the type byte size (field_type_info.first) and
5175 // alignment (field_type_info.second) from the AST context.
5176 if (bit_offset_ptr)
5177 {
5178 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5179 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5180 }
5181
5182 const bool is_bitfield = field->isBitField();
5183
5184 if (bitfield_bit_size_ptr)
5185 {
5186 *bitfield_bit_size_ptr = 0;
5187
5188 if (is_bitfield)
5189 {
5190 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5191 llvm::APSInt bitfield_apsint;
5192 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5193 {
5194 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5195 }
5196 }
5197 }
5198 if (is_bitfield_ptr)
5199 *is_bitfield_ptr = is_bitfield;
5200
Greg Claytona1e5dc82015-08-11 22:53:00 +00005201 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005202 }
5203 }
5204 }
5205 break;
5206
5207 case clang::Type::ObjCObjectPointer:
5208 if (GetCompleteType(type))
5209 {
5210 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5211 if (objc_class_type)
5212 {
5213 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005214 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 +00005215 }
5216 }
5217 break;
5218
5219 case clang::Type::ObjCObject:
5220 case clang::Type::ObjCInterface:
5221 if (GetCompleteType(type))
5222 {
5223 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5224 assert (objc_class_type);
5225 if (objc_class_type)
5226 {
5227 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005228 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 +00005229 }
5230 }
5231 break;
5232
5233
5234 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005235 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005236 GetFieldAtIndex (idx,
5237 name,
5238 bit_offset_ptr,
5239 bitfield_bit_size_ptr,
5240 is_bitfield_ptr);
5241
5242 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005243 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005244 GetFieldAtIndex (idx,
5245 name,
5246 bit_offset_ptr,
5247 bitfield_bit_size_ptr,
5248 is_bitfield_ptr);
5249
5250 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005251 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005252 GetFieldAtIndex (idx,
5253 name,
5254 bit_offset_ptr,
5255 bitfield_bit_size_ptr,
5256 is_bitfield_ptr);
5257
5258 default:
5259 break;
5260 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005261 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005262}
5263
Greg Clayton99558cc42015-08-24 23:46:31 +00005264uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005265ClangASTContext::GetNumDirectBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005266{
5267 uint32_t count = 0;
5268 clang::QualType qual_type(GetCanonicalQualType(type));
5269 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5270 switch (type_class)
5271 {
5272 case clang::Type::Record:
5273 if (GetCompleteType(type))
5274 {
5275 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5276 if (cxx_record_decl)
5277 count = cxx_record_decl->getNumBases();
5278 }
5279 break;
5280
5281 case clang::Type::ObjCObjectPointer:
5282 count = GetPointeeType(type).GetNumDirectBaseClasses();
5283 break;
5284
5285 case clang::Type::ObjCObject:
5286 if (GetCompleteType(type))
5287 {
5288 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5289 if (objc_class_type)
5290 {
5291 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5292
5293 if (class_interface_decl && class_interface_decl->getSuperClass())
5294 count = 1;
5295 }
5296 }
5297 break;
5298 case clang::Type::ObjCInterface:
5299 if (GetCompleteType(type))
5300 {
5301 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5302 if (objc_interface_type)
5303 {
5304 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5305
5306 if (class_interface_decl && class_interface_decl->getSuperClass())
5307 count = 1;
5308 }
5309 }
5310 break;
5311
5312
5313 case clang::Type::Typedef:
5314 count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5315 break;
5316
5317 case clang::Type::Elaborated:
5318 count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5319 break;
5320
5321 case clang::Type::Paren:
5322 return GetNumDirectBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5323
5324 default:
5325 break;
5326 }
5327 return count;
5328
5329}
5330
5331uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005332ClangASTContext::GetNumVirtualBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005333{
5334 uint32_t count = 0;
5335 clang::QualType qual_type(GetCanonicalQualType(type));
5336 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5337 switch (type_class)
5338 {
5339 case clang::Type::Record:
5340 if (GetCompleteType(type))
5341 {
5342 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5343 if (cxx_record_decl)
5344 count = cxx_record_decl->getNumVBases();
5345 }
5346 break;
5347
5348 case clang::Type::Typedef:
5349 count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5350 break;
5351
5352 case clang::Type::Elaborated:
5353 count = GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5354 break;
5355
5356 case clang::Type::Paren:
5357 count = GetNumVirtualBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5358 break;
5359
5360 default:
5361 break;
5362 }
5363 return count;
5364
5365}
5366
5367CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005368ClangASTContext::GetDirectBaseClassAtIndex (lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00005369{
5370 clang::QualType qual_type(GetCanonicalQualType(type));
5371 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5372 switch (type_class)
5373 {
5374 case clang::Type::Record:
5375 if (GetCompleteType(type))
5376 {
5377 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5378 if (cxx_record_decl)
5379 {
5380 uint32_t curr_idx = 0;
5381 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5382 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5383 base_class != base_class_end;
5384 ++base_class, ++curr_idx)
5385 {
5386 if (curr_idx == idx)
5387 {
5388 if (bit_offset_ptr)
5389 {
5390 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5391 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5392 if (base_class->isVirtual())
5393 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5394 else
5395 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5396 }
5397 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5398 }
5399 }
5400 }
5401 }
5402 break;
5403
5404 case clang::Type::ObjCObjectPointer:
5405 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
5406
5407 case clang::Type::ObjCObject:
5408 if (idx == 0 && GetCompleteType(type))
5409 {
5410 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5411 if (objc_class_type)
5412 {
5413 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5414
5415 if (class_interface_decl)
5416 {
5417 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5418 if (superclass_interface_decl)
5419 {
5420 if (bit_offset_ptr)
5421 *bit_offset_ptr = 0;
5422 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5423 }
5424 }
5425 }
5426 }
5427 break;
5428 case clang::Type::ObjCInterface:
5429 if (idx == 0 && GetCompleteType(type))
5430 {
5431 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5432 if (objc_interface_type)
5433 {
5434 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5435
5436 if (class_interface_decl)
5437 {
5438 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5439 if (superclass_interface_decl)
5440 {
5441 if (bit_offset_ptr)
5442 *bit_offset_ptr = 0;
5443 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5444 }
5445 }
5446 }
5447 }
5448 break;
5449
5450
5451 case clang::Type::Typedef:
5452 return GetDirectBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5453
5454 case clang::Type::Elaborated:
5455 return GetDirectBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5456
5457 case clang::Type::Paren:
5458 return GetDirectBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5459
5460 default:
5461 break;
5462 }
5463 return CompilerType();
5464}
5465
5466CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005467ClangASTContext::GetVirtualBaseClassAtIndex (lldb::opaque_compiler_type_t type,
Greg Clayton99558cc42015-08-24 23:46:31 +00005468 size_t idx,
5469 uint32_t *bit_offset_ptr)
5470{
5471 clang::QualType qual_type(GetCanonicalQualType(type));
5472 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5473 switch (type_class)
5474 {
5475 case clang::Type::Record:
5476 if (GetCompleteType(type))
5477 {
5478 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5479 if (cxx_record_decl)
5480 {
5481 uint32_t curr_idx = 0;
5482 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5483 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
5484 base_class != base_class_end;
5485 ++base_class, ++curr_idx)
5486 {
5487 if (curr_idx == idx)
5488 {
5489 if (bit_offset_ptr)
5490 {
5491 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5492 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5493 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5494
5495 }
5496 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5497 }
5498 }
5499 }
5500 }
5501 break;
5502
5503 case clang::Type::Typedef:
5504 return GetVirtualBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5505
5506 case clang::Type::Elaborated:
5507 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5508
5509 case clang::Type::Paren:
5510 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5511
5512 default:
5513 break;
5514 }
5515 return CompilerType();
5516
5517}
5518
Greg Claytond8d4a572015-08-11 21:38:15 +00005519// If a pointer to a pointee type (the clang_type arg) says that it has no
5520// children, then we either need to trust it, or override it and return a
5521// different result. For example, an "int *" has one child that is an integer,
5522// but a function pointer doesn't have any children. Likewise if a Record type
5523// claims it has no children, then there really is nothing to show.
5524uint32_t
5525ClangASTContext::GetNumPointeeChildren (clang::QualType type)
5526{
5527 if (type.isNull())
5528 return 0;
5529
5530 clang::QualType qual_type(type.getCanonicalType());
5531 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5532 switch (type_class)
5533 {
5534 case clang::Type::Builtin:
5535 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5536 {
5537 case clang::BuiltinType::UnknownAny:
5538 case clang::BuiltinType::Void:
5539 case clang::BuiltinType::NullPtr:
5540 case clang::BuiltinType::OCLEvent:
5541 case clang::BuiltinType::OCLImage1d:
5542 case clang::BuiltinType::OCLImage1dArray:
5543 case clang::BuiltinType::OCLImage1dBuffer:
5544 case clang::BuiltinType::OCLImage2d:
5545 case clang::BuiltinType::OCLImage2dArray:
5546 case clang::BuiltinType::OCLImage3d:
5547 case clang::BuiltinType::OCLSampler:
5548 return 0;
5549 case clang::BuiltinType::Bool:
5550 case clang::BuiltinType::Char_U:
5551 case clang::BuiltinType::UChar:
5552 case clang::BuiltinType::WChar_U:
5553 case clang::BuiltinType::Char16:
5554 case clang::BuiltinType::Char32:
5555 case clang::BuiltinType::UShort:
5556 case clang::BuiltinType::UInt:
5557 case clang::BuiltinType::ULong:
5558 case clang::BuiltinType::ULongLong:
5559 case clang::BuiltinType::UInt128:
5560 case clang::BuiltinType::Char_S:
5561 case clang::BuiltinType::SChar:
5562 case clang::BuiltinType::WChar_S:
5563 case clang::BuiltinType::Short:
5564 case clang::BuiltinType::Int:
5565 case clang::BuiltinType::Long:
5566 case clang::BuiltinType::LongLong:
5567 case clang::BuiltinType::Int128:
5568 case clang::BuiltinType::Float:
5569 case clang::BuiltinType::Double:
5570 case clang::BuiltinType::LongDouble:
5571 case clang::BuiltinType::Dependent:
5572 case clang::BuiltinType::Overload:
5573 case clang::BuiltinType::ObjCId:
5574 case clang::BuiltinType::ObjCClass:
5575 case clang::BuiltinType::ObjCSel:
5576 case clang::BuiltinType::BoundMember:
5577 case clang::BuiltinType::Half:
5578 case clang::BuiltinType::ARCUnbridgedCast:
5579 case clang::BuiltinType::PseudoObject:
5580 case clang::BuiltinType::BuiltinFn:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00005581 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00005582 return 1;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005583 default:
5584 return 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00005585 }
5586 break;
5587
5588 case clang::Type::Complex: return 1;
5589 case clang::Type::Pointer: return 1;
5590 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
5591 case clang::Type::LValueReference: return 1;
5592 case clang::Type::RValueReference: return 1;
5593 case clang::Type::MemberPointer: return 0;
5594 case clang::Type::ConstantArray: return 0;
5595 case clang::Type::IncompleteArray: return 0;
5596 case clang::Type::VariableArray: return 0;
5597 case clang::Type::DependentSizedArray: return 0;
5598 case clang::Type::DependentSizedExtVector: return 0;
5599 case clang::Type::Vector: return 0;
5600 case clang::Type::ExtVector: return 0;
5601 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
5602 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
5603 case clang::Type::UnresolvedUsing: return 0;
5604 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
5605 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
5606 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
5607 case clang::Type::TypeOfExpr: return 0;
5608 case clang::Type::TypeOf: return 0;
5609 case clang::Type::Decltype: return 0;
5610 case clang::Type::Record: return 0;
5611 case clang::Type::Enum: return 1;
5612 case clang::Type::TemplateTypeParm: return 1;
5613 case clang::Type::SubstTemplateTypeParm: return 1;
5614 case clang::Type::TemplateSpecialization: return 1;
5615 case clang::Type::InjectedClassName: return 0;
5616 case clang::Type::DependentName: return 1;
5617 case clang::Type::DependentTemplateSpecialization: return 1;
5618 case clang::Type::ObjCObject: return 0;
5619 case clang::Type::ObjCInterface: return 0;
5620 case clang::Type::ObjCObjectPointer: return 1;
5621 default:
5622 break;
5623 }
5624 return 0;
5625}
5626
5627
Greg Claytona1e5dc82015-08-11 22:53:00 +00005628CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005629ClangASTContext::GetChildCompilerTypeAtIndex (lldb::opaque_compiler_type_t type,
Bruce Mitchener4ad83342015-09-21 16:48:48 +00005630 ExecutionContext *exe_ctx,
5631 size_t idx,
5632 bool transparent_pointers,
5633 bool omit_empty_base_classes,
5634 bool ignore_array_bounds,
5635 std::string& child_name,
5636 uint32_t &child_byte_size,
5637 int32_t &child_byte_offset,
5638 uint32_t &child_bitfield_bit_size,
5639 uint32_t &child_bitfield_bit_offset,
5640 bool &child_is_base_class,
5641 bool &child_is_deref_of_parent,
5642 ValueObject *valobj)
Greg Claytond8d4a572015-08-11 21:38:15 +00005643{
5644 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005645 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005646
5647 clang::QualType parent_qual_type(GetCanonicalQualType(type));
5648 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
5649 child_bitfield_bit_size = 0;
5650 child_bitfield_bit_offset = 0;
5651 child_is_base_class = false;
5652
5653 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
5654 uint32_t bit_offset;
5655 switch (parent_type_class)
5656 {
5657 case clang::Type::Builtin:
5658 if (idx_is_valid)
5659 {
5660 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
5661 {
5662 case clang::BuiltinType::ObjCId:
5663 case clang::BuiltinType::ObjCClass:
5664 child_name = "isa";
5665 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005666 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00005667
5668 default:
5669 break;
5670 }
5671 }
5672 break;
5673
5674 case clang::Type::Record:
5675 if (idx_is_valid && GetCompleteType(type))
5676 {
5677 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
5678 const clang::RecordDecl *record_decl = record_type->getDecl();
5679 assert(record_decl);
5680 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5681 uint32_t child_idx = 0;
5682
5683 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5684 if (cxx_record_decl)
5685 {
5686 // We might have base classes to print out first
5687 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5688 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5689 base_class != base_class_end;
5690 ++base_class)
5691 {
5692 const clang::CXXRecordDecl *base_class_decl = nullptr;
5693
5694 // Skip empty base classes
5695 if (omit_empty_base_classes)
5696 {
5697 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5698 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5699 continue;
5700 }
5701
5702 if (idx == child_idx)
5703 {
5704 if (base_class_decl == nullptr)
5705 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5706
5707
5708 if (base_class->isVirtual())
5709 {
5710 bool handled = false;
5711 if (valobj)
5712 {
5713 Error err;
5714 AddressType addr_type = eAddressTypeInvalid;
5715 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
5716
5717 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
5718 {
5719
5720 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
5721 Process *process = exe_ctx.GetProcessPtr();
5722 if (process)
5723 {
5724 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
5725 if (vtable_ctx)
5726 {
5727 if (vtable_ctx->isMicrosoft())
5728 {
5729 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
5730
5731 if (vtable_ptr_addr)
5732 {
5733 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
5734
5735 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
5736 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
5737 {
5738 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
5739 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
5740 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
5741 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5742 if (base_offset != UINT32_MAX)
5743 {
5744 handled = true;
5745 bit_offset = base_offset * 8;
5746 }
5747 }
5748 }
5749 }
5750 else
5751 {
5752 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
5753 if (vtable_ptr_addr)
5754 {
5755 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
5756 if (vtable_ptr != LLDB_INVALID_ADDRESS)
5757 {
5758 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
5759 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
5760 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5761 if (base_offset != UINT32_MAX)
5762 {
5763 handled = true;
5764 bit_offset = base_offset * 8;
5765 }
5766 }
5767 }
5768 }
5769 }
5770 }
5771 }
5772
5773 }
5774 if (!handled)
5775 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5776 }
5777 else
5778 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5779
5780 // Base classes should be a multiple of 8 bits in size
5781 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005782 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005783 child_name = base_class_clang_type.GetTypeName().AsCString("");
5784 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5785
5786 // Base classes bit sizes should be a multiple of 8 bits in size
5787 assert (base_class_clang_type_bit_size % 8 == 0);
5788 child_byte_size = base_class_clang_type_bit_size / 8;
5789 child_is_base_class = true;
5790 return base_class_clang_type;
5791 }
5792 // We don't increment the child index in the for loop since we might
5793 // be skipping empty base classes
5794 ++child_idx;
5795 }
5796 }
5797 // Make sure index is in range...
5798 uint32_t field_idx = 0;
5799 clang::RecordDecl::field_iterator field, field_end;
5800 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
5801 {
5802 if (idx == child_idx)
5803 {
5804 // Print the member type if requested
5805 // Print the member name and equal sign
5806 child_name.assign(field->getNameAsString().c_str());
5807
5808 // Figure out the type byte size (field_type_info.first) and
5809 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00005810 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005811 assert(field_idx < record_layout.getFieldCount());
5812 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5813
5814 // Figure out the field offset within the current struct/union/class type
5815 bit_offset = record_layout.getFieldOffset (field_idx);
5816 child_byte_offset = bit_offset / 8;
5817 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
5818 child_bitfield_bit_offset = bit_offset % 8;
5819
5820 return field_clang_type;
5821 }
5822 }
5823 }
5824 break;
5825
5826 case clang::Type::ObjCObject:
5827 case clang::Type::ObjCInterface:
5828 if (idx_is_valid && GetCompleteType(type))
5829 {
5830 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
5831 assert (objc_class_type);
5832 if (objc_class_type)
5833 {
5834 uint32_t child_idx = 0;
5835 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5836
5837 if (class_interface_decl)
5838 {
5839
5840 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
5841 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5842 if (superclass_interface_decl)
5843 {
5844 if (omit_empty_base_classes)
5845 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005846 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00005847 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
5848 {
5849 if (idx == 0)
5850 {
5851 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5852
5853
5854 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
5855
5856 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5857
5858 child_byte_size = ivar_type_info.Width / 8;
5859 child_byte_offset = 0;
5860 child_is_base_class = true;
5861
Greg Claytona1e5dc82015-08-11 22:53:00 +00005862 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005863 }
5864
5865 ++child_idx;
5866 }
5867 }
5868 else
5869 ++child_idx;
5870 }
5871
5872 const uint32_t superclass_idx = child_idx;
5873
5874 if (idx < (child_idx + class_interface_decl->ivar_size()))
5875 {
5876 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5877
5878 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
5879 {
5880 if (child_idx == idx)
5881 {
5882 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5883
5884 clang::QualType ivar_qual_type(ivar_decl->getType());
5885
5886 child_name.assign(ivar_decl->getNameAsString().c_str());
5887
5888 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
5889
5890 child_byte_size = ivar_type_info.Width / 8;
5891
5892 // Figure out the field offset within the current struct/union/class type
5893 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
5894 // that doesn't account for the space taken up by unbacked properties, or from
5895 // the changing size of base classes that are newer than this class.
5896 // So if we have a process around that we can ask about this object, do so.
5897 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
5898 Process *process = nullptr;
5899 if (exe_ctx)
5900 process = exe_ctx->GetProcessPtr();
5901 if (process)
5902 {
5903 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
5904 if (objc_runtime != nullptr)
5905 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005906 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005907 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
5908 }
5909 }
5910
5911 // Setting this to UINT32_MAX to make sure we don't compute it twice...
5912 bit_offset = UINT32_MAX;
5913
5914 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
5915 {
5916 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5917 child_byte_offset = bit_offset / 8;
5918 }
5919
5920 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
5921 // of a bitfield within its containing object. So regardless of where we get the byte
5922 // offset from, we still need to get the bit offset for bitfields from the layout.
5923
5924 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
5925 {
5926 if (bit_offset == UINT32_MAX)
5927 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
5928
5929 child_bitfield_bit_offset = bit_offset % 8;
5930 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005931 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005932 }
5933 ++child_idx;
5934 }
5935 }
5936 }
5937 }
5938 }
5939 break;
5940
5941 case clang::Type::ObjCObjectPointer:
5942 if (idx_is_valid)
5943 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005944 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00005945
5946 if (transparent_pointers && pointee_clang_type.IsAggregateType())
5947 {
5948 child_is_deref_of_parent = false;
5949 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00005950 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
5951 idx,
5952 transparent_pointers,
5953 omit_empty_base_classes,
5954 ignore_array_bounds,
5955 child_name,
5956 child_byte_size,
5957 child_byte_offset,
5958 child_bitfield_bit_size,
5959 child_bitfield_bit_offset,
5960 child_is_base_class,
5961 tmp_child_is_deref_of_parent,
5962 valobj);
Greg Claytond8d4a572015-08-11 21:38:15 +00005963 }
5964 else
5965 {
5966 child_is_deref_of_parent = true;
5967 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
5968 if (parent_name)
5969 {
5970 child_name.assign(1, '*');
5971 child_name += parent_name;
5972 }
5973
5974 // We have a pointer to an simple type
5975 if (idx == 0 && pointee_clang_type.GetCompleteType())
5976 {
5977 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5978 child_byte_offset = 0;
5979 return pointee_clang_type;
5980 }
5981 }
5982 }
5983 break;
5984
5985 case clang::Type::Vector:
5986 case clang::Type::ExtVector:
5987 if (idx_is_valid)
5988 {
5989 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
5990 if (array)
5991 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00005992 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005993 if (element_type.GetCompleteType())
5994 {
5995 char element_name[64];
5996 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
5997 child_name.assign(element_name);
5998 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
5999 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6000 return element_type;
6001 }
6002 }
6003 }
6004 break;
6005
6006 case clang::Type::ConstantArray:
6007 case clang::Type::IncompleteArray:
6008 if (ignore_array_bounds || idx_is_valid)
6009 {
6010 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
6011 if (array)
6012 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006013 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006014 if (element_type.GetCompleteType())
6015 {
6016 char element_name[64];
6017 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6018 child_name.assign(element_name);
6019 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6020 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6021 return element_type;
6022 }
6023 }
6024 }
6025 break;
6026
6027
6028 case clang::Type::Pointer:
6029 if (idx_is_valid)
6030 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006031 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006032
6033 // Don't dereference "void *" pointers
6034 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00006035 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006036
6037 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6038 {
6039 child_is_deref_of_parent = false;
6040 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006041 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6042 idx,
6043 transparent_pointers,
6044 omit_empty_base_classes,
6045 ignore_array_bounds,
6046 child_name,
6047 child_byte_size,
6048 child_byte_offset,
6049 child_bitfield_bit_size,
6050 child_bitfield_bit_offset,
6051 child_is_base_class,
6052 tmp_child_is_deref_of_parent,
6053 valobj);
Greg Claytond8d4a572015-08-11 21:38:15 +00006054 }
6055 else
6056 {
6057 child_is_deref_of_parent = true;
6058
6059 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6060 if (parent_name)
6061 {
6062 child_name.assign(1, '*');
6063 child_name += parent_name;
6064 }
6065
6066 // We have a pointer to an simple type
6067 if (idx == 0)
6068 {
6069 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6070 child_byte_offset = 0;
6071 return pointee_clang_type;
6072 }
6073 }
6074 }
6075 break;
6076
6077 case clang::Type::LValueReference:
6078 case clang::Type::RValueReference:
6079 if (idx_is_valid)
6080 {
6081 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006082 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006083 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6084 {
6085 child_is_deref_of_parent = false;
6086 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006087 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6088 idx,
6089 transparent_pointers,
6090 omit_empty_base_classes,
6091 ignore_array_bounds,
6092 child_name,
6093 child_byte_size,
6094 child_byte_offset,
6095 child_bitfield_bit_size,
6096 child_bitfield_bit_offset,
6097 child_is_base_class,
6098 tmp_child_is_deref_of_parent,
6099 valobj);
Greg Claytond8d4a572015-08-11 21:38:15 +00006100 }
6101 else
6102 {
6103 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6104 if (parent_name)
6105 {
6106 child_name.assign(1, '&');
6107 child_name += parent_name;
6108 }
6109
6110 // We have a pointer to an simple type
6111 if (idx == 0)
6112 {
6113 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6114 child_byte_offset = 0;
6115 return pointee_clang_type;
6116 }
6117 }
6118 }
6119 break;
6120
6121 case clang::Type::Typedef:
6122 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006123 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006124 return typedefed_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6125 idx,
6126 transparent_pointers,
6127 omit_empty_base_classes,
6128 ignore_array_bounds,
6129 child_name,
6130 child_byte_size,
6131 child_byte_offset,
6132 child_bitfield_bit_size,
6133 child_bitfield_bit_offset,
6134 child_is_base_class,
6135 child_is_deref_of_parent,
6136 valobj);
Greg Claytond8d4a572015-08-11 21:38:15 +00006137 }
6138 break;
6139
6140 case clang::Type::Elaborated:
6141 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006142 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006143 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6144 idx,
6145 transparent_pointers,
6146 omit_empty_base_classes,
6147 ignore_array_bounds,
6148 child_name,
6149 child_byte_size,
6150 child_byte_offset,
6151 child_bitfield_bit_size,
6152 child_bitfield_bit_offset,
6153 child_is_base_class,
6154 child_is_deref_of_parent,
6155 valobj);
Greg Claytond8d4a572015-08-11 21:38:15 +00006156 }
6157
6158 case clang::Type::Paren:
6159 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006160 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006161 return paren_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6162 idx,
6163 transparent_pointers,
6164 omit_empty_base_classes,
6165 ignore_array_bounds,
6166 child_name,
6167 child_byte_size,
6168 child_byte_offset,
6169 child_bitfield_bit_size,
6170 child_bitfield_bit_offset,
6171 child_is_base_class,
6172 child_is_deref_of_parent,
6173 valobj);
Greg Claytond8d4a572015-08-11 21:38:15 +00006174 }
6175
6176
6177 default:
6178 break;
6179 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006180 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006181}
6182
6183static uint32_t
6184GetIndexForRecordBase
6185(
6186 const clang::RecordDecl *record_decl,
6187 const clang::CXXBaseSpecifier *base_spec,
6188 bool omit_empty_base_classes
6189 )
6190{
6191 uint32_t child_idx = 0;
6192
6193 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6194
6195 // const char *super_name = record_decl->getNameAsCString();
6196 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6197 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6198 //
6199 if (cxx_record_decl)
6200 {
6201 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6202 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6203 base_class != base_class_end;
6204 ++base_class)
6205 {
6206 if (omit_empty_base_classes)
6207 {
6208 if (BaseSpecifierIsEmpty (base_class))
6209 continue;
6210 }
6211
6212 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6213 // child_idx,
6214 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6215 //
6216 //
6217 if (base_class == base_spec)
6218 return child_idx;
6219 ++child_idx;
6220 }
6221 }
6222
6223 return UINT32_MAX;
6224}
6225
6226
6227static uint32_t
6228GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6229 clang::NamedDecl *canonical_decl,
6230 bool omit_empty_base_classes)
6231{
6232 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6233 omit_empty_base_classes);
6234
6235 clang::RecordDecl::field_iterator field, field_end;
6236 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6237 field != field_end;
6238 ++field, ++child_idx)
6239 {
6240 if (field->getCanonicalDecl() == canonical_decl)
6241 return child_idx;
6242 }
6243
6244 return UINT32_MAX;
6245}
6246
6247// Look for a child member (doesn't include base classes, but it does include
6248// their members) in the type hierarchy. Returns an index path into "clang_type"
6249// on how to reach the appropriate member.
6250//
6251// class A
6252// {
6253// public:
6254// int m_a;
6255// int m_b;
6256// };
6257//
6258// class B
6259// {
6260// };
6261//
6262// class C :
6263// public B,
6264// public A
6265// {
6266// };
6267//
6268// If we have a clang type that describes "class C", and we wanted to looked
6269// "m_b" in it:
6270//
6271// With omit_empty_base_classes == false we would get an integer array back with:
6272// { 1, 1 }
6273// The first index 1 is the child index for "class A" within class C
6274// The second index 1 is the child index for "m_b" within class A
6275//
6276// With omit_empty_base_classes == true we would get an integer array back with:
6277// { 0, 1 }
6278// 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)
6279// The second index 1 is the child index for "m_b" within class A
6280
6281size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006282ClangASTContext::GetIndexOfChildMemberWithName (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006283 bool omit_empty_base_classes,
6284 std::vector<uint32_t>& child_indexes)
6285{
6286 if (type && name && name[0])
6287 {
6288 clang::QualType qual_type(GetCanonicalQualType(type));
6289 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6290 switch (type_class)
6291 {
6292 case clang::Type::Record:
6293 if (GetCompleteType(type))
6294 {
6295 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6296 const clang::RecordDecl *record_decl = record_type->getDecl();
6297
6298 assert(record_decl);
6299 uint32_t child_idx = 0;
6300
6301 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6302
6303 // Try and find a field that matches NAME
6304 clang::RecordDecl::field_iterator field, field_end;
6305 llvm::StringRef name_sref(name);
6306 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6307 field != field_end;
6308 ++field, ++child_idx)
6309 {
6310 llvm::StringRef field_name = field->getName();
6311 if (field_name.empty())
6312 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006313 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006314 child_indexes.push_back(child_idx);
6315 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
6316 return child_indexes.size();
6317 child_indexes.pop_back();
6318
6319 }
6320 else if (field_name.equals (name_sref))
6321 {
6322 // We have to add on the number of base classes to this index!
6323 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
6324 return child_indexes.size();
6325 }
6326 }
6327
6328 if (cxx_record_decl)
6329 {
6330 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6331
6332 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6333
6334 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6335 // Didn't find things easily, lets let clang do its thang...
6336 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
6337 clang::DeclarationName decl_name(&ident_ref);
6338
6339 clang::CXXBasePaths paths;
6340 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
6341 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
6342 },
6343 paths))
6344 {
6345 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
6346 for (path = paths.begin(); path != path_end; ++path)
6347 {
6348 const size_t num_path_elements = path->size();
6349 for (size_t e=0; e<num_path_elements; ++e)
6350 {
6351 clang::CXXBasePathElement elem = (*path)[e];
6352
6353 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
6354 if (child_idx == UINT32_MAX)
6355 {
6356 child_indexes.clear();
6357 return 0;
6358 }
6359 else
6360 {
6361 child_indexes.push_back (child_idx);
6362 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
6363 }
6364 }
6365 for (clang::NamedDecl *path_decl : path->Decls)
6366 {
6367 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
6368 if (child_idx == UINT32_MAX)
6369 {
6370 child_indexes.clear();
6371 return 0;
6372 }
6373 else
6374 {
6375 child_indexes.push_back (child_idx);
6376 }
6377 }
6378 }
6379 return child_indexes.size();
6380 }
6381 }
6382
6383 }
6384 break;
6385
6386 case clang::Type::ObjCObject:
6387 case clang::Type::ObjCInterface:
6388 if (GetCompleteType(type))
6389 {
6390 llvm::StringRef name_sref(name);
6391 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6392 assert (objc_class_type);
6393 if (objc_class_type)
6394 {
6395 uint32_t child_idx = 0;
6396 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6397
6398 if (class_interface_decl)
6399 {
6400 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6401 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6402
6403 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6404 {
6405 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6406
6407 if (ivar_decl->getName().equals (name_sref))
6408 {
6409 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6410 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6411 ++child_idx;
6412
6413 child_indexes.push_back (child_idx);
6414 return child_indexes.size();
6415 }
6416 }
6417
6418 if (superclass_interface_decl)
6419 {
6420 // The super class index is always zero for ObjC classes,
6421 // so we push it onto the child indexes in case we find
6422 // an ivar in our superclass...
6423 child_indexes.push_back (0);
6424
Greg Claytona1e5dc82015-08-11 22:53:00 +00006425 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006426 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
6427 omit_empty_base_classes,
6428 child_indexes))
6429 {
6430 // We did find an ivar in a superclass so just
6431 // return the results!
6432 return child_indexes.size();
6433 }
6434
6435 // We didn't find an ivar matching "name" in our
6436 // superclass, pop the superclass zero index that
6437 // we pushed on above.
6438 child_indexes.pop_back();
6439 }
6440 }
6441 }
6442 }
6443 break;
6444
6445 case clang::Type::ObjCObjectPointer:
6446 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006447 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006448 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
6449 omit_empty_base_classes,
6450 child_indexes);
6451 }
6452 break;
6453
6454
6455 case clang::Type::ConstantArray:
6456 {
6457 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6458 // const uint64_t element_count = array->getSize().getLimitedValue();
6459 //
6460 // if (idx < element_count)
6461 // {
6462 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6463 //
6464 // char element_name[32];
6465 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6466 //
6467 // child_name.assign(element_name);
6468 // assert(field_type_info.first % 8 == 0);
6469 // child_byte_size = field_type_info.first / 8;
6470 // child_byte_offset = idx * child_byte_size;
6471 // return array->getElementType().getAsOpaquePtr();
6472 // }
6473 }
6474 break;
6475
6476 // case clang::Type::MemberPointerType:
6477 // {
6478 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6479 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6480 //
6481 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6482 // {
6483 // return GetIndexOfChildWithName (ast,
6484 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6485 // name);
6486 // }
6487 // }
6488 // break;
6489 //
6490 case clang::Type::LValueReference:
6491 case clang::Type::RValueReference:
6492 {
6493 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6494 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006495 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006496
6497 if (pointee_clang_type.IsAggregateType ())
6498 {
6499 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6500 omit_empty_base_classes,
6501 child_indexes);
6502 }
6503 }
6504 break;
6505
6506 case clang::Type::Pointer:
6507 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006508 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006509
6510 if (pointee_clang_type.IsAggregateType ())
6511 {
6512 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6513 omit_empty_base_classes,
6514 child_indexes);
6515 }
6516 }
6517 break;
6518
6519 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006520 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006521 omit_empty_base_classes,
6522 child_indexes);
6523
6524 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006525 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006526 omit_empty_base_classes,
6527 child_indexes);
6528
6529 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006530 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006531 omit_empty_base_classes,
6532 child_indexes);
6533
6534 default:
6535 break;
6536 }
6537 }
6538 return 0;
6539}
6540
6541
6542// Get the index of the child of "clang_type" whose name matches. This function
6543// doesn't descend into the children, but only looks one level deep and name
6544// matches can include base class names.
6545
6546uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006547ClangASTContext::GetIndexOfChildWithName (lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00006548{
6549 if (type && name && name[0])
6550 {
6551 clang::QualType qual_type(GetCanonicalQualType(type));
6552
6553 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6554
6555 switch (type_class)
6556 {
6557 case clang::Type::Record:
6558 if (GetCompleteType(type))
6559 {
6560 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6561 const clang::RecordDecl *record_decl = record_type->getDecl();
6562
6563 assert(record_decl);
6564 uint32_t child_idx = 0;
6565
6566 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6567
6568 if (cxx_record_decl)
6569 {
6570 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6571 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6572 base_class != base_class_end;
6573 ++base_class)
6574 {
6575 // Skip empty base classes
6576 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6577 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
6578 continue;
6579
Greg Claytona1e5dc82015-08-11 22:53:00 +00006580 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006581 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
6582 if (base_class_type_name.compare (name) == 0)
6583 return child_idx;
6584 ++child_idx;
6585 }
6586 }
6587
6588 // Try and find a field that matches NAME
6589 clang::RecordDecl::field_iterator field, field_end;
6590 llvm::StringRef name_sref(name);
6591 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6592 field != field_end;
6593 ++field, ++child_idx)
6594 {
6595 if (field->getName().equals (name_sref))
6596 return child_idx;
6597 }
6598
6599 }
6600 break;
6601
6602 case clang::Type::ObjCObject:
6603 case clang::Type::ObjCInterface:
6604 if (GetCompleteType(type))
6605 {
6606 llvm::StringRef name_sref(name);
6607 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6608 assert (objc_class_type);
6609 if (objc_class_type)
6610 {
6611 uint32_t child_idx = 0;
6612 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6613
6614 if (class_interface_decl)
6615 {
6616 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6617 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6618
6619 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6620 {
6621 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6622
6623 if (ivar_decl->getName().equals (name_sref))
6624 {
6625 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6626 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6627 ++child_idx;
6628
6629 return child_idx;
6630 }
6631 }
6632
6633 if (superclass_interface_decl)
6634 {
6635 if (superclass_interface_decl->getName().equals (name_sref))
6636 return 0;
6637 }
6638 }
6639 }
6640 }
6641 break;
6642
6643 case clang::Type::ObjCObjectPointer:
6644 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006645 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006646 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6647 }
6648 break;
6649
6650 case clang::Type::ConstantArray:
6651 {
6652 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6653 // const uint64_t element_count = array->getSize().getLimitedValue();
6654 //
6655 // if (idx < element_count)
6656 // {
6657 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6658 //
6659 // char element_name[32];
6660 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6661 //
6662 // child_name.assign(element_name);
6663 // assert(field_type_info.first % 8 == 0);
6664 // child_byte_size = field_type_info.first / 8;
6665 // child_byte_offset = idx * child_byte_size;
6666 // return array->getElementType().getAsOpaquePtr();
6667 // }
6668 }
6669 break;
6670
6671 // case clang::Type::MemberPointerType:
6672 // {
6673 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6674 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6675 //
6676 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6677 // {
6678 // return GetIndexOfChildWithName (ast,
6679 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6680 // name);
6681 // }
6682 // }
6683 // break;
6684 //
6685 case clang::Type::LValueReference:
6686 case clang::Type::RValueReference:
6687 {
6688 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006689 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006690
6691 if (pointee_type.IsAggregateType ())
6692 {
6693 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6694 }
6695 }
6696 break;
6697
6698 case clang::Type::Pointer:
6699 {
6700 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006701 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006702
6703 if (pointee_type.IsAggregateType ())
6704 {
6705 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6706 }
6707 else
6708 {
6709 // if (parent_name)
6710 // {
6711 // child_name.assign(1, '*');
6712 // child_name += parent_name;
6713 // }
6714 //
6715 // // We have a pointer to an simple type
6716 // if (idx == 0)
6717 // {
6718 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
6719 // assert(clang_type_info.first % 8 == 0);
6720 // child_byte_size = clang_type_info.first / 8;
6721 // child_byte_offset = 0;
6722 // return pointee_type.getAsOpaquePtr();
6723 // }
6724 }
6725 }
6726 break;
6727
6728 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006729 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006730
6731 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006732 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006733
6734 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006735 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006736
6737 default:
6738 break;
6739 }
6740 }
6741 return UINT32_MAX;
6742}
6743
6744
6745size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006746ClangASTContext::GetNumTemplateArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006747{
6748 if (!type)
6749 return 0;
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006750
6751 clang::QualType qual_type (GetCanonicalQualType(type));
6752 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6753 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00006754 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006755 case clang::Type::Record:
6756 if (GetCompleteType(type))
6757 {
6758 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6759 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00006760 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006761 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6762 if (template_decl)
6763 return template_decl->getTemplateArgs().size();
Greg Claytond8d4a572015-08-11 21:38:15 +00006764 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006765 }
6766 break;
6767
6768 case clang::Type::Typedef:
6769 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
6770
6771 case clang::Type::Elaborated:
6772 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
6773
6774 case clang::Type::Paren:
6775 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
6776
6777 default:
6778 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006779 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006780
Greg Claytond8d4a572015-08-11 21:38:15 +00006781 return 0;
6782}
6783
Greg Claytona1e5dc82015-08-11 22:53:00 +00006784CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006785ClangASTContext::GetTemplateArgument (lldb::opaque_compiler_type_t type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00006786{
6787 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00006788 return CompilerType();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006789
6790 clang::QualType qual_type (GetCanonicalQualType(type));
6791 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6792 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00006793 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006794 case clang::Type::Record:
6795 if (GetCompleteType(type))
6796 {
6797 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6798 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00006799 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006800 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
6801 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
Greg Claytond8d4a572015-08-11 21:38:15 +00006802 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006803 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
6804 switch (template_arg.getKind())
Greg Claytond8d4a572015-08-11 21:38:15 +00006805 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006806 case clang::TemplateArgument::Null:
6807 kind = eTemplateArgumentKindNull;
6808 return CompilerType();
6809
6810 case clang::TemplateArgument::Type:
6811 kind = eTemplateArgumentKindType;
6812 return CompilerType(getASTContext(), template_arg.getAsType());
6813
6814 case clang::TemplateArgument::Declaration:
6815 kind = eTemplateArgumentKindDeclaration;
6816 return CompilerType();
6817
6818 case clang::TemplateArgument::Integral:
6819 kind = eTemplateArgumentKindIntegral;
6820 return CompilerType(getASTContext(), template_arg.getIntegralType());
6821
6822 case clang::TemplateArgument::Template:
6823 kind = eTemplateArgumentKindTemplate;
6824 return CompilerType();
6825
6826 case clang::TemplateArgument::TemplateExpansion:
6827 kind = eTemplateArgumentKindTemplateExpansion;
6828 return CompilerType();
6829
6830 case clang::TemplateArgument::Expression:
6831 kind = eTemplateArgumentKindExpression;
6832 return CompilerType();
6833
6834 case clang::TemplateArgument::Pack:
6835 kind = eTemplateArgumentKindPack;
6836 return CompilerType();
6837
6838 default:
6839 assert (!"Unhandled clang::TemplateArgument::ArgKind");
6840 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006841 }
6842 }
6843 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006844 }
6845 break;
6846
6847 case clang::Type::Typedef:
6848 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
6849
6850 case clang::Type::Elaborated:
6851 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
6852
6853 case clang::Type::Paren:
6854 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
6855
6856 default:
6857 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00006858 }
6859 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006860 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00006861}
6862
Enrico Granatac6bf2e22015-09-23 01:39:46 +00006863CompilerType
6864ClangASTContext::GetTypeForFormatters (void* type)
6865{
6866 if (type)
6867 return RemoveFastQualifiers(CompilerType(this, type));
6868 return CompilerType();
6869}
6870
Greg Claytond8d4a572015-08-11 21:38:15 +00006871static bool
6872IsOperator (const char *name, clang::OverloadedOperatorKind &op_kind)
6873{
6874 if (name == nullptr || name[0] == '\0')
6875 return false;
6876
6877#define OPERATOR_PREFIX "operator"
6878#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
6879
6880 const char *post_op_name = nullptr;
6881
6882 bool no_space = true;
6883
6884 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
6885 return false;
6886
6887 post_op_name = name + OPERATOR_PREFIX_LENGTH;
6888
6889 if (post_op_name[0] == ' ')
6890 {
6891 post_op_name++;
6892 no_space = false;
6893 }
6894
6895#undef OPERATOR_PREFIX
6896#undef OPERATOR_PREFIX_LENGTH
6897
6898 // This is an operator, set the overloaded operator kind to invalid
6899 // in case this is a conversion operator...
6900 op_kind = clang::NUM_OVERLOADED_OPERATORS;
6901
6902 switch (post_op_name[0])
6903 {
6904 default:
6905 if (no_space)
6906 return false;
6907 break;
6908 case 'n':
6909 if (no_space)
6910 return false;
6911 if (strcmp (post_op_name, "new") == 0)
6912 op_kind = clang::OO_New;
6913 else if (strcmp (post_op_name, "new[]") == 0)
6914 op_kind = clang::OO_Array_New;
6915 break;
6916
6917 case 'd':
6918 if (no_space)
6919 return false;
6920 if (strcmp (post_op_name, "delete") == 0)
6921 op_kind = clang::OO_Delete;
6922 else if (strcmp (post_op_name, "delete[]") == 0)
6923 op_kind = clang::OO_Array_Delete;
6924 break;
6925
6926 case '+':
6927 if (post_op_name[1] == '\0')
6928 op_kind = clang::OO_Plus;
6929 else if (post_op_name[2] == '\0')
6930 {
6931 if (post_op_name[1] == '=')
6932 op_kind = clang::OO_PlusEqual;
6933 else if (post_op_name[1] == '+')
6934 op_kind = clang::OO_PlusPlus;
6935 }
6936 break;
6937
6938 case '-':
6939 if (post_op_name[1] == '\0')
6940 op_kind = clang::OO_Minus;
6941 else if (post_op_name[2] == '\0')
6942 {
6943 switch (post_op_name[1])
6944 {
6945 case '=': op_kind = clang::OO_MinusEqual; break;
6946 case '-': op_kind = clang::OO_MinusMinus; break;
6947 case '>': op_kind = clang::OO_Arrow; break;
6948 }
6949 }
6950 else if (post_op_name[3] == '\0')
6951 {
6952 if (post_op_name[2] == '*')
6953 op_kind = clang::OO_ArrowStar; break;
6954 }
6955 break;
6956
6957 case '*':
6958 if (post_op_name[1] == '\0')
6959 op_kind = clang::OO_Star;
6960 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6961 op_kind = clang::OO_StarEqual;
6962 break;
6963
6964 case '/':
6965 if (post_op_name[1] == '\0')
6966 op_kind = clang::OO_Slash;
6967 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6968 op_kind = clang::OO_SlashEqual;
6969 break;
6970
6971 case '%':
6972 if (post_op_name[1] == '\0')
6973 op_kind = clang::OO_Percent;
6974 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6975 op_kind = clang::OO_PercentEqual;
6976 break;
6977
6978
6979 case '^':
6980 if (post_op_name[1] == '\0')
6981 op_kind = clang::OO_Caret;
6982 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
6983 op_kind = clang::OO_CaretEqual;
6984 break;
6985
6986 case '&':
6987 if (post_op_name[1] == '\0')
6988 op_kind = clang::OO_Amp;
6989 else if (post_op_name[2] == '\0')
6990 {
6991 switch (post_op_name[1])
6992 {
6993 case '=': op_kind = clang::OO_AmpEqual; break;
6994 case '&': op_kind = clang::OO_AmpAmp; break;
6995 }
6996 }
6997 break;
6998
6999 case '|':
7000 if (post_op_name[1] == '\0')
7001 op_kind = clang::OO_Pipe;
7002 else if (post_op_name[2] == '\0')
7003 {
7004 switch (post_op_name[1])
7005 {
7006 case '=': op_kind = clang::OO_PipeEqual; break;
7007 case '|': op_kind = clang::OO_PipePipe; break;
7008 }
7009 }
7010 break;
7011
7012 case '~':
7013 if (post_op_name[1] == '\0')
7014 op_kind = clang::OO_Tilde;
7015 break;
7016
7017 case '!':
7018 if (post_op_name[1] == '\0')
7019 op_kind = clang::OO_Exclaim;
7020 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7021 op_kind = clang::OO_ExclaimEqual;
7022 break;
7023
7024 case '=':
7025 if (post_op_name[1] == '\0')
7026 op_kind = clang::OO_Equal;
7027 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7028 op_kind = clang::OO_EqualEqual;
7029 break;
7030
7031 case '<':
7032 if (post_op_name[1] == '\0')
7033 op_kind = clang::OO_Less;
7034 else if (post_op_name[2] == '\0')
7035 {
7036 switch (post_op_name[1])
7037 {
7038 case '<': op_kind = clang::OO_LessLess; break;
7039 case '=': op_kind = clang::OO_LessEqual; break;
7040 }
7041 }
7042 else if (post_op_name[3] == '\0')
7043 {
7044 if (post_op_name[2] == '=')
7045 op_kind = clang::OO_LessLessEqual;
7046 }
7047 break;
7048
7049 case '>':
7050 if (post_op_name[1] == '\0')
7051 op_kind = clang::OO_Greater;
7052 else if (post_op_name[2] == '\0')
7053 {
7054 switch (post_op_name[1])
7055 {
7056 case '>': op_kind = clang::OO_GreaterGreater; break;
7057 case '=': op_kind = clang::OO_GreaterEqual; break;
7058 }
7059 }
7060 else if (post_op_name[1] == '>' &&
7061 post_op_name[2] == '=' &&
7062 post_op_name[3] == '\0')
7063 {
7064 op_kind = clang::OO_GreaterGreaterEqual;
7065 }
7066 break;
7067
7068 case ',':
7069 if (post_op_name[1] == '\0')
7070 op_kind = clang::OO_Comma;
7071 break;
7072
7073 case '(':
7074 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
7075 op_kind = clang::OO_Call;
7076 break;
7077
7078 case '[':
7079 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
7080 op_kind = clang::OO_Subscript;
7081 break;
7082 }
7083
7084 return true;
7085}
7086
7087clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007088ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007089{
7090 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
7091 if (enutype)
7092 return enutype->getDecl();
7093 return NULL;
7094}
7095
7096clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007097ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007098{
7099 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(GetCanonicalQualType(type));
7100 if (record_type)
7101 return record_type->getDecl();
7102 return nullptr;
7103}
7104
7105clang::CXXRecordDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007106ClangASTContext::GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007107{
7108 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
7109}
7110
7111clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007112ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007113{
7114 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(GetCanonicalQualType(type));
7115 if (objc_class_type)
7116 return objc_class_type->getInterface();
7117 return nullptr;
7118}
7119
7120clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007121ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
7122 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007123 AccessType access,
7124 uint32_t bitfield_bit_size)
7125{
7126 if (!type.IsValid() || !field_clang_type.IsValid())
7127 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007128 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007129 if (!ast)
7130 return nullptr;
7131 clang::ASTContext* clang_ast = ast->getASTContext();
7132
7133 clang::FieldDecl *field = nullptr;
7134
7135 clang::Expr *bit_width = nullptr;
7136 if (bitfield_bit_size != 0)
7137 {
7138 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
7139 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
7140 }
7141
7142 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7143 if (record_decl)
7144 {
7145 field = clang::FieldDecl::Create (*clang_ast,
7146 record_decl,
7147 clang::SourceLocation(),
7148 clang::SourceLocation(),
7149 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7150 GetQualType(field_clang_type), // Field type
7151 nullptr, // TInfo *
7152 bit_width, // BitWidth
7153 false, // Mutable
7154 clang::ICIS_NoInit); // HasInit
7155
7156 if (!name)
7157 {
7158 // Determine whether this field corresponds to an anonymous
7159 // struct or union.
7160 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
7161 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
7162 if (!Rec->getDeclName()) {
7163 Rec->setAnonymousStructOrUnion(true);
7164 field->setImplicit();
7165
7166 }
7167 }
7168 }
7169
7170 if (field)
7171 {
7172 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7173
7174 record_decl->addDecl(field);
7175
7176#ifdef LLDB_CONFIGURATION_DEBUG
7177 VerifyDecl(field);
7178#endif
7179 }
7180 }
7181 else
7182 {
7183 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7184
7185 if (class_interface_decl)
7186 {
7187 const bool is_synthesized = false;
7188
7189 field_clang_type.GetCompleteType();
7190
7191 field = clang::ObjCIvarDecl::Create (*clang_ast,
7192 class_interface_decl,
7193 clang::SourceLocation(),
7194 clang::SourceLocation(),
7195 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7196 GetQualType(field_clang_type), // Field type
7197 nullptr, // TypeSourceInfo *
7198 ConvertAccessTypeToObjCIvarAccessControl (access),
7199 bit_width,
7200 is_synthesized);
7201
7202 if (field)
7203 {
7204 class_interface_decl->addDecl(field);
7205
7206#ifdef LLDB_CONFIGURATION_DEBUG
7207 VerifyDecl(field);
7208#endif
7209 }
7210 }
7211 }
7212 return field;
7213}
7214
7215void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007216ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007217{
Greg Claytonf73034f2015-09-08 18:15:05 +00007218 if (!type)
7219 return;
7220
7221 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007222 if (!ast)
7223 return;
7224
7225 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7226
7227 if (!record_decl)
7228 return;
7229
7230 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7231
7232 IndirectFieldVector indirect_fields;
7233 clang::RecordDecl::field_iterator field_pos;
7234 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7235 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7236 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7237 {
7238 if (field_pos->isAnonymousStructOrUnion())
7239 {
7240 clang::QualType field_qual_type = field_pos->getType();
7241
7242 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7243
7244 if (!field_record_type)
7245 continue;
7246
7247 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7248
7249 if (!field_record_decl)
7250 continue;
7251
7252 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7253 di != de;
7254 ++di)
7255 {
7256 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7257 {
7258 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7259 chain[0] = *field_pos;
7260 chain[1] = nested_field_decl;
7261 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7262 record_decl,
7263 clang::SourceLocation(),
7264 nested_field_decl->getIdentifier(),
7265 nested_field_decl->getType(),
7266 chain,
7267 2);
7268
7269 indirect_field->setImplicit();
7270
7271 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7272 nested_field_decl->getAccess()));
7273
7274 indirect_fields.push_back(indirect_field);
7275 }
7276 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7277 {
7278 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
7279 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7280 chain[0] = *field_pos;
7281
7282 int chain_index = 1;
7283 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7284 nce = nested_indirect_field_decl->chain_end();
7285 nci < nce;
7286 ++nci)
7287 {
7288 chain[chain_index] = *nci;
7289 chain_index++;
7290 }
7291
7292 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7293 record_decl,
7294 clang::SourceLocation(),
7295 nested_indirect_field_decl->getIdentifier(),
7296 nested_indirect_field_decl->getType(),
7297 chain,
7298 nested_chain_size + 1);
7299
7300 indirect_field->setImplicit();
7301
7302 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7303 nested_indirect_field_decl->getAccess()));
7304
7305 indirect_fields.push_back(indirect_field);
7306 }
7307 }
7308 }
7309 }
7310
7311 // Check the last field to see if it has an incomplete array type as its
7312 // last member and if it does, the tell the record decl about it
7313 if (last_field_pos != field_end_pos)
7314 {
7315 if (last_field_pos->getType()->isIncompleteArrayType())
7316 record_decl->hasFlexibleArrayMember();
7317 }
7318
7319 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7320 ifi < ife;
7321 ++ifi)
7322 {
7323 record_decl->addDecl(*ifi);
7324 }
7325}
7326
7327void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007328ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007329{
Greg Claytonf73034f2015-09-08 18:15:05 +00007330 if (type)
7331 {
7332 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7333 if (ast)
7334 {
7335 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007336
Greg Claytonf73034f2015-09-08 18:15:05 +00007337 if (!record_decl)
7338 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00007339
Greg Claytonf73034f2015-09-08 18:15:05 +00007340 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*ast->getASTContext()));
7341 }
7342 }
Greg Claytond8d4a572015-08-11 21:38:15 +00007343}
7344
7345clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007346ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7347 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007348 AccessType access)
7349{
7350 clang::VarDecl *var_decl = nullptr;
7351
7352 if (!type.IsValid() || !var_type.IsValid())
7353 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007354 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007355 if (!ast)
7356 return nullptr;
7357
7358 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7359 if (record_decl)
7360 {
7361 var_decl = clang::VarDecl::Create (*ast->getASTContext(), // ASTContext &
7362 record_decl, // DeclContext *
7363 clang::SourceLocation(), // clang::SourceLocation StartLoc
7364 clang::SourceLocation(), // clang::SourceLocation IdLoc
7365 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7366 GetQualType(var_type), // Variable clang::QualType
7367 nullptr, // TypeSourceInfo *
7368 clang::SC_Static); // StorageClass
7369 if (var_decl)
7370 {
7371 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7372 record_decl->addDecl(var_decl);
7373
7374#ifdef LLDB_CONFIGURATION_DEBUG
7375 VerifyDecl(var_decl);
7376#endif
7377 }
7378 }
7379 return var_decl;
7380}
7381
7382
7383clang::CXXMethodDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007384ClangASTContext::AddMethodToCXXRecordType (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007385 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007386 lldb::AccessType access,
7387 bool is_virtual,
7388 bool is_static,
7389 bool is_inline,
7390 bool is_explicit,
7391 bool is_attr_used,
7392 bool is_artificial)
7393{
7394 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7395 return nullptr;
7396
7397 clang::QualType record_qual_type(GetCanonicalQualType(type));
7398
7399 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7400
7401 if (cxx_record_decl == nullptr)
7402 return nullptr;
7403
7404 clang::QualType method_qual_type (GetQualType(method_clang_type));
7405
7406 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7407
7408 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7409
7410 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7411
7412 if (function_type == nullptr)
7413 return nullptr;
7414
7415 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7416
7417 if (!method_function_prototype)
7418 return nullptr;
7419
7420 unsigned int num_params = method_function_prototype->getNumParams();
7421
7422 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7423 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7424
7425 if (is_artificial)
7426 return nullptr; // skip everything artificial
7427
7428 if (name[0] == '~')
7429 {
7430 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7431 cxx_record_decl,
7432 clang::SourceLocation(),
7433 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7434 method_qual_type,
7435 nullptr,
7436 is_inline,
7437 is_artificial);
7438 cxx_method_decl = cxx_dtor_decl;
7439 }
7440 else if (decl_name == cxx_record_decl->getDeclName())
7441 {
7442 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
7443 cxx_record_decl,
7444 clang::SourceLocation(),
7445 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7446 method_qual_type,
7447 nullptr, // TypeSourceInfo *
7448 is_explicit,
7449 is_inline,
7450 is_artificial,
7451 false /*is_constexpr*/);
7452 cxx_method_decl = cxx_ctor_decl;
7453 }
7454 else
7455 {
7456 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7457 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7458
7459 if (IsOperator (name, op_kind))
7460 {
7461 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
7462 {
7463 // Check the number of operator parameters. Sometimes we have
7464 // seen bad DWARF that doesn't correctly describe operators and
7465 // if we try to create a method and add it to the class, clang
7466 // will assert and crash, so we need to make sure things are
7467 // acceptable.
7468 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
7469 return nullptr;
7470 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7471 cxx_record_decl,
7472 clang::SourceLocation(),
7473 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
7474 method_qual_type,
7475 nullptr, // TypeSourceInfo *
7476 SC,
7477 is_inline,
7478 false /*is_constexpr*/,
7479 clang::SourceLocation());
7480 }
7481 else if (num_params == 0)
7482 {
7483 // Conversion operators don't take params...
7484 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
7485 cxx_record_decl,
7486 clang::SourceLocation(),
7487 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
7488 method_qual_type,
7489 nullptr, // TypeSourceInfo *
7490 is_inline,
7491 is_explicit,
7492 false /*is_constexpr*/,
7493 clang::SourceLocation());
7494 }
7495 }
7496
7497 if (cxx_method_decl == nullptr)
7498 {
7499 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7500 cxx_record_decl,
7501 clang::SourceLocation(),
7502 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
7503 method_qual_type,
7504 nullptr, // TypeSourceInfo *
7505 SC,
7506 is_inline,
7507 false /*is_constexpr*/,
7508 clang::SourceLocation());
7509 }
7510 }
7511
7512 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
7513
7514 cxx_method_decl->setAccess (access_specifier);
7515 cxx_method_decl->setVirtualAsWritten (is_virtual);
7516
7517 if (is_attr_used)
7518 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
7519
7520 // Populate the method decl with parameter decls
7521
7522 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7523
7524 for (unsigned param_index = 0;
7525 param_index < num_params;
7526 ++param_index)
7527 {
7528 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
7529 cxx_method_decl,
7530 clang::SourceLocation(),
7531 clang::SourceLocation(),
7532 nullptr, // anonymous
7533 method_function_prototype->getParamType(param_index),
7534 nullptr,
7535 clang::SC_None,
7536 nullptr));
7537 }
7538
7539 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
7540
7541 cxx_record_decl->addDecl (cxx_method_decl);
7542
7543 // Sometimes the debug info will mention a constructor (default/copy/move),
7544 // destructor, or assignment operator (copy/move) but there won't be any
7545 // version of this in the code. So we check if the function was artificially
7546 // generated and if it is trivial and this lets the compiler/backend know
7547 // that it can inline the IR for these when it needs to and we can avoid a
7548 // "missing function" error when running expressions.
7549
7550 if (is_artificial)
7551 {
7552 if (cxx_ctor_decl &&
7553 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
7554 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
7555 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
7556 {
7557 cxx_ctor_decl->setDefaulted();
7558 cxx_ctor_decl->setTrivial(true);
7559 }
7560 else if (cxx_dtor_decl)
7561 {
7562 if (cxx_record_decl->hasTrivialDestructor())
7563 {
7564 cxx_dtor_decl->setDefaulted();
7565 cxx_dtor_decl->setTrivial(true);
7566 }
7567 }
7568 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
7569 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
7570 {
7571 cxx_method_decl->setDefaulted();
7572 cxx_method_decl->setTrivial(true);
7573 }
7574 }
7575
7576#ifdef LLDB_CONFIGURATION_DEBUG
7577 VerifyDecl(cxx_method_decl);
7578#endif
7579
7580 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
7581 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
7582 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
7583 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
7584 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
7585 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
7586 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
7587 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
7588 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
7589 return cxx_method_decl;
7590}
7591
7592
7593#pragma mark C++ Base Classes
7594
7595clang::CXXBaseSpecifier *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007596ClangASTContext::CreateBaseClassSpecifier (lldb::opaque_compiler_type_t type, AccessType access, bool is_virtual, bool base_of_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007597{
7598 if (type)
7599 return new clang::CXXBaseSpecifier (clang::SourceRange(),
7600 is_virtual,
7601 base_of_class,
7602 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
7603 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
7604 clang::SourceLocation());
7605 return nullptr;
7606}
7607
7608void
7609ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
7610{
7611 for (unsigned i=0; i<num_base_classes; ++i)
7612 {
7613 delete base_classes[i];
7614 base_classes[i] = nullptr;
7615 }
7616}
7617
7618bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007619ClangASTContext::SetBaseClassesForClassType (lldb::opaque_compiler_type_t type, clang::CXXBaseSpecifier const * const *base_classes,
Greg Claytond8d4a572015-08-11 21:38:15 +00007620 unsigned num_base_classes)
7621{
7622 if (type)
7623 {
7624 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
7625 if (cxx_record_decl)
7626 {
7627 cxx_record_decl->setBases(base_classes, num_base_classes);
7628 return true;
7629 }
7630 }
7631 return false;
7632}
7633
7634bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007635ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007636{
Greg Claytonf73034f2015-09-08 18:15:05 +00007637 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007638 if (!ast)
7639 return false;
7640 clang::ASTContext* clang_ast = ast->getASTContext();
7641
7642 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
7643 {
7644 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7645 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
7646 if (class_interface_decl && super_interface_decl)
7647 {
7648 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
7649 return true;
7650 }
7651 }
7652 return false;
7653}
7654
7655bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007656ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007657 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007658 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007659 clang::ObjCIvarDecl *ivar_decl,
7660 const char *property_setter_name,
7661 const char *property_getter_name,
7662 uint32_t property_attributes,
7663 ClangASTMetadata *metadata)
7664{
7665 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
7666 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00007667 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007668 if (!ast)
7669 return false;
7670 clang::ASTContext* clang_ast = ast->getASTContext();
7671
7672 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7673
7674 if (class_interface_decl)
7675 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007676 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00007677
7678 if (property_clang_type.IsValid())
7679 property_clang_type_to_access = property_clang_type;
7680 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007681 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007682
7683 if (class_interface_decl && property_clang_type_to_access.IsValid())
7684 {
7685 clang::TypeSourceInfo *prop_type_source;
7686 if (ivar_decl)
7687 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
7688 else
7689 prop_type_source = clang_ast->getTrivialTypeSourceInfo (GetQualType(property_clang_type));
7690
7691 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create (*clang_ast,
7692 class_interface_decl,
7693 clang::SourceLocation(), // Source Location
7694 &clang_ast->Idents.get(property_name),
7695 clang::SourceLocation(), //Source Location for AT
7696 clang::SourceLocation(), //Source location for (
7697 ivar_decl ? ivar_decl->getType() : ClangASTContext::GetQualType(property_clang_type),
7698 prop_type_source);
7699
7700 if (property_decl)
7701 {
7702 if (metadata)
7703 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
7704
7705 class_interface_decl->addDecl (property_decl);
7706
7707 clang::Selector setter_sel, getter_sel;
7708
7709 if (property_setter_name != nullptr)
7710 {
7711 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
7712 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
7713 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7714 }
7715 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
7716 {
7717 std::string setter_sel_string("set");
7718 setter_sel_string.push_back(::toupper(property_name[0]));
7719 setter_sel_string.append(&property_name[1]);
7720 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
7721 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7722 }
7723 property_decl->setSetterName(setter_sel);
7724 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
7725
7726 if (property_getter_name != nullptr)
7727 {
7728 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
7729 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7730 }
7731 else
7732 {
7733 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
7734 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7735 }
7736 property_decl->setGetterName(getter_sel);
7737 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
7738
7739 if (ivar_decl)
7740 property_decl->setPropertyIvarDecl (ivar_decl);
7741
7742 if (property_attributes & DW_APPLE_PROPERTY_readonly)
7743 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
7744 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
7745 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
7746 if (property_attributes & DW_APPLE_PROPERTY_assign)
7747 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
7748 if (property_attributes & DW_APPLE_PROPERTY_retain)
7749 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
7750 if (property_attributes & DW_APPLE_PROPERTY_copy)
7751 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
7752 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
7753 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
7754
7755 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
7756 {
7757 const bool isInstance = true;
7758 const bool isVariadic = false;
7759 const bool isSynthesized = false;
7760 const bool isImplicitlyDeclared = true;
7761 const bool isDefined = false;
7762 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7763 const bool HasRelatedResultType = false;
7764
7765 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create (*clang_ast,
7766 clang::SourceLocation(),
7767 clang::SourceLocation(),
7768 getter_sel,
7769 GetQualType(property_clang_type_to_access),
7770 nullptr,
7771 class_interface_decl,
7772 isInstance,
7773 isVariadic,
7774 isSynthesized,
7775 isImplicitlyDeclared,
7776 isDefined,
7777 impControl,
7778 HasRelatedResultType);
7779
7780 if (getter && metadata)
7781 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
7782
7783 if (getter)
7784 {
7785 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
7786
7787 class_interface_decl->addDecl(getter);
7788 }
7789 }
7790
7791 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
7792 {
7793 clang::QualType result_type = clang_ast->VoidTy;
7794
7795 const bool isInstance = true;
7796 const bool isVariadic = false;
7797 const bool isSynthesized = false;
7798 const bool isImplicitlyDeclared = true;
7799 const bool isDefined = false;
7800 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
7801 const bool HasRelatedResultType = false;
7802
7803 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
7804 clang::SourceLocation(),
7805 clang::SourceLocation(),
7806 setter_sel,
7807 result_type,
7808 nullptr,
7809 class_interface_decl,
7810 isInstance,
7811 isVariadic,
7812 isSynthesized,
7813 isImplicitlyDeclared,
7814 isDefined,
7815 impControl,
7816 HasRelatedResultType);
7817
7818 if (setter && metadata)
7819 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
7820
7821 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
7822
7823 params.push_back (clang::ParmVarDecl::Create (*clang_ast,
7824 setter,
7825 clang::SourceLocation(),
7826 clang::SourceLocation(),
7827 nullptr, // anonymous
7828 GetQualType(property_clang_type_to_access),
7829 nullptr,
7830 clang::SC_Auto,
7831 nullptr));
7832
7833 if (setter)
7834 {
7835 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7836
7837 class_interface_decl->addDecl(setter);
7838 }
7839 }
7840
7841 return true;
7842 }
7843 }
7844 }
7845 return false;
7846}
7847
7848bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007849ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00007850{
7851 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7852 if (class_interface_decl)
7853 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
7854 return false;
7855}
7856
7857
7858clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007859ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007860 const char *name, // the full symbol name as seen in the symbol table (lldb::opaque_compiler_type_t type, "-[NString stringWithCString:]")
Greg Claytona1e5dc82015-08-11 22:53:00 +00007861 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007862 lldb::AccessType access,
7863 bool is_artificial)
7864{
7865 if (!type || !method_clang_type.IsValid())
7866 return nullptr;
7867
7868 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
7869
7870 if (class_interface_decl == nullptr)
7871 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007872 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7873 if (lldb_ast == nullptr)
7874 return nullptr;
7875 clang::ASTContext *ast = lldb_ast->getASTContext();
7876
Greg Claytond8d4a572015-08-11 21:38:15 +00007877 const char *selector_start = ::strchr (name, ' ');
7878 if (selector_start == nullptr)
7879 return nullptr;
7880
7881 selector_start++;
7882 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
7883
7884 size_t len = 0;
7885 const char *start;
7886 //printf ("name = '%s'\n", name);
7887
7888 unsigned num_selectors_with_args = 0;
7889 for (start = selector_start;
7890 start && *start != '\0' && *start != ']';
7891 start += len)
7892 {
7893 len = ::strcspn(start, ":]");
7894 bool has_arg = (start[len] == ':');
7895 if (has_arg)
7896 ++num_selectors_with_args;
7897 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
7898 if (has_arg)
7899 len += 1;
7900 }
7901
7902
7903 if (selector_idents.size() == 0)
7904 return nullptr;
7905
7906 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
7907 selector_idents.data());
7908
7909 clang::QualType method_qual_type (GetQualType(method_clang_type));
7910
7911 // Populate the method decl with parameter decls
7912 const clang::Type *method_type(method_qual_type.getTypePtr());
7913
7914 if (method_type == nullptr)
7915 return nullptr;
7916
7917 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
7918
7919 if (!method_function_prototype)
7920 return nullptr;
7921
7922
7923 bool is_variadic = false;
7924 bool is_synthesized = false;
7925 bool is_defined = false;
7926 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
7927
7928 const unsigned num_args = method_function_prototype->getNumParams();
7929
7930 if (num_args != num_selectors_with_args)
7931 return nullptr; // some debug information is corrupt. We are not going to deal with it.
7932
7933 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create (*ast,
7934 clang::SourceLocation(), // beginLoc,
7935 clang::SourceLocation(), // endLoc,
7936 method_selector,
7937 method_function_prototype->getReturnType(),
7938 nullptr, // TypeSourceInfo *ResultTInfo,
7939 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(GetQualType(type)),
7940 name[0] == '-',
7941 is_variadic,
7942 is_synthesized,
7943 true, // is_implicitly_declared; we force this to true because we don't have source locations
7944 is_defined,
7945 imp_control,
7946 false /*has_related_result_type*/);
7947
7948
7949 if (objc_method_decl == nullptr)
7950 return nullptr;
7951
7952 if (num_args > 0)
7953 {
7954 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7955
7956 for (unsigned param_index = 0; param_index < num_args; ++param_index)
7957 {
7958 params.push_back (clang::ParmVarDecl::Create (*ast,
7959 objc_method_decl,
7960 clang::SourceLocation(),
7961 clang::SourceLocation(),
7962 nullptr, // anonymous
7963 method_function_prototype->getParamType(param_index),
7964 nullptr,
7965 clang::SC_Auto,
7966 nullptr));
7967 }
7968
7969 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
7970 }
7971
7972 class_interface_decl->addDecl (objc_method_decl);
7973
7974#ifdef LLDB_CONFIGURATION_DEBUG
7975 VerifyDecl(objc_method_decl);
7976#endif
7977
7978 return objc_method_decl;
7979}
7980
7981bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007982ClangASTContext::SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool has_extern)
Greg Claytond8d4a572015-08-11 21:38:15 +00007983{
7984 if (!type)
7985 return false;
7986
7987 clang::QualType qual_type (GetCanonicalQualType(type));
7988
7989 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7990 switch (type_class)
7991 {
7992 case clang::Type::Record:
7993 {
7994 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7995 if (cxx_record_decl)
7996 {
7997 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
7998 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
7999 return true;
8000 }
8001 }
8002 break;
8003
8004 case clang::Type::Enum:
8005 {
8006 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8007 if (enum_decl)
8008 {
8009 enum_decl->setHasExternalLexicalStorage (has_extern);
8010 enum_decl->setHasExternalVisibleStorage (has_extern);
8011 return true;
8012 }
8013 }
8014 break;
8015
8016 case clang::Type::ObjCObject:
8017 case clang::Type::ObjCInterface:
8018 {
8019 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8020 assert (objc_class_type);
8021 if (objc_class_type)
8022 {
8023 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8024
8025 if (class_interface_decl)
8026 {
8027 class_interface_decl->setHasExternalLexicalStorage (has_extern);
8028 class_interface_decl->setHasExternalVisibleStorage (has_extern);
8029 return true;
8030 }
8031 }
8032 }
8033 break;
8034
8035 case clang::Type::Typedef:
8036 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
8037
8038 case clang::Type::Elaborated:
8039 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
8040
8041 case clang::Type::Paren:
8042 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
8043
8044 default:
8045 break;
8046 }
8047 return false;
8048}
8049
8050
8051#pragma mark TagDecl
8052
8053bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008054ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008055{
8056 if (type)
8057 {
8058
8059 clang::QualType qual_type (GetQualType(type));
8060 const clang::Type *t = qual_type.getTypePtr();
8061 if (t)
8062 {
8063 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(t);
8064 if (tag_type)
8065 {
8066 clang::TagDecl *tag_decl = tag_type->getDecl();
8067 if (tag_decl)
8068 {
8069 tag_decl->startDefinition();
8070 return true;
8071 }
8072 }
8073
8074 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(t);
8075 if (object_type)
8076 {
8077 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
8078 if (interface_decl)
8079 {
8080 interface_decl->startDefinition();
8081 return true;
8082 }
8083 }
8084 }
8085 }
8086 return false;
8087}
8088
8089bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008090ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008091{
8092 if (type)
8093 {
8094 clang::QualType qual_type (GetQualType(type));
8095 if (qual_type.isNull())
8096 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00008097 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8098 if (lldb_ast == nullptr)
8099 return false;
8100 clang::ASTContext *ast = lldb_ast->getASTContext();
8101
Greg Claytond8d4a572015-08-11 21:38:15 +00008102 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8103
8104 if (cxx_record_decl)
8105 {
8106 cxx_record_decl->completeDefinition();
8107
8108 return true;
8109 }
8110
8111 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(qual_type.getTypePtr());
8112
8113 if (enutype)
8114 {
8115 clang::EnumDecl *enum_decl = enutype->getDecl();
8116
8117 if (enum_decl)
8118 {
8119 /// TODO This really needs to be fixed.
8120
8121 unsigned NumPositiveBits = 1;
8122 unsigned NumNegativeBits = 0;
8123
8124 clang::QualType promotion_qual_type;
8125 // If the enum integer type is less than an integer in bit width,
8126 // then we must promote it to an integer size.
8127 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
8128 {
8129 if (enum_decl->getIntegerType()->isSignedIntegerType())
8130 promotion_qual_type = ast->IntTy;
8131 else
8132 promotion_qual_type = ast->UnsignedIntTy;
8133 }
8134 else
8135 promotion_qual_type = enum_decl->getIntegerType();
8136
8137 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
8138 return true;
8139 }
8140 }
8141 }
8142 return false;
8143}
8144
Greg Claytond8d4a572015-08-11 21:38:15 +00008145bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008146ClangASTContext::AddEnumerationValueToEnumerationType (lldb::opaque_compiler_type_t type,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008147 const CompilerType &enumerator_clang_type,
8148 const Declaration &decl,
8149 const char *name,
8150 int64_t enum_value,
8151 uint32_t enum_value_bit_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008152{
8153 if (type && enumerator_clang_type.IsValid() && name && name[0])
8154 {
8155 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8156
8157 bool is_signed = false;
8158 enumerator_clang_type.IsIntegerType (is_signed);
8159 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8160 if (clang_type)
8161 {
8162 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8163
8164 if (enutype)
8165 {
8166 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
8167 enum_llvm_apsint = enum_value;
8168 clang::EnumConstantDecl *enumerator_decl =
8169 clang::EnumConstantDecl::Create (*getASTContext(),
8170 enutype->getDecl(),
8171 clang::SourceLocation(),
8172 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
8173 GetQualType(enumerator_clang_type),
8174 nullptr,
8175 enum_llvm_apsint);
8176
8177 if (enumerator_decl)
8178 {
8179 enutype->getDecl()->addDecl(enumerator_decl);
8180
8181#ifdef LLDB_CONFIGURATION_DEBUG
8182 VerifyDecl(enumerator_decl);
8183#endif
8184
8185 return true;
8186 }
8187 }
8188 }
8189 }
8190 return false;
8191}
8192
Greg Claytona1e5dc82015-08-11 22:53:00 +00008193CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008194ClangASTContext::GetEnumerationIntegerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008195{
8196 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8197 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8198 if (clang_type)
8199 {
8200 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8201 if (enutype)
8202 {
8203 clang::EnumDecl *enum_decl = enutype->getDecl();
8204 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008205 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008206 }
8207 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008208 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008209}
8210
Greg Claytona1e5dc82015-08-11 22:53:00 +00008211CompilerType
8212ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008213{
8214 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8215 {
Greg Claytonf73034f2015-09-08 18:15:05 +00008216 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008217 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008218 return CompilerType();
8219 return CompilerType (ast->getASTContext(),
Greg Claytond8d4a572015-08-11 21:38:15 +00008220 ast->getASTContext()->getMemberPointerType (GetQualType(pointee_type),
8221 GetQualType(type).getTypePtr()));
8222 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008223 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008224}
8225
8226
8227size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008228ClangASTContext::ConvertStringToFloatValue (lldb::opaque_compiler_type_t type, const char *s, uint8_t *dst, size_t dst_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008229{
8230 if (type)
8231 {
8232 clang::QualType qual_type (GetCanonicalQualType(type));
8233 uint32_t count = 0;
8234 bool is_complex = false;
8235 if (IsFloatingPointType (type, count, is_complex))
8236 {
8237 // TODO: handle complex and vector types
8238 if (count != 1)
8239 return false;
8240
8241 llvm::StringRef s_sref(s);
8242 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8243
8244 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8245 const uint64_t byte_size = bit_size / 8;
8246 if (dst_size >= byte_size)
8247 {
8248 if (bit_size == sizeof(float)*8)
8249 {
8250 float float32 = ap_float.convertToFloat();
8251 ::memcpy (dst, &float32, byte_size);
8252 return byte_size;
8253 }
8254 else if (bit_size >= 64)
8255 {
8256 llvm::APInt ap_int(ap_float.bitcastToAPInt());
8257 ::memcpy (dst, ap_int.getRawData(), byte_size);
8258 return byte_size;
8259 }
8260 }
8261 }
8262 }
8263 return 0;
8264}
8265
8266
8267
8268//----------------------------------------------------------------------
8269// Dumping types
8270//----------------------------------------------------------------------
8271#define DEPTH_INCREMENT 2
8272
8273void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008274ClangASTContext::DumpValue (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00008275 Stream *s,
8276 lldb::Format format,
8277 const lldb_private::DataExtractor &data,
8278 lldb::offset_t data_byte_offset,
8279 size_t data_byte_size,
8280 uint32_t bitfield_bit_size,
8281 uint32_t bitfield_bit_offset,
8282 bool show_types,
8283 bool show_summary,
8284 bool verbose,
8285 uint32_t depth)
8286{
8287 if (!type)
8288 return;
8289
8290 clang::QualType qual_type(GetQualType(type));
8291 switch (qual_type->getTypeClass())
8292 {
8293 case clang::Type::Record:
8294 if (GetCompleteType(type))
8295 {
8296 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8297 const clang::RecordDecl *record_decl = record_type->getDecl();
8298 assert(record_decl);
8299 uint32_t field_bit_offset = 0;
8300 uint32_t field_byte_offset = 0;
8301 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8302 uint32_t child_idx = 0;
8303
8304 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8305 if (cxx_record_decl)
8306 {
8307 // We might have base classes to print out first
8308 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8309 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8310 base_class != base_class_end;
8311 ++base_class)
8312 {
8313 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8314
8315 // Skip empty base classes
8316 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8317 continue;
8318
8319 if (base_class->isVirtual())
8320 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8321 else
8322 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8323 field_byte_offset = field_bit_offset / 8;
8324 assert (field_bit_offset % 8 == 0);
8325 if (child_idx == 0)
8326 s->PutChar('{');
8327 else
8328 s->PutChar(',');
8329
8330 clang::QualType base_class_qual_type = base_class->getType();
8331 std::string base_class_type_name(base_class_qual_type.getAsString());
8332
8333 // Indent and print the base class type name
8334 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8335
8336 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8337
8338 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008339 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008340 base_clang_type.DumpValue (exe_ctx,
8341 s, // Stream to dump to
8342 base_clang_type.GetFormat(), // The format with which to display the member
8343 data, // Data buffer containing all bytes for this type
8344 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8345 base_class_type_info.Width / 8, // Size of this type in bytes
8346 0, // Bitfield bit size
8347 0, // Bitfield bit offset
8348 show_types, // Boolean indicating if we should show the variable types
8349 show_summary, // Boolean indicating if we should show a summary for the current type
8350 verbose, // Verbose output?
8351 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8352
8353 ++child_idx;
8354 }
8355 }
8356 uint32_t field_idx = 0;
8357 clang::RecordDecl::field_iterator field, field_end;
8358 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8359 {
8360 // Print the starting squiggly bracket (if this is the
8361 // first member) or comma (for member 2 and beyond) for
8362 // the struct/union/class member.
8363 if (child_idx == 0)
8364 s->PutChar('{');
8365 else
8366 s->PutChar(',');
8367
8368 // Indent
8369 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8370
8371 clang::QualType field_type = field->getType();
8372 // Print the member type if requested
8373 // Figure out the type byte size (field_type_info.first) and
8374 // alignment (field_type_info.second) from the AST context.
8375 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8376 assert(field_idx < record_layout.getFieldCount());
8377 // Figure out the field offset within the current struct/union/class type
8378 field_bit_offset = record_layout.getFieldOffset (field_idx);
8379 field_byte_offset = field_bit_offset / 8;
8380 uint32_t field_bitfield_bit_size = 0;
8381 uint32_t field_bitfield_bit_offset = 0;
8382 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8383 field_bitfield_bit_offset = field_bit_offset % 8;
8384
8385 if (show_types)
8386 {
8387 std::string field_type_name(field_type.getAsString());
8388 if (field_bitfield_bit_size > 0)
8389 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
8390 else
8391 s->Printf("(%s) ", field_type_name.c_str());
8392 }
8393 // Print the member name and equal sign
8394 s->Printf("%s = ", field->getNameAsString().c_str());
8395
8396
8397 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008398 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008399 field_clang_type.DumpValue (exe_ctx,
8400 s, // Stream to dump to
8401 field_clang_type.GetFormat(), // The format with which to display the member
8402 data, // Data buffer containing all bytes for this type
8403 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8404 field_type_info.Width / 8, // Size of this type in bytes
8405 field_bitfield_bit_size, // Bitfield bit size
8406 field_bitfield_bit_offset, // Bitfield bit offset
8407 show_types, // Boolean indicating if we should show the variable types
8408 show_summary, // Boolean indicating if we should show a summary for the current type
8409 verbose, // Verbose output?
8410 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8411 }
8412
8413 // Indent the trailing squiggly bracket
8414 if (child_idx > 0)
8415 s->Printf("\n%*s}", depth, "");
8416 }
8417 return;
8418
8419 case clang::Type::Enum:
8420 if (GetCompleteType(type))
8421 {
8422 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8423 const clang::EnumDecl *enum_decl = enutype->getDecl();
8424 assert(enum_decl);
8425 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8426 lldb::offset_t offset = data_byte_offset;
8427 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
8428 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8429 {
8430 if (enum_pos->getInitVal() == enum_value)
8431 {
8432 s->Printf("%s", enum_pos->getNameAsString().c_str());
8433 return;
8434 }
8435 }
8436 // If we have gotten here we didn't get find the enumerator in the
8437 // enum decl, so just print the integer.
8438 s->Printf("%" PRIi64, enum_value);
8439 }
8440 return;
8441
8442 case clang::Type::ConstantArray:
8443 {
8444 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
8445 bool is_array_of_characters = false;
8446 clang::QualType element_qual_type = array->getElementType();
8447
8448 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
8449 if (canonical_type)
8450 is_array_of_characters = canonical_type->isCharType();
8451
8452 const uint64_t element_count = array->getSize().getLimitedValue();
8453
8454 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
8455
8456 uint32_t element_idx = 0;
8457 uint32_t element_offset = 0;
8458 uint64_t element_byte_size = field_type_info.Width / 8;
8459 uint32_t element_stride = element_byte_size;
8460
8461 if (is_array_of_characters)
8462 {
8463 s->PutChar('"');
8464 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8465 s->PutChar('"');
8466 return;
8467 }
8468 else
8469 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008470 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008471 lldb::Format element_format = element_clang_type.GetFormat();
8472
8473 for (element_idx = 0; element_idx < element_count; ++element_idx)
8474 {
8475 // Print the starting squiggly bracket (if this is the
8476 // first member) or comman (for member 2 and beyong) for
8477 // the struct/union/class member.
8478 if (element_idx == 0)
8479 s->PutChar('{');
8480 else
8481 s->PutChar(',');
8482
8483 // Indent and print the index
8484 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
8485
8486 // Figure out the field offset within the current struct/union/class type
8487 element_offset = element_idx * element_stride;
8488
8489 // Dump the value of the member
8490 element_clang_type.DumpValue (exe_ctx,
8491 s, // Stream to dump to
8492 element_format, // The format with which to display the element
8493 data, // Data buffer containing all bytes for this type
8494 data_byte_offset + element_offset,// Offset into "data" where to grab value from
8495 element_byte_size, // Size of this type in bytes
8496 0, // Bitfield bit size
8497 0, // Bitfield bit offset
8498 show_types, // Boolean indicating if we should show the variable types
8499 show_summary, // Boolean indicating if we should show a summary for the current type
8500 verbose, // Verbose output?
8501 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8502 }
8503
8504 // Indent the trailing squiggly bracket
8505 if (element_idx > 0)
8506 s->Printf("\n%*s}", depth, "");
8507 }
8508 }
8509 return;
8510
8511 case clang::Type::Typedef:
8512 {
8513 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
8514
Greg Claytona1e5dc82015-08-11 22:53:00 +00008515 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008516 lldb::Format typedef_format = typedef_clang_type.GetFormat();
8517 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8518 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8519
8520 return typedef_clang_type.DumpValue (exe_ctx,
8521 s, // Stream to dump to
8522 typedef_format, // The format with which to display the element
8523 data, // Data buffer containing all bytes for this type
8524 data_byte_offset, // Offset into "data" where to grab value from
8525 typedef_byte_size, // Size of this type in bytes
8526 bitfield_bit_size, // Bitfield bit size
8527 bitfield_bit_offset,// Bitfield bit offset
8528 show_types, // Boolean indicating if we should show the variable types
8529 show_summary, // Boolean indicating if we should show a summary for the current type
8530 verbose, // Verbose output?
8531 depth); // Scope depth for any types that have children
8532 }
8533 break;
8534
8535 case clang::Type::Elaborated:
8536 {
8537 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008538 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008539 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
8540 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
8541 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
8542
8543 return elaborated_clang_type.DumpValue (exe_ctx,
8544 s, // Stream to dump to
8545 elaborated_format, // The format with which to display the element
8546 data, // Data buffer containing all bytes for this type
8547 data_byte_offset, // Offset into "data" where to grab value from
8548 elaborated_byte_size, // Size of this type in bytes
8549 bitfield_bit_size, // Bitfield bit size
8550 bitfield_bit_offset,// Bitfield bit offset
8551 show_types, // Boolean indicating if we should show the variable types
8552 show_summary, // Boolean indicating if we should show a summary for the current type
8553 verbose, // Verbose output?
8554 depth); // Scope depth for any types that have children
8555 }
8556 break;
8557
8558 case clang::Type::Paren:
8559 {
8560 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008561 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008562
8563 lldb::Format desugar_format = desugar_clang_type.GetFormat();
8564 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
8565 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
8566
8567 return desugar_clang_type.DumpValue (exe_ctx,
8568 s, // Stream to dump to
8569 desugar_format, // The format with which to display the element
8570 data, // Data buffer containing all bytes for this type
8571 data_byte_offset, // Offset into "data" where to grab value from
8572 desugar_byte_size, // Size of this type in bytes
8573 bitfield_bit_size, // Bitfield bit size
8574 bitfield_bit_offset,// Bitfield bit offset
8575 show_types, // Boolean indicating if we should show the variable types
8576 show_summary, // Boolean indicating if we should show a summary for the current type
8577 verbose, // Verbose output?
8578 depth); // Scope depth for any types that have children
8579 }
8580 break;
8581
8582 default:
8583 // We are down to a scalar type that we just need to display.
8584 data.Dump(s,
8585 data_byte_offset,
8586 format,
8587 data_byte_size,
8588 1,
8589 UINT32_MAX,
8590 LLDB_INVALID_ADDRESS,
8591 bitfield_bit_size,
8592 bitfield_bit_offset);
8593
8594 if (show_summary)
8595 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
8596 break;
8597 }
8598}
8599
8600
8601
8602
8603bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008604ClangASTContext::DumpTypeValue (lldb::opaque_compiler_type_t type, Stream *s,
Greg Claytond8d4a572015-08-11 21:38:15 +00008605 lldb::Format format,
8606 const lldb_private::DataExtractor &data,
8607 lldb::offset_t byte_offset,
8608 size_t byte_size,
8609 uint32_t bitfield_bit_size,
8610 uint32_t bitfield_bit_offset,
8611 ExecutionContextScope *exe_scope)
8612{
8613 if (!type)
8614 return false;
8615 if (IsAggregateType(type))
8616 {
8617 return false;
8618 }
8619 else
8620 {
8621 clang::QualType qual_type(GetQualType(type));
8622
8623 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8624 switch (type_class)
8625 {
8626 case clang::Type::Typedef:
8627 {
8628 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008629 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008630 if (format == eFormatDefault)
8631 format = typedef_clang_type.GetFormat();
8632 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8633 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8634
8635 return typedef_clang_type.DumpTypeValue (s,
8636 format, // The format with which to display the element
8637 data, // Data buffer containing all bytes for this type
8638 byte_offset, // Offset into "data" where to grab value from
8639 typedef_byte_size, // Size of this type in bytes
8640 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
8641 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
8642 exe_scope);
8643 }
8644 break;
8645
8646 case clang::Type::Enum:
8647 // If our format is enum or default, show the enumeration value as
8648 // its enumeration string value, else just display it as requested.
8649 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
8650 {
8651 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8652 const clang::EnumDecl *enum_decl = enutype->getDecl();
8653 assert(enum_decl);
8654 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8655 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
8656 lldb::offset_t offset = byte_offset;
8657 if (is_signed)
8658 {
8659 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8660 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8661 {
8662 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
8663 {
8664 s->PutCString (enum_pos->getNameAsString().c_str());
8665 return true;
8666 }
8667 }
8668 // If we have gotten here we didn't get find the enumerator in the
8669 // enum decl, so just print the integer.
8670 s->Printf("%" PRIi64, enum_svalue);
8671 }
8672 else
8673 {
8674 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
8675 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8676 {
8677 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
8678 {
8679 s->PutCString (enum_pos->getNameAsString().c_str());
8680 return true;
8681 }
8682 }
8683 // If we have gotten here we didn't get find the enumerator in the
8684 // enum decl, so just print the integer.
8685 s->Printf("%" PRIu64, enum_uvalue);
8686 }
8687 return true;
8688 }
8689 // format was not enum, just fall through and dump the value as requested....
8690
8691 default:
8692 // We are down to a scalar type that we just need to display.
8693 {
8694 uint32_t item_count = 1;
8695 // A few formats, we might need to modify our size and count for depending
8696 // on how we are trying to display the value...
8697 switch (format)
8698 {
8699 default:
8700 case eFormatBoolean:
8701 case eFormatBinary:
8702 case eFormatComplex:
8703 case eFormatCString: // NULL terminated C strings
8704 case eFormatDecimal:
8705 case eFormatEnum:
8706 case eFormatHex:
8707 case eFormatHexUppercase:
8708 case eFormatFloat:
8709 case eFormatOctal:
8710 case eFormatOSType:
8711 case eFormatUnsigned:
8712 case eFormatPointer:
8713 case eFormatVectorOfChar:
8714 case eFormatVectorOfSInt8:
8715 case eFormatVectorOfUInt8:
8716 case eFormatVectorOfSInt16:
8717 case eFormatVectorOfUInt16:
8718 case eFormatVectorOfSInt32:
8719 case eFormatVectorOfUInt32:
8720 case eFormatVectorOfSInt64:
8721 case eFormatVectorOfUInt64:
8722 case eFormatVectorOfFloat32:
8723 case eFormatVectorOfFloat64:
8724 case eFormatVectorOfUInt128:
8725 break;
8726
8727 case eFormatChar:
8728 case eFormatCharPrintable:
8729 case eFormatCharArray:
8730 case eFormatBytes:
8731 case eFormatBytesWithASCII:
8732 item_count = byte_size;
8733 byte_size = 1;
8734 break;
8735
8736 case eFormatUnicode16:
8737 item_count = byte_size / 2;
8738 byte_size = 2;
8739 break;
8740
8741 case eFormatUnicode32:
8742 item_count = byte_size / 4;
8743 byte_size = 4;
8744 break;
8745 }
8746 return data.Dump (s,
8747 byte_offset,
8748 format,
8749 byte_size,
8750 item_count,
8751 UINT32_MAX,
8752 LLDB_INVALID_ADDRESS,
8753 bitfield_bit_size,
8754 bitfield_bit_offset,
8755 exe_scope);
8756 }
8757 break;
8758 }
8759 }
8760 return 0;
8761}
8762
8763
8764
8765void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008766ClangASTContext::DumpSummary (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00008767 Stream *s,
8768 const lldb_private::DataExtractor &data,
8769 lldb::offset_t data_byte_offset,
8770 size_t data_byte_size)
8771{
8772 uint32_t length = 0;
8773 if (IsCStringType (type, length))
8774 {
8775 if (exe_ctx)
8776 {
8777 Process *process = exe_ctx->GetProcessPtr();
8778 if (process)
8779 {
8780 lldb::offset_t offset = data_byte_offset;
8781 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
8782 std::vector<uint8_t> buf;
8783 if (length > 0)
8784 buf.resize (length);
8785 else
8786 buf.resize (256);
8787
8788 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
8789 buf.back() = '\0';
8790 size_t bytes_read;
8791 size_t total_cstr_len = 0;
8792 Error error;
8793 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
8794 {
8795 const size_t len = strlen((const char *)&buf.front());
8796 if (len == 0)
8797 break;
8798 if (total_cstr_len == 0)
8799 s->PutCString (" \"");
8800 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8801 total_cstr_len += len;
8802 if (len < buf.size())
8803 break;
8804 pointer_address += total_cstr_len;
8805 }
8806 if (total_cstr_len > 0)
8807 s->PutChar ('"');
8808 }
8809 }
8810 }
8811}
8812
8813void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008814ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008815{
8816 StreamFile s (stdout, false);
8817 DumpTypeDescription (&s);
8818 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
8819 if (metadata)
8820 {
8821 metadata->Dump (&s);
8822 }
8823}
8824
8825void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008826ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type, Stream *s)
Greg Claytond8d4a572015-08-11 21:38:15 +00008827{
8828 if (type)
8829 {
8830 clang::QualType qual_type(GetQualType(type));
8831
8832 llvm::SmallVector<char, 1024> buf;
8833 llvm::raw_svector_ostream llvm_ostrm (buf);
8834
8835 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8836 switch (type_class)
8837 {
8838 case clang::Type::ObjCObject:
8839 case clang::Type::ObjCInterface:
8840 {
8841 GetCompleteType(type);
8842
8843 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8844 assert (objc_class_type);
8845 if (objc_class_type)
8846 {
8847 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8848 if (class_interface_decl)
8849 {
8850 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
8851 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
8852 }
8853 }
8854 }
8855 break;
8856
8857 case clang::Type::Typedef:
8858 {
8859 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
8860 if (typedef_type)
8861 {
8862 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
8863 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
8864 if (!clang_typedef_name.empty())
8865 {
8866 s->PutCString ("typedef ");
8867 s->PutCString (clang_typedef_name.c_str());
8868 }
8869 }
8870 }
8871 break;
8872
8873 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008874 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008875 return;
8876
8877 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00008878 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00008879 return;
8880
8881 case clang::Type::Record:
8882 {
8883 GetCompleteType(type);
8884
8885 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8886 const clang::RecordDecl *record_decl = record_type->getDecl();
8887 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8888
8889 if (cxx_record_decl)
8890 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8891 else
8892 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
8893 }
8894 break;
8895
8896 default:
8897 {
8898 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
8899 if (tag_type)
8900 {
8901 clang::TagDecl *tag_decl = tag_type->getDecl();
8902 if (tag_decl)
8903 tag_decl->print(llvm_ostrm, 0);
8904 }
8905 else
8906 {
8907 std::string clang_type_name(qual_type.getAsString());
8908 if (!clang_type_name.empty())
8909 s->PutCString (clang_type_name.c_str());
8910 }
8911 }
8912 }
8913
Greg Claytond8d4a572015-08-11 21:38:15 +00008914 if (buf.size() > 0)
8915 {
8916 s->Write (buf.data(), buf.size());
8917 }
8918 }
8919}
Greg Clayton8b4edba2015-08-14 20:02:05 +00008920
Greg Clayton8b4edba2015-08-14 20:02:05 +00008921clang::ClassTemplateDecl *
Greg Clayton6071e6f2015-08-26 22:57:51 +00008922ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008923 lldb::AccessType access_type,
8924 const char *parent_name,
8925 int tag_decl_kind,
8926 const ClangASTContext::TemplateParameterInfos &template_param_infos)
8927{
8928 if (template_param_infos.IsValid())
8929 {
8930 std::string template_basename(parent_name);
8931 template_basename.erase (template_basename.find('<'));
8932
8933 return CreateClassTemplateDecl (decl_ctx,
8934 access_type,
8935 template_basename.c_str(),
8936 tag_decl_kind,
8937 template_param_infos);
8938 }
8939 return NULL;
8940}
8941
Greg Clayton6dc8d582015-08-18 22:32:36 +00008942void
8943ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl)
8944{
8945 ClangASTContext *ast = (ClangASTContext *)baton;
8946 SymbolFile *sym_file = ast->GetSymbolFile();
8947 if (sym_file)
8948 {
8949 CompilerType clang_type = GetTypeForDecl (decl);
8950 if (clang_type)
8951 sym_file->CompleteType (clang_type);
8952 }
8953}
8954
8955void
8956ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
8957{
8958 ClangASTContext *ast = (ClangASTContext *)baton;
8959 SymbolFile *sym_file = ast->GetSymbolFile();
8960 if (sym_file)
8961 {
8962 CompilerType clang_type = GetTypeForDecl (decl);
8963 if (clang_type)
8964 sym_file->CompleteType (clang_type);
8965 }
8966}
Greg Clayton8b4edba2015-08-14 20:02:05 +00008967
Greg Clayton261ac3f2015-08-28 01:01:03 +00008968
8969DWARFASTParser *
8970ClangASTContext::GetDWARFParser ()
8971{
8972 if (!m_dwarf_ast_parser_ap)
8973 m_dwarf_ast_parser_ap.reset(new DWARFASTParserClang(*this));
8974 return m_dwarf_ast_parser_ap.get();
8975}
8976
8977
Greg Clayton8b4edba2015-08-14 20:02:05 +00008978bool
Greg Clayton6dc8d582015-08-18 22:32:36 +00008979ClangASTContext::LayoutRecordType(void *baton,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008980 const clang::RecordDecl *record_decl,
8981 uint64_t &bit_size,
8982 uint64_t &alignment,
8983 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
8984 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
8985 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
8986{
Greg Clayton6dc8d582015-08-18 22:32:36 +00008987 ClangASTContext *ast = (ClangASTContext *)baton;
Greg Clayton261ac3f2015-08-28 01:01:03 +00008988 DWARFASTParserClang *dwarf_ast_parser = (DWARFASTParserClang *)ast->GetDWARFParser();
8989 return dwarf_ast_parser->LayoutRecordType(record_decl, bit_size, alignment, field_offsets, base_offsets, vbase_offsets);
Greg Clayton8b4edba2015-08-14 20:02:05 +00008990}
8991
Greg Clayton99558cc42015-08-24 23:46:31 +00008992//----------------------------------------------------------------------
Paul Hermand628cbb2015-09-15 23:44:17 +00008993// CompilerDecl override functions
8994//----------------------------------------------------------------------
8995lldb::VariableSP
8996ClangASTContext::DeclGetVariable (void *opaque_decl)
8997{
8998 if (llvm::dyn_cast<clang::VarDecl>((clang::Decl *)opaque_decl))
8999 {
9000 auto decl_search_it = m_decl_objects.find(opaque_decl);
9001 if (decl_search_it != m_decl_objects.end())
9002 return std::static_pointer_cast<Variable>(decl_search_it->second);
9003 }
9004 return VariableSP();
9005}
9006
9007void
9008ClangASTContext::DeclLinkToObject (void *opaque_decl, std::shared_ptr<void> object)
9009{
9010 if (m_decl_objects.find(opaque_decl) == m_decl_objects.end())
9011 m_decl_objects.insert(std::make_pair(opaque_decl, object));
9012}
9013
9014ConstString
9015ClangASTContext::DeclGetName (void *opaque_decl)
9016{
9017 if (opaque_decl)
9018 {
9019 clang::NamedDecl *nd = llvm::dyn_cast<NamedDecl>((clang::Decl*)opaque_decl);
9020 if (nd != nullptr)
9021 return ConstString(nd->getName());
9022 }
9023 return ConstString();
9024}
9025
9026//----------------------------------------------------------------------
Greg Clayton99558cc42015-08-24 23:46:31 +00009027// CompilerDeclContext functions
9028//----------------------------------------------------------------------
9029
Paul Hermand628cbb2015-09-15 23:44:17 +00009030std::vector<void *>
9031ClangASTContext::DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name)
9032{
9033 std::vector<void *> found_decls;
9034 if (opaque_decl_ctx)
9035 {
9036 DeclContext *root_decl_ctx = (DeclContext *)opaque_decl_ctx;
9037 std::set<DeclContext *> searched;
9038 std::multimap<DeclContext *, DeclContext *> search_queue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009039 SymbolFile *symbol_file = GetSymbolFile();
Paul Hermand628cbb2015-09-15 23:44:17 +00009040
9041 for (clang::DeclContext *decl_context = root_decl_ctx; decl_context != nullptr && found_decls.empty(); decl_context = decl_context->getParent())
9042 {
9043 search_queue.insert(std::make_pair(decl_context, decl_context));
9044
9045 for (auto it = search_queue.find(decl_context); it != search_queue.end(); it++)
9046 {
9047 searched.insert(it->second);
Paul Hermanea188fc2015-09-16 18:48:30 +00009048 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9049
Paul Hermand628cbb2015-09-15 23:44:17 +00009050 for (clang::Decl *child : it->second->decls())
9051 {
Paul Hermanea188fc2015-09-16 18:48:30 +00009052 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
Paul Hermand628cbb2015-09-15 23:44:17 +00009053 {
9054 clang::DeclContext *from = ud->getCommonAncestor();
9055 if (searched.find(ud->getNominatedNamespace()) == searched.end())
9056 search_queue.insert(std::make_pair(from, ud->getNominatedNamespace()));
9057 }
9058 else if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9059 {
9060 for (clang::UsingShadowDecl *usd : ud->shadows())
9061 {
9062 clang::Decl *target = usd->getTargetDecl();
9063 if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target))
9064 {
9065 IdentifierInfo *ii = nd->getIdentifier();
9066 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
9067 found_decls.push_back(nd);
9068 }
9069 }
9070 }
Paul Hermanea188fc2015-09-16 18:48:30 +00009071 else if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(child))
9072 {
9073 IdentifierInfo *ii = nd->getIdentifier();
9074 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
9075 found_decls.push_back(nd);
9076 }
Paul Hermand628cbb2015-09-15 23:44:17 +00009077 }
9078 }
9079 }
9080 }
9081 return found_decls;
9082}
9083
Greg Clayton99558cc42015-08-24 23:46:31 +00009084bool
9085ClangASTContext::DeclContextIsStructUnionOrClass (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00009086{
Greg Clayton99558cc42015-08-24 23:46:31 +00009087 if (opaque_decl_ctx)
9088 return ((clang::DeclContext *)opaque_decl_ctx)->isRecord();
9089 else
9090 return false;
Greg Clayton8b4edba2015-08-14 20:02:05 +00009091}
9092
Greg Clayton99558cc42015-08-24 23:46:31 +00009093ConstString
9094ClangASTContext::DeclContextGetName (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00009095{
Greg Clayton99558cc42015-08-24 23:46:31 +00009096 if (opaque_decl_ctx)
9097 {
9098 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
9099 if (named_decl)
9100 return ConstString(named_decl->getName());
9101 }
9102 return ConstString();
9103}
9104
9105bool
9106ClangASTContext::DeclContextIsClassMethod (void *opaque_decl_ctx,
9107 lldb::LanguageType *language_ptr,
9108 bool *is_instance_method_ptr,
9109 ConstString *language_object_name_ptr)
9110{
9111 if (opaque_decl_ctx)
9112 {
9113 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
9114 if (ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
9115 {
9116 if (is_instance_method_ptr)
9117 *is_instance_method_ptr = objc_method->isInstanceMethod();
9118 if (language_ptr)
9119 *language_ptr = eLanguageTypeObjC;
9120 if (language_object_name_ptr)
9121 language_object_name_ptr->SetCString("self");
9122 return true;
9123 }
9124 else if (CXXMethodDecl *cxx_method = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
9125 {
9126 if (is_instance_method_ptr)
9127 *is_instance_method_ptr = cxx_method->isInstance();
9128 if (language_ptr)
9129 *language_ptr = eLanguageTypeC_plus_plus;
9130 if (language_object_name_ptr)
9131 language_object_name_ptr->SetCString("this");
9132 return true;
9133 }
9134 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
9135 {
9136 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
9137 if (metadata && metadata->HasObjectPtr())
9138 {
9139 if (is_instance_method_ptr)
9140 *is_instance_method_ptr = true;
9141 if (language_ptr)
9142 *language_ptr = eLanguageTypeObjC;
9143 if (language_object_name_ptr)
9144 language_object_name_ptr->SetCString (metadata->GetObjectPtrName());
9145 return true;
9146 }
9147 }
9148 }
9149 return false;
9150}
9151
9152clang::DeclContext *
9153ClangASTContext::DeclContextGetAsDeclContext (const CompilerDeclContext &dc)
9154{
9155 if (dc.IsClang())
9156 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
9157 return nullptr;
9158}
9159
9160
9161ObjCMethodDecl *
9162ClangASTContext::DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc)
9163{
9164 if (dc.IsClang())
9165 return llvm::dyn_cast<clang::ObjCMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
9166 return nullptr;
9167}
9168
9169CXXMethodDecl *
9170ClangASTContext::DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc)
9171{
9172 if (dc.IsClang())
9173 return llvm::dyn_cast<clang::CXXMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
9174 return nullptr;
9175}
9176
9177clang::FunctionDecl *
9178ClangASTContext::DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc)
9179{
9180 if (dc.IsClang())
9181 return llvm::dyn_cast<clang::FunctionDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
9182 return nullptr;
9183}
9184
9185clang::NamespaceDecl *
9186ClangASTContext::DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc)
9187{
9188 if (dc.IsClang())
9189 return llvm::dyn_cast<clang::NamespaceDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
9190 return nullptr;
9191}
9192
9193ClangASTMetadata *
9194ClangASTContext::DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object)
9195{
9196 clang::ASTContext *ast = DeclContextGetClangASTContext (dc);
9197 if (ast)
9198 return ClangASTContext::GetMetadata (ast, object);
9199 return nullptr;
9200}
9201
9202clang::ASTContext *
9203ClangASTContext::DeclContextGetClangASTContext (const CompilerDeclContext &dc)
9204{
Greg Claytonf73034f2015-09-08 18:15:05 +00009205 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
9206 if (ast)
9207 return ast->getASTContext();
Greg Clayton99558cc42015-08-24 23:46:31 +00009208 return nullptr;
Greg Clayton8b4edba2015-08-14 20:02:05 +00009209}
9210
Jim Ingham151c0322015-09-15 21:13:50 +00009211ClangASTContextForExpressions::ClangASTContextForExpressions (Target &target) :
9212 ClangASTContext (target.GetArchitecture().GetTriple().getTriple().c_str()),
Sean Callanan8f1f9a12015-09-30 19:57:57 +00009213 m_target_wp(target.shared_from_this()),
9214 m_persistent_variables (new ClangPersistentVariables)
Jim Ingham151c0322015-09-15 21:13:50 +00009215{
9216}
9217
9218UserExpression *
9219ClangASTContextForExpressions::GetUserExpression (const char *expr,
9220 const char *expr_prefix,
9221 lldb::LanguageType language,
9222 Expression::ResultType desired_type)
9223{
9224 TargetSP target_sp = m_target_wp.lock();
9225 if (!target_sp)
9226 return nullptr;
9227
9228 return new ClangUserExpression(*target_sp.get(), expr, expr_prefix, language, desired_type);
9229}
9230
9231FunctionCaller *
9232ClangASTContextForExpressions::GetFunctionCaller (const CompilerType &return_type,
9233 const Address& function_address,
9234 const ValueList &arg_value_list,
9235 const char *name)
9236{
9237 TargetSP target_sp = m_target_wp.lock();
9238 if (!target_sp)
9239 return nullptr;
9240
9241 Process *process = target_sp->GetProcessSP().get();
9242 if (!process)
9243 return nullptr;
9244
9245 return new ClangFunctionCaller (*process, return_type, function_address, arg_value_list, name);
9246}
9247
9248UtilityFunction *
9249ClangASTContextForExpressions::GetUtilityFunction (const char *text,
9250 const char *name)
9251{
Sean Callanan8f1f9a12015-09-30 19:57:57 +00009252 TargetSP target_sp = m_target_wp.lock();
Jim Ingham151c0322015-09-15 21:13:50 +00009253 if (!target_sp)
9254 return nullptr;
9255
9256 return new ClangUtilityFunction(*target_sp.get(), text, name);
9257}
Sean Callanan8f1f9a12015-09-30 19:57:57 +00009258
9259PersistentExpressionState *
9260ClangASTContextForExpressions::GetPersistentExpressionState ()
9261{
9262 return m_persistent_variables.get();
9263}