blob: 1d4d265e7025e8819c790c03a0c208534940ace3 [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"
Greg Claytonfe689042015-11-10 17:47:04 +000043#include "clang/AST/Mangle.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044#include "clang/AST/RecordLayout.h"
45#include "clang/AST/Type.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000046#include "clang/AST/VTableBuilder.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047#include "clang/Basic/Builtins.h"
Sean Callanan7e2863b2012-02-06 21:28:03 +000048#include "clang/Basic/Diagnostic.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049#include "clang/Basic/FileManager.h"
Sean Callanan79439e82010-11-18 02:56:27 +000050#include "clang/Basic/FileSystemOptions.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051#include "clang/Basic/SourceManager.h"
52#include "clang/Basic/TargetInfo.h"
53#include "clang/Basic/TargetOptions.h"
54#include "clang/Frontend/FrontendOptions.h"
55#include "clang/Frontend/LangStandard.h"
Greg Clayton6beaaa62011-01-17 03:46:26 +000056
57#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
Sean Callanan246549c2010-07-08 18:16:16 +000058#undef NDEBUG
Greg Clayton6beaaa62011-01-17 03:46:26 +000059#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
60// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
61#include <assert.h>
62#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +000063
Greg Claytond8d4a572015-08-11 21:38:15 +000064#include "llvm/Support/Signals.h"
65
Greg Clayton514487e2011-02-15 21:59:32 +000066#include "lldb/Core/ArchSpec.h"
Greg Clayton73b472d2010-10-27 03:32:59 +000067#include "lldb/Core/Flags.h"
Sean Callananfb8b7092010-10-28 18:19:36 +000068#include "lldb/Core/Log.h"
Greg Clayton56939cb2015-09-17 22:23:34 +000069#include "lldb/Core/Module.h"
70#include "lldb/Core/PluginManager.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000071#include "lldb/Core/RegularExpression.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000072#include "lldb/Core/StreamFile.h"
Enrico Granata2267ad42014-09-16 17:28:40 +000073#include "lldb/Core/ThreadSafeDenseMap.h"
Greg Clayton57ee3062013-07-11 22:46:58 +000074#include "lldb/Core/UniqueCStringMap.h"
Sean Callanan4dbb2712015-09-25 20:35:58 +000075#include "Plugins/ExpressionParser/Clang/ClangUserExpression.h"
76#include "Plugins/ExpressionParser/Clang/ClangFunctionCaller.h"
77#include "Plugins/ExpressionParser/Clang/ClangUtilityFunction.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000078#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6dc8d582015-08-18 22:32:36 +000079#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000080#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Greg Clayton56939cb2015-09-17 22:23:34 +000081#include "lldb/Symbol/ObjectFile.h"
Greg Clayton261ac3f2015-08-28 01:01:03 +000082#include "lldb/Symbol/SymbolFile.h"
Sean Callanan5e9e1992011-10-26 01:06:27 +000083#include "lldb/Symbol/VerifyDecl.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000084#include "lldb/Target/ExecutionContext.h"
Greg Clayton56939cb2015-09-17 22:23:34 +000085#include "lldb/Target/Language.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000086#include "lldb/Target/ObjCLanguageRuntime.h"
Jim Ingham151c0322015-09-15 21:13:50 +000087#include "lldb/Target/Process.h"
88#include "lldb/Target/Target.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000089
Greg Clayton261ac3f2015-08-28 01:01:03 +000090#include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h"
91
Eli Friedman932197d2010-06-13 19:06:42 +000092#include <stdio.h>
93
Greg Clayton1341baf2013-07-11 23:36:31 +000094#include <mutex>
95
Greg Claytonc86103d2010-08-05 01:57:25 +000096using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000097using namespace lldb_private;
98using namespace llvm;
99using namespace clang;
100
Greg Clayton56939cb2015-09-17 22:23:34 +0000101namespace
102{
103 static inline bool ClangASTContextSupportsLanguage (lldb::LanguageType language)
104 {
105 return language == eLanguageTypeUnknown || // Clang is the default type system
106 Language::LanguageIsC (language) ||
107 Language::LanguageIsCPlusPlus (language) ||
Ewan Crawford75f0ff52016-02-03 09:17:03 +0000108 Language::LanguageIsObjC (language) ||
109 language == eLanguageTypeExtRenderScript;
Greg Clayton56939cb2015-09-17 22:23:34 +0000110 }
111}
112
Enrico Granata2267ad42014-09-16 17:28:40 +0000113typedef lldb_private::ThreadSafeDenseMap<clang::ASTContext *, ClangASTContext*> ClangASTMap;
Enrico Granata5d84a692014-08-19 21:46:37 +0000114
115static ClangASTMap &
116GetASTMap()
117{
Enrico Granata2267ad42014-09-16 17:28:40 +0000118 static ClangASTMap *g_map_ptr = nullptr;
119 static std::once_flag g_once_flag;
120 std::call_once(g_once_flag, []() {
121 g_map_ptr = new ClangASTMap(); // leaked on purpose to avoid spins
122 });
123 return *g_map_ptr;
Enrico Granata5d84a692014-08-19 21:46:37 +0000124}
125
126
Greg Clayton57ee3062013-07-11 22:46:58 +0000127clang::AccessSpecifier
128ClangASTContext::ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000129{
130 switch (access)
131 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000132 default: break;
133 case eAccessNone: return AS_none;
134 case eAccessPublic: return AS_public;
135 case eAccessPrivate: return AS_private;
136 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000137 }
138 return AS_none;
139}
140
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000141static void
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000142ParseLangArgs (LangOptions &Opts, InputKind IK, const char* triple)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000143{
144 // FIXME: Cleanup per-file based stuff.
145
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000146 // Set some properties which depend solely on the input kind; it would be nice
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000147 // to move these to the language standard, and have the driver resolve the
148 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000149 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000150 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000151 } else if (IK == IK_ObjC ||
152 IK == IK_ObjCXX ||
153 IK == IK_PreprocessedObjC ||
154 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155 Opts.ObjC1 = Opts.ObjC2 = 1;
156 }
157
158 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
159
160 if (LangStd == LangStandard::lang_unspecified) {
161 // Based on the base language, pick one.
162 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000163 case IK_None:
164 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000165 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000166 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000167 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000168 LangStd = LangStandard::lang_opencl;
169 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000170 case IK_CUDA:
Artem Belevich52210ae2015-03-19 18:12:26 +0000171 case IK_PreprocessedCuda:
Sean Callananfb0b7582011-03-15 00:17:19 +0000172 LangStd = LangStandard::lang_cuda;
173 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000174 case IK_Asm:
175 case IK_C:
176 case IK_PreprocessedC:
177 case IK_ObjC:
178 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000179 LangStd = LangStandard::lang_gnu99;
180 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000181 case IK_CXX:
182 case IK_PreprocessedCXX:
183 case IK_ObjCXX:
184 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000185 LangStd = LangStandard::lang_gnucxx98;
186 break;
187 }
188 }
189
190 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
Filipe Cabecinhase818ca22012-11-12 21:26:32 +0000191 Opts.LineComment = Std.hasLineComments();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000192 Opts.C99 = Std.isC99();
193 Opts.CPlusPlus = Std.isCPlusPlus();
Chandler Carruth38336a12013-01-02 12:55:00 +0000194 Opts.CPlusPlus11 = Std.isCPlusPlus11();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000195 Opts.Digraphs = Std.hasDigraphs();
196 Opts.GNUMode = Std.isGNUMode();
197 Opts.GNUInline = !Std.isC99();
198 Opts.HexFloats = Std.hasHexFloats();
199 Opts.ImplicitInt = Std.hasImplicitInt();
Enrico Granatac921e342013-01-10 02:37:22 +0000200
201 Opts.WChar = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000202
203 // OpenCL has some additional defaults.
204 if (LangStd == LangStandard::lang_opencl) {
205 Opts.OpenCL = 1;
206 Opts.AltiVec = 1;
207 Opts.CXXOperatorNames = 1;
208 Opts.LaxVectorConversions = 1;
209 }
210
211 // OpenCL and C++ both have bool, true, false keywords.
212 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
213
214// if (Opts.CPlusPlus)
215// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
216//
217// if (Args.hasArg(OPT_fobjc_gc_only))
218// Opts.setGCMode(LangOptions::GCOnly);
219// else if (Args.hasArg(OPT_fobjc_gc))
220// Opts.setGCMode(LangOptions::HybridGC);
221//
222// if (Args.hasArg(OPT_print_ivar_layout))
223// Opts.ObjCGCBitmapPrint = 1;
224//
225// if (Args.hasArg(OPT_faltivec))
226// Opts.AltiVec = 1;
227//
228// if (Args.hasArg(OPT_pthread))
229// Opts.POSIXThreads = 1;
230//
231// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
232// "default");
233// if (Vis == "default")
Sean Callanan37f76e52013-02-19 19:16:37 +0000234 Opts.setValueVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000235// else if (Vis == "hidden")
236// Opts.setVisibilityMode(LangOptions::Hidden);
237// else if (Vis == "protected")
238// Opts.setVisibilityMode(LangOptions::Protected);
239// else
240// Diags.Report(diag::err_drv_invalid_value)
241// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
242
243// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
244
245 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
246 // is specified, or -std is set to a conforming mode.
247 Opts.Trigraphs = !Opts.GNUMode;
248// if (Args.hasArg(OPT_trigraphs))
249// Opts.Trigraphs = 1;
250//
251// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
252// OPT_fno_dollars_in_identifiers,
253// !Opts.AsmPreprocessor);
254// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
255// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
256// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
257// if (Args.hasArg(OPT_fno_lax_vector_conversions))
258// Opts.LaxVectorConversions = 0;
259// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
260// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
261// Opts.Blocks = Args.hasArg(OPT_fblocks);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000262 Opts.CharIsSigned = ArchSpec(triple).CharIsSignedByDefault();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000263// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
264// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
265// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
266// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
267// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
268// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
269// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
270// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
271// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
272// Diags);
273// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
274// Opts.ObjCConstantStringClass = getLastArgValue(Args,
275// OPT_fconstant_string_class);
276// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
277// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
278// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
279// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
280// Opts.Static = Args.hasArg(OPT_static_define);
281 Opts.OptimizeSize = 0;
282
283 // FIXME: Eliminate this dependency.
284// unsigned Opt =
285// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
286// Opts.Optimize = Opt != 0;
287 unsigned Opt = 0;
288
289 // This is the __NO_INLINE__ define, which just depends on things like the
290 // optimization level and -fno-inline, not actually whether the backend has
291 // inlining enabled.
292 //
293 // FIXME: This is affected by other options (-fno-inline).
Sean Callanan3d654b32012-09-24 22:25:51 +0000294 Opts.NoInlineDefine = !Opt;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000295
296// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
297// switch (SSP) {
298// default:
299// Diags.Report(diag::err_drv_invalid_value)
300// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
301// break;
302// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
303// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
304// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
305// }
306}
307
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000308
Greg Claytonf73034f2015-09-08 18:15:05 +0000309ClangASTContext::ClangASTContext (const char *target_triple) :
310 TypeSystem (TypeSystem::eKindClang),
Greg Clayton6dc8d582015-08-18 22:32:36 +0000311 m_target_triple (),
312 m_ast_ap (),
313 m_language_options_ap (),
314 m_source_manager_ap (),
315 m_diagnostics_engine_ap (),
316 m_target_options_rp (),
317 m_target_info_ap (),
318 m_identifier_table_ap (),
319 m_selector_table_ap (),
320 m_builtins_ap (),
Ed Masted4612ad2014-04-20 13:17:36 +0000321 m_callback_tag_decl (nullptr),
322 m_callback_objc_decl (nullptr),
323 m_callback_baton (nullptr),
Greg Claytond8d4a572015-08-11 21:38:15 +0000324 m_pointer_byte_size (0),
Greg Clayton261ac3f2015-08-28 01:01:03 +0000325 m_ast_owned (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000326{
327 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000328 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000329}
330
331//----------------------------------------------------------------------
332// Destructor
333//----------------------------------------------------------------------
334ClangASTContext::~ClangASTContext()
335{
Jim Ingham0ea010a2016-02-12 00:03:19 +0000336 Finalize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000337}
338
Greg Clayton56939cb2015-09-17 22:23:34 +0000339ConstString
340ClangASTContext::GetPluginNameStatic()
341{
342 return ConstString("clang");
343}
344
345ConstString
346ClangASTContext::GetPluginName()
347{
348 return ClangASTContext::GetPluginNameStatic();
349}
350
351uint32_t
352ClangASTContext::GetPluginVersion()
353{
354 return 1;
355}
356
357lldb::TypeSystemSP
Tamas Berghammer3a6b82b2015-10-09 12:06:10 +0000358ClangASTContext::CreateInstance (lldb::LanguageType language,
359 lldb_private::Module *module,
360 Target *target)
Greg Clayton56939cb2015-09-17 22:23:34 +0000361{
362 if (ClangASTContextSupportsLanguage(language))
363 {
Greg Clayton5beec212015-10-08 21:04:34 +0000364 ArchSpec arch;
365 if (module)
366 arch = module->GetArchitecture();
367 else if (target)
368 arch = target->GetArchitecture();
369
370 if (arch.IsValid())
Greg Clayton56939cb2015-09-17 22:23:34 +0000371 {
Greg Clayton5beec212015-10-08 21:04:34 +0000372 ArchSpec fixed_arch = arch;
373 // LLVM wants this to be set to iOS or MacOSX; if we're working on
374 // a bare-boards type image, change the triple for llvm's benefit.
375 if (fixed_arch.GetTriple().getVendor() == llvm::Triple::Apple &&
376 fixed_arch.GetTriple().getOS() == llvm::Triple::UnknownOS)
Greg Clayton56939cb2015-09-17 22:23:34 +0000377 {
Greg Clayton5beec212015-10-08 21:04:34 +0000378 if (fixed_arch.GetTriple().getArch() == llvm::Triple::arm ||
379 fixed_arch.GetTriple().getArch() == llvm::Triple::aarch64 ||
380 fixed_arch.GetTriple().getArch() == llvm::Triple::thumb)
Greg Clayton56939cb2015-09-17 22:23:34 +0000381 {
Greg Clayton5beec212015-10-08 21:04:34 +0000382 fixed_arch.GetTriple().setOS(llvm::Triple::IOS);
Greg Clayton56939cb2015-09-17 22:23:34 +0000383 }
Greg Clayton5beec212015-10-08 21:04:34 +0000384 else
385 {
386 fixed_arch.GetTriple().setOS(llvm::Triple::MacOSX);
387 }
388 }
389
390 if (module)
391 {
392 std::shared_ptr<ClangASTContext> ast_sp(new ClangASTContext);
393 if (ast_sp)
394 {
395 ast_sp->SetArchitecture (fixed_arch);
396 }
397 return ast_sp;
398 }
Sean Callanana3444ff2015-11-10 22:54:42 +0000399 else if (target && target->IsValid())
Greg Clayton5beec212015-10-08 21:04:34 +0000400 {
401 std::shared_ptr<ClangASTContextForExpressions> ast_sp(new ClangASTContextForExpressions(*target));
402 if (ast_sp)
403 {
404 ast_sp->SetArchitecture(fixed_arch);
405 ast_sp->m_scratch_ast_source_ap.reset (new ClangASTSource(target->shared_from_this()));
406 ast_sp->m_scratch_ast_source_ap->InstallASTContext(ast_sp->getASTContext());
407 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(ast_sp->m_scratch_ast_source_ap->CreateProxy());
408 ast_sp->SetExternalSource(proxy_ast_source);
409 return ast_sp;
410 }
Greg Clayton56939cb2015-09-17 22:23:34 +0000411 }
412 }
Greg Clayton56939cb2015-09-17 22:23:34 +0000413 }
414 return lldb::TypeSystemSP();
415}
416
Sean Callananfe38c852015-10-08 23:07:53 +0000417void
418ClangASTContext::EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions)
419{
420 static std::vector<lldb::LanguageType> s_supported_languages_for_types({
421 lldb::eLanguageTypeC89,
422 lldb::eLanguageTypeC,
423 lldb::eLanguageTypeC11,
424 lldb::eLanguageTypeC_plus_plus,
425 lldb::eLanguageTypeC99,
426 lldb::eLanguageTypeObjC,
427 lldb::eLanguageTypeObjC_plus_plus,
428 lldb::eLanguageTypeC_plus_plus_03,
429 lldb::eLanguageTypeC_plus_plus_11,
430 lldb::eLanguageTypeC11,
431 lldb::eLanguageTypeC_plus_plus_14});
432
433 static std::vector<lldb::LanguageType> s_supported_languages_for_expressions({
434 lldb::eLanguageTypeC_plus_plus,
435 lldb::eLanguageTypeObjC_plus_plus,
436 lldb::eLanguageTypeC_plus_plus_03,
437 lldb::eLanguageTypeC_plus_plus_11,
438 lldb::eLanguageTypeC_plus_plus_14});
439
440 languages_for_types.insert(s_supported_languages_for_types.begin(), s_supported_languages_for_types.end());
441 languages_for_expressions.insert(s_supported_languages_for_expressions.begin(), s_supported_languages_for_expressions.end());
442}
443
Greg Clayton56939cb2015-09-17 22:23:34 +0000444
445void
446ClangASTContext::Initialize()
447{
448 PluginManager::RegisterPlugin (GetPluginNameStatic(),
449 "clang base AST context plug-in",
Sean Callananfe38c852015-10-08 23:07:53 +0000450 CreateInstance,
451 EnumerateSupportedLanguages);
Greg Clayton56939cb2015-09-17 22:23:34 +0000452}
453
454void
455ClangASTContext::Terminate()
456{
457 PluginManager::UnregisterPlugin (CreateInstance);
458}
459
Jim Ingham0ea010a2016-02-12 00:03:19 +0000460void
461ClangASTContext::Finalize()
462{
463 if (m_ast_ap.get())
464 {
465 GetASTMap().Erase(m_ast_ap.get());
466 if (!m_ast_owned)
467 m_ast_ap.release();
468 }
469
470 m_builtins_ap.reset();
471 m_selector_table_ap.reset();
472 m_identifier_table_ap.reset();
473 m_target_info_ap.reset();
474 m_target_options_rp.reset();
475 m_diagnostics_engine_ap.reset();
476 m_source_manager_ap.reset();
477 m_language_options_ap.reset();
478 m_ast_ap.reset();
479 m_scratch_ast_source_ap.reset();
480}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000481
482void
483ClangASTContext::Clear()
484{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000485 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000486 m_language_options_ap.reset();
487 m_source_manager_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000488 m_diagnostics_engine_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000489 m_target_options_rp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000490 m_target_info_ap.reset();
491 m_identifier_table_ap.reset();
492 m_selector_table_ap.reset();
493 m_builtins_ap.reset();
Greg Clayton57ee3062013-07-11 22:46:58 +0000494 m_pointer_byte_size = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000495}
496
497const char *
498ClangASTContext::GetTargetTriple ()
499{
500 return m_target_triple.c_str();
501}
502
503void
504ClangASTContext::SetTargetTriple (const char *target_triple)
505{
506 Clear();
507 m_target_triple.assign(target_triple);
508}
509
Greg Clayton514487e2011-02-15 21:59:32 +0000510void
511ClangASTContext::SetArchitecture (const ArchSpec &arch)
512{
Greg Clayton880cbb02011-07-30 01:26:02 +0000513 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000514}
515
Greg Clayton6beaaa62011-01-17 03:46:26 +0000516bool
517ClangASTContext::HasExternalSource ()
518{
519 ASTContext *ast = getASTContext();
520 if (ast)
Ed Masted4612ad2014-04-20 13:17:36 +0000521 return ast->getExternalSource () != nullptr;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000522 return false;
523}
524
525void
Todd Fiala955fe6f2014-02-27 17:18:23 +0000526ClangASTContext::SetExternalSource (llvm::IntrusiveRefCntPtr<ExternalASTSource> &ast_source_ap)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000527{
528 ASTContext *ast = getASTContext();
529 if (ast)
530 {
531 ast->setExternalSource (ast_source_ap);
532 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
533 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
534 }
535}
536
537void
538ClangASTContext::RemoveExternalSource ()
539{
540 ASTContext *ast = getASTContext();
541
542 if (ast)
543 {
Todd Fiala955fe6f2014-02-27 17:18:23 +0000544 llvm::IntrusiveRefCntPtr<ExternalASTSource> empty_ast_source_ap;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000545 ast->setExternalSource (empty_ast_source_ap);
546 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
547 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
548 }
549}
550
Greg Claytond8d4a572015-08-11 21:38:15 +0000551void
552ClangASTContext::setASTContext(clang::ASTContext *ast_ctx)
553{
554 if (!m_ast_owned) {
555 m_ast_ap.release();
556 }
557 m_ast_owned = false;
558 m_ast_ap.reset(ast_ctx);
559 GetASTMap().Insert(ast_ctx, this);
560}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000561
562ASTContext *
563ClangASTContext::getASTContext()
564{
Ed Masted4612ad2014-04-20 13:17:36 +0000565 if (m_ast_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000566 {
Greg Claytond8d4a572015-08-11 21:38:15 +0000567 m_ast_owned = true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000568 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
569 *getSourceManager(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000570 *getIdentifierTable(),
571 *getSelectorTable(),
Alp Tokercf55e882014-05-03 15:05:45 +0000572 *getBuiltinContext()));
Sean Callanan6d61b632015-04-09 17:42:48 +0000573
574 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Greg Clayton28eb7bf2015-05-07 00:07:44 +0000575
576 // This can be NULL if we don't know anything about the architecture or if the
577 // target for an architecture isn't enabled in the llvm/clang that we built
578 TargetInfo *target_info = getTargetInfo();
579 if (target_info)
580 m_ast_ap->InitBuiltinTypes(*target_info);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000581
Greg Clayton6beaaa62011-01-17 03:46:26 +0000582 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
583 {
584 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
585 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
586 }
587
Enrico Granata2267ad42014-09-16 17:28:40 +0000588 GetASTMap().Insert(m_ast_ap.get(), this);
Greg Clayton6dc8d582015-08-18 22:32:36 +0000589
590 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> ast_source_ap (new ClangExternalASTSourceCallbacks (ClangASTContext::CompleteTagDecl,
591 ClangASTContext::CompleteObjCInterfaceDecl,
592 nullptr,
593 ClangASTContext::LayoutRecordType,
594 this));
595 SetExternalSource (ast_source_ap);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000596 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000597 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000598}
599
Enrico Granata5d84a692014-08-19 21:46:37 +0000600ClangASTContext*
601ClangASTContext::GetASTContext (clang::ASTContext* ast)
602{
Enrico Granata2267ad42014-09-16 17:28:40 +0000603 ClangASTContext *clang_ast = GetASTMap().Lookup(ast);
Enrico Granata5d84a692014-08-19 21:46:37 +0000604 return clang_ast;
605}
606
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000607Builtin::Context *
608ClangASTContext::getBuiltinContext()
609{
Ed Masted4612ad2014-04-20 13:17:36 +0000610 if (m_builtins_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000611 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000612 return m_builtins_ap.get();
613}
614
615IdentifierTable *
616ClangASTContext::getIdentifierTable()
617{
Ed Masted4612ad2014-04-20 13:17:36 +0000618 if (m_identifier_table_ap.get() == nullptr)
619 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), nullptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000620 return m_identifier_table_ap.get();
621}
622
623LangOptions *
624ClangASTContext::getLanguageOptions()
625{
Ed Masted4612ad2014-04-20 13:17:36 +0000626 if (m_language_options_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000627 {
628 m_language_options_ap.reset(new LangOptions());
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000629 ParseLangArgs(*m_language_options_ap, IK_ObjCXX, GetTargetTriple());
Greg Clayton94e5d782010-06-13 17:34:29 +0000630// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000631 }
632 return m_language_options_ap.get();
633}
634
635SelectorTable *
636ClangASTContext::getSelectorTable()
637{
Ed Masted4612ad2014-04-20 13:17:36 +0000638 if (m_selector_table_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000639 m_selector_table_ap.reset (new SelectorTable());
640 return m_selector_table_ap.get();
641}
642
Sean Callanan79439e82010-11-18 02:56:27 +0000643clang::FileManager *
644ClangASTContext::getFileManager()
645{
Ed Masted4612ad2014-04-20 13:17:36 +0000646 if (m_file_manager_ap.get() == nullptr)
Greg Clayton38a61402010-12-02 23:20:03 +0000647 {
648 clang::FileSystemOptions file_system_options;
649 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
650 }
Sean Callanan79439e82010-11-18 02:56:27 +0000651 return m_file_manager_ap.get();
652}
653
Greg Claytone1a916a2010-07-21 22:12:05 +0000654clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000655ClangASTContext::getSourceManager()
656{
Ed Masted4612ad2014-04-20 13:17:36 +0000657 if (m_source_manager_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000658 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000659 return m_source_manager_ap.get();
660}
661
Sean Callanan880e6802011-10-07 23:18:13 +0000662clang::DiagnosticsEngine *
663ClangASTContext::getDiagnosticsEngine()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000664{
Ed Masted4612ad2014-04-20 13:17:36 +0000665 if (m_diagnostics_engine_ap.get() == nullptr)
Greg Claytona651b532010-11-19 21:46:54 +0000666 {
667 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callananec8f1ef2012-10-25 01:00:25 +0000668 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
Greg Claytona651b532010-11-19 21:46:54 +0000669 }
Sean Callanan880e6802011-10-07 23:18:13 +0000670 return m_diagnostics_engine_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000671}
672
Greg Claytonfe689042015-11-10 17:47:04 +0000673clang::MangleContext *
674ClangASTContext::getMangleContext()
675{
676 if (m_mangle_ctx_ap.get() == nullptr)
677 m_mangle_ctx_ap.reset (getASTContext()->createMangleContext());
678 return m_mangle_ctx_ap.get();
679}
680
Sean Callanan880e6802011-10-07 23:18:13 +0000681class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000682{
683public:
Sean Callanan880e6802011-10-07 23:18:13 +0000684 NullDiagnosticConsumer ()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000685 {
686 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
687 }
688
Sean Callanan880e6802011-10-07 23:18:13 +0000689 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000690 {
691 if (m_log)
692 {
Sean Callanan5b26f272012-02-04 08:49:35 +0000693 llvm::SmallVector<char, 32> diag_str(10);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000694 info.FormatDiagnostic(diag_str);
695 diag_str.push_back('\0');
696 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
697 }
698 }
Sean Callanan880e6802011-10-07 23:18:13 +0000699
700 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
701 {
702 return new NullDiagnosticConsumer ();
703 }
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000704private:
Greg Clayton5160ce52013-03-27 23:08:40 +0000705 Log * m_log;
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000706};
707
Sean Callanan880e6802011-10-07 23:18:13 +0000708DiagnosticConsumer *
709ClangASTContext::getDiagnosticConsumer()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000710{
Ed Masted4612ad2014-04-20 13:17:36 +0000711 if (m_diagnostic_consumer_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000712 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000713
Sean Callanan880e6802011-10-07 23:18:13 +0000714 return m_diagnostic_consumer_ap.get();
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000715}
716
Jason Molenda45938b92014-07-08 23:46:39 +0000717std::shared_ptr<TargetOptions> &
718ClangASTContext::getTargetOptions() {
Alp Tokeredc902f2014-07-05 03:06:05 +0000719 if (m_target_options_rp.get() == nullptr && !m_target_triple.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000720 {
Alp Toker5f838642014-07-06 05:36:57 +0000721 m_target_options_rp = std::make_shared<TargetOptions>();
Alp Tokeredc902f2014-07-05 03:06:05 +0000722 if (m_target_options_rp.get() != nullptr)
Sean Callananc5069ad2012-10-17 22:11:14 +0000723 m_target_options_rp->Triple = m_target_triple;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000724 }
Alp Toker5f838642014-07-06 05:36:57 +0000725 return m_target_options_rp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000726}
727
728
729TargetInfo *
730ClangASTContext::getTargetInfo()
731{
Greg Clayton70512312012-05-08 01:45:38 +0000732 // target_triple should be something like "x86_64-apple-macosx"
Ed Masted4612ad2014-04-20 13:17:36 +0000733 if (m_target_info_ap.get() == nullptr && !m_target_triple.empty())
Greg Clayton38d880a2012-11-16 21:35:22 +0000734 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), getTargetOptions()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000735 return m_target_info_ap.get();
736}
737
738#pragma mark Basic Types
739
740static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000741QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000742{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000743 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000744 if (qual_type_bit_size == bit_size)
745 return true;
746 return false;
747}
Greg Clayton56939cb2015-09-17 22:23:34 +0000748
Greg Claytona1e5dc82015-08-11 22:53:00 +0000749CompilerType
Greg Clayton56939cb2015-09-17 22:23:34 +0000750ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, size_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000751{
Greg Clayton57ee3062013-07-11 22:46:58 +0000752 return ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (getASTContext(), encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000753}
754
Greg Claytona1e5dc82015-08-11 22:53:00 +0000755CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +0000756ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000757{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000758 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +0000759 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000760 switch (encoding)
761 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000762 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000763 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000764 return CompilerType (ast, ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000765 break;
766
Greg Claytonc86103d2010-08-05 01:57:25 +0000767 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000768 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000769 return CompilerType (ast, ast->UnsignedCharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000770 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000771 return CompilerType (ast, ast->UnsignedShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000772 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000773 return CompilerType (ast, ast->UnsignedIntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000774 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000775 return CompilerType (ast, ast->UnsignedLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000776 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000777 return CompilerType (ast, ast->UnsignedLongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000778 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000779 return CompilerType (ast, ast->UnsignedInt128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000780 break;
781
Greg Claytonc86103d2010-08-05 01:57:25 +0000782 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000783 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000784 return CompilerType (ast, ast->CharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000785 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000786 return CompilerType (ast, ast->ShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000787 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000788 return CompilerType (ast, ast->IntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000789 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000790 return CompilerType (ast, ast->LongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000791 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000792 return CompilerType (ast, ast->LongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000793 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000794 return CompilerType (ast, ast->Int128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000795 break;
796
Greg Claytonc86103d2010-08-05 01:57:25 +0000797 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000798 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000799 return CompilerType (ast, ast->FloatTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000800 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000801 return CompilerType (ast, ast->DoubleTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000802 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000803 return CompilerType (ast, ast->LongDoubleTy);
Greg Claytondee40e72015-11-03 23:23:22 +0000804 if (QualTypeMatchesBitSize (bit_size, ast, ast->HalfTy))
805 return CompilerType (ast, ast->HalfTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000806 break;
807
Greg Claytonc86103d2010-08-05 01:57:25 +0000808 case eEncodingVector:
Johnny Chenc79c93a2012-03-07 01:12:24 +0000809 // Sanity check that bit_size is a multiple of 8's.
810 if (bit_size && !(bit_size & 0x7u))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000811 return CompilerType (ast, ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8));
Johnny Chenc79c93a2012-03-07 01:12:24 +0000812 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000813 }
814
Greg Claytona1e5dc82015-08-11 22:53:00 +0000815 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000816}
817
Greg Clayton57ee3062013-07-11 22:46:58 +0000818
819
820lldb::BasicType
821ClangASTContext::GetBasicTypeEnumeration (const ConstString &name)
822{
823 if (name)
824 {
825 typedef UniqueCStringMap<lldb::BasicType> TypeNameToBasicTypeMap;
826 static TypeNameToBasicTypeMap g_type_map;
827 static std::once_flag g_once_flag;
828 std::call_once(g_once_flag, [](){
829 // "void"
830 g_type_map.Append(ConstString("void").GetCString(), eBasicTypeVoid);
831
832 // "char"
833 g_type_map.Append(ConstString("char").GetCString(), eBasicTypeChar);
834 g_type_map.Append(ConstString("signed char").GetCString(), eBasicTypeSignedChar);
835 g_type_map.Append(ConstString("unsigned char").GetCString(), eBasicTypeUnsignedChar);
836 g_type_map.Append(ConstString("wchar_t").GetCString(), eBasicTypeWChar);
837 g_type_map.Append(ConstString("signed wchar_t").GetCString(), eBasicTypeSignedWChar);
838 g_type_map.Append(ConstString("unsigned wchar_t").GetCString(), eBasicTypeUnsignedWChar);
839 // "short"
840 g_type_map.Append(ConstString("short").GetCString(), eBasicTypeShort);
841 g_type_map.Append(ConstString("short int").GetCString(), eBasicTypeShort);
842 g_type_map.Append(ConstString("unsigned short").GetCString(), eBasicTypeUnsignedShort);
843 g_type_map.Append(ConstString("unsigned short int").GetCString(), eBasicTypeUnsignedShort);
844
845 // "int"
846 g_type_map.Append(ConstString("int").GetCString(), eBasicTypeInt);
847 g_type_map.Append(ConstString("signed int").GetCString(), eBasicTypeInt);
848 g_type_map.Append(ConstString("unsigned int").GetCString(), eBasicTypeUnsignedInt);
849 g_type_map.Append(ConstString("unsigned").GetCString(), eBasicTypeUnsignedInt);
850
851 // "long"
852 g_type_map.Append(ConstString("long").GetCString(), eBasicTypeLong);
853 g_type_map.Append(ConstString("long int").GetCString(), eBasicTypeLong);
854 g_type_map.Append(ConstString("unsigned long").GetCString(), eBasicTypeUnsignedLong);
855 g_type_map.Append(ConstString("unsigned long int").GetCString(), eBasicTypeUnsignedLong);
856
857 // "long long"
858 g_type_map.Append(ConstString("long long").GetCString(), eBasicTypeLongLong);
859 g_type_map.Append(ConstString("long long int").GetCString(), eBasicTypeLongLong);
860 g_type_map.Append(ConstString("unsigned long long").GetCString(), eBasicTypeUnsignedLongLong);
861 g_type_map.Append(ConstString("unsigned long long int").GetCString(), eBasicTypeUnsignedLongLong);
862
863 // "int128"
864 g_type_map.Append(ConstString("__int128_t").GetCString(), eBasicTypeInt128);
865 g_type_map.Append(ConstString("__uint128_t").GetCString(), eBasicTypeUnsignedInt128);
866
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000867 // Miscellaneous
Greg Clayton57ee3062013-07-11 22:46:58 +0000868 g_type_map.Append(ConstString("bool").GetCString(), eBasicTypeBool);
869 g_type_map.Append(ConstString("float").GetCString(), eBasicTypeFloat);
870 g_type_map.Append(ConstString("double").GetCString(), eBasicTypeDouble);
871 g_type_map.Append(ConstString("long double").GetCString(), eBasicTypeLongDouble);
872 g_type_map.Append(ConstString("id").GetCString(), eBasicTypeObjCID);
873 g_type_map.Append(ConstString("SEL").GetCString(), eBasicTypeObjCSel);
874 g_type_map.Append(ConstString("nullptr").GetCString(), eBasicTypeNullPtr);
875 g_type_map.Sort();
876 });
877
878 return g_type_map.Find(name.GetCString(), eBasicTypeInvalid);
879 }
880 return eBasicTypeInvalid;
881}
882
Greg Claytona1e5dc82015-08-11 22:53:00 +0000883CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000884ClangASTContext::GetBasicType (ASTContext *ast, const ConstString &name)
885{
886 if (ast)
887 {
888 lldb::BasicType basic_type = ClangASTContext::GetBasicTypeEnumeration (name);
889 return ClangASTContext::GetBasicType (ast, basic_type);
890 }
Greg Claytona1e5dc82015-08-11 22:53:00 +0000891 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +0000892}
893
894uint32_t
895ClangASTContext::GetPointerByteSize ()
896{
897 if (m_pointer_byte_size == 0)
Enrico Granata1cd5e922015-01-28 00:07:51 +0000898 m_pointer_byte_size = GetBasicType(lldb::eBasicTypeVoid).GetPointerType().GetByteSize(nullptr);
Greg Clayton57ee3062013-07-11 22:46:58 +0000899 return m_pointer_byte_size;
900}
901
Greg Claytona1e5dc82015-08-11 22:53:00 +0000902CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000903ClangASTContext::GetBasicType (lldb::BasicType basic_type)
904{
905 return GetBasicType (getASTContext(), basic_type);
906}
907
Greg Claytona1e5dc82015-08-11 22:53:00 +0000908CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000909ClangASTContext::GetBasicType (ASTContext *ast, lldb::BasicType basic_type)
910{
911 if (ast)
912 {
Bruce Mitchener48ea9002015-09-23 00:18:24 +0000913 lldb::opaque_compiler_type_t clang_type = nullptr;
Greg Clayton57ee3062013-07-11 22:46:58 +0000914
915 switch (basic_type)
916 {
917 case eBasicTypeInvalid:
918 case eBasicTypeOther:
919 break;
920 case eBasicTypeVoid:
921 clang_type = ast->VoidTy.getAsOpaquePtr();
922 break;
923 case eBasicTypeChar:
924 clang_type = ast->CharTy.getAsOpaquePtr();
925 break;
926 case eBasicTypeSignedChar:
927 clang_type = ast->SignedCharTy.getAsOpaquePtr();
928 break;
929 case eBasicTypeUnsignedChar:
930 clang_type = ast->UnsignedCharTy.getAsOpaquePtr();
931 break;
932 case eBasicTypeWChar:
933 clang_type = ast->getWCharType().getAsOpaquePtr();
934 break;
935 case eBasicTypeSignedWChar:
936 clang_type = ast->getSignedWCharType().getAsOpaquePtr();
937 break;
938 case eBasicTypeUnsignedWChar:
939 clang_type = ast->getUnsignedWCharType().getAsOpaquePtr();
940 break;
941 case eBasicTypeChar16:
942 clang_type = ast->Char16Ty.getAsOpaquePtr();
943 break;
944 case eBasicTypeChar32:
945 clang_type = ast->Char32Ty.getAsOpaquePtr();
946 break;
947 case eBasicTypeShort:
948 clang_type = ast->ShortTy.getAsOpaquePtr();
949 break;
950 case eBasicTypeUnsignedShort:
951 clang_type = ast->UnsignedShortTy.getAsOpaquePtr();
952 break;
953 case eBasicTypeInt:
954 clang_type = ast->IntTy.getAsOpaquePtr();
955 break;
956 case eBasicTypeUnsignedInt:
957 clang_type = ast->UnsignedIntTy.getAsOpaquePtr();
958 break;
959 case eBasicTypeLong:
960 clang_type = ast->LongTy.getAsOpaquePtr();
961 break;
962 case eBasicTypeUnsignedLong:
963 clang_type = ast->UnsignedLongTy.getAsOpaquePtr();
964 break;
965 case eBasicTypeLongLong:
966 clang_type = ast->LongLongTy.getAsOpaquePtr();
967 break;
968 case eBasicTypeUnsignedLongLong:
969 clang_type = ast->UnsignedLongLongTy.getAsOpaquePtr();
970 break;
971 case eBasicTypeInt128:
972 clang_type = ast->Int128Ty.getAsOpaquePtr();
973 break;
974 case eBasicTypeUnsignedInt128:
975 clang_type = ast->UnsignedInt128Ty.getAsOpaquePtr();
976 break;
977 case eBasicTypeBool:
978 clang_type = ast->BoolTy.getAsOpaquePtr();
979 break;
980 case eBasicTypeHalf:
981 clang_type = ast->HalfTy.getAsOpaquePtr();
982 break;
983 case eBasicTypeFloat:
984 clang_type = ast->FloatTy.getAsOpaquePtr();
985 break;
986 case eBasicTypeDouble:
987 clang_type = ast->DoubleTy.getAsOpaquePtr();
988 break;
989 case eBasicTypeLongDouble:
990 clang_type = ast->LongDoubleTy.getAsOpaquePtr();
991 break;
992 case eBasicTypeFloatComplex:
993 clang_type = ast->FloatComplexTy.getAsOpaquePtr();
994 break;
995 case eBasicTypeDoubleComplex:
996 clang_type = ast->DoubleComplexTy.getAsOpaquePtr();
997 break;
998 case eBasicTypeLongDoubleComplex:
999 clang_type = ast->LongDoubleComplexTy.getAsOpaquePtr();
1000 break;
1001 case eBasicTypeObjCID:
1002 clang_type = ast->getObjCIdType().getAsOpaquePtr();
1003 break;
1004 case eBasicTypeObjCClass:
1005 clang_type = ast->getObjCClassType().getAsOpaquePtr();
1006 break;
1007 case eBasicTypeObjCSel:
1008 clang_type = ast->getObjCSelType().getAsOpaquePtr();
1009 break;
1010 case eBasicTypeNullPtr:
1011 clang_type = ast->NullPtrTy.getAsOpaquePtr();
1012 break;
1013 }
1014
1015 if (clang_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001016 return CompilerType (GetASTContext(ast), clang_type);
Greg Clayton57ee3062013-07-11 22:46:58 +00001017 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001018 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +00001019}
1020
1021
Greg Claytona1e5dc82015-08-11 22:53:00 +00001022CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001023ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
1024{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001025 ASTContext *ast = getASTContext();
Sean Callanan38d4df52012-04-03 01:10:10 +00001026
1027#define streq(a,b) strcmp(a,b) == 0
Ed Masted4612ad2014-04-20 13:17:36 +00001028 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001029 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001030 {
1031 switch (dw_ate)
1032 {
Sean Callanan38d4df52012-04-03 01:10:10 +00001033 default:
1034 break;
Greg Clayton605684e2011-10-28 23:06:08 +00001035
Sean Callanan38d4df52012-04-03 01:10:10 +00001036 case DW_ATE_address:
1037 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001038 return CompilerType (ast, ast->VoidPtrTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001039 break;
1040
1041 case DW_ATE_boolean:
1042 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001043 return CompilerType (ast, ast->BoolTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001044 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001045 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001046 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001047 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001048 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001049 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001050 break;
1051
1052 case DW_ATE_lo_user:
1053 // This has been seen to mean DW_AT_complex_integer
1054 if (type_name)
Greg Clayton605684e2011-10-28 23:06:08 +00001055 {
Sean Callanan38d4df52012-04-03 01:10:10 +00001056 if (::strstr(type_name, "complex"))
1057 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001058 CompilerType complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
1059 return CompilerType (ast, ast->getComplexType (GetQualType(complex_int_clang_type)));
Sean Callanan38d4df52012-04-03 01:10:10 +00001060 }
Greg Clayton605684e2011-10-28 23:06:08 +00001061 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001062 break;
1063
1064 case DW_ATE_complex_float:
1065 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001066 return CompilerType (ast, ast->FloatComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001067 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001068 return CompilerType (ast, ast->DoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001069 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001070 return CompilerType (ast, ast->LongDoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001071 else
Greg Clayton605684e2011-10-28 23:06:08 +00001072 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001073 CompilerType complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
1074 return CompilerType (ast, ast->getComplexType (GetQualType(complex_float_clang_type)));
Greg Clayton605684e2011-10-28 23:06:08 +00001075 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001076 break;
1077
1078 case DW_ATE_float:
Greg Clayton8012cad2014-11-17 19:39:20 +00001079 if (streq(type_name, "float") && QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001080 return CompilerType (ast, ast->FloatTy);
Greg Clayton8012cad2014-11-17 19:39:20 +00001081 if (streq(type_name, "double") && QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001082 return CompilerType (ast, ast->DoubleTy);
Greg Clayton8012cad2014-11-17 19:39:20 +00001083 if (streq(type_name, "long double") && QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001084 return CompilerType (ast, ast->LongDoubleTy);
Bruce Mitchenere171da52015-07-22 00:16:02 +00001085 // Fall back to not requiring a name match
Sean Callanan38d4df52012-04-03 01:10:10 +00001086 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001087 return CompilerType (ast, ast->FloatTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001088 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001089 return CompilerType (ast, ast->DoubleTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001090 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001091 return CompilerType (ast, ast->LongDoubleTy);
Greg Claytondee40e72015-11-03 23:23:22 +00001092 if (QualTypeMatchesBitSize (bit_size, ast, ast->HalfTy))
1093 return CompilerType (ast, ast->HalfTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001094 break;
1095
1096 case DW_ATE_signed:
1097 if (type_name)
1098 {
1099 if (streq(type_name, "wchar_t") &&
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001100 QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy) &&
Greg Clayton28eb7bf2015-05-07 00:07:44 +00001101 (getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001102 return CompilerType (ast, ast->WCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001103 if (streq(type_name, "void") &&
1104 QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001105 return CompilerType (ast, ast->VoidTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001106 if (strstr(type_name, "long long") &&
1107 QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001108 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001109 if (strstr(type_name, "long") &&
1110 QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001111 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001112 if (strstr(type_name, "short") &&
1113 QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001114 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001115 if (strstr(type_name, "char"))
1116 {
1117 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001118 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001119 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001120 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001121 }
1122 if (strstr(type_name, "int"))
1123 {
1124 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001125 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001126 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001127 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001128 }
1129 }
1130 // We weren't able to match up a type name, just search by size
1131 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001132 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001133 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001134 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001135 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001136 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001137 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001138 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001139 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001140 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001141 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001142 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001143 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001144
Sean Callanan38d4df52012-04-03 01:10:10 +00001145 case DW_ATE_signed_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001146 if (ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
Sean Callanan38d4df52012-04-03 01:10:10 +00001147 {
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001148 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001149 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001150 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001151 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001152 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001153 break;
1154
1155 case DW_ATE_unsigned:
1156 if (type_name)
1157 {
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001158 if (streq(type_name, "wchar_t"))
1159 {
1160 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
1161 {
Greg Clayton28eb7bf2015-05-07 00:07:44 +00001162 if (!(getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001163 return CompilerType (ast, ast->WCharTy);
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001164 }
1165 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001166 if (strstr(type_name, "long long"))
1167 {
1168 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001169 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001170 }
1171 else if (strstr(type_name, "long"))
1172 {
1173 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001174 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001175 }
1176 else if (strstr(type_name, "short"))
1177 {
1178 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001179 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001180 }
1181 else if (strstr(type_name, "char"))
1182 {
1183 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001184 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001185 }
1186 else if (strstr(type_name, "int"))
1187 {
1188 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001189 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001190 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001191 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001192 }
1193 }
1194 // We weren't able to match up a type name, just search by size
1195 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001196 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001197 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001198 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001199 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001200 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001201 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001202 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001203 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001204 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001205 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001206 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001207 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001208
Sean Callanan38d4df52012-04-03 01:10:10 +00001209 case DW_ATE_unsigned_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001210 if (!ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
1211 {
1212 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001213 return CompilerType (ast, ast->CharTy);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001214 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001215 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001216 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001217 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001218 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001219 break;
1220
1221 case DW_ATE_imaginary_float:
1222 break;
1223
1224 case DW_ATE_UTF:
1225 if (type_name)
1226 {
1227 if (streq(type_name, "char16_t"))
1228 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001229 return CompilerType (ast, ast->Char16Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001230 }
1231 else if (streq(type_name, "char32_t"))
1232 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001233 return CompilerType (ast, ast->Char32Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001234 }
1235 }
1236 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001237 }
1238 }
1239 // This assert should fire for anything that we don't catch above so we know
1240 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +00001241 if (type_name)
1242 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001243 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 +00001244 }
1245 else
1246 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001247 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 +00001248 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001249 return CompilerType ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001250}
1251
Greg Claytona1e5dc82015-08-11 22:53:00 +00001252CompilerType
Sean Callanan77502262011-05-12 23:54:16 +00001253ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
1254{
Greg Clayton57ee3062013-07-11 22:46:58 +00001255 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001256 return CompilerType (ast, ast->UnknownAnyTy);
1257 return CompilerType();
Sean Callanan77502262011-05-12 23:54:16 +00001258}
1259
Greg Claytona1e5dc82015-08-11 22:53:00 +00001260CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001261ClangASTContext::GetCStringType (bool is_const)
1262{
Greg Clayton57ee3062013-07-11 22:46:58 +00001263 ASTContext *ast = getASTContext();
1264 QualType char_type(ast->CharTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001265
1266 if (is_const)
1267 char_type.addConst();
1268
Greg Claytona1e5dc82015-08-11 22:53:00 +00001269 return CompilerType (ast, ast->getPointerType(char_type));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001270}
1271
Sean Callanan09ab4b72011-11-30 22:11:59 +00001272clang::DeclContext *
1273ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
1274{
1275 return ast->getTranslationUnitDecl();
1276}
1277
Greg Clayton526e5af2010-11-13 03:52:47 +00001278clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001279ClangASTContext::CopyDecl (ASTContext *dst_ast,
1280 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001281 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001282{
Sean Callanan79439e82010-11-18 02:56:27 +00001283 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001284 FileManager file_manager (file_system_options);
1285 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001286 *src_ast, file_manager,
1287 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001288
1289 return importer.Import(source_decl);
1290}
1291
Sean Callanan23a30272010-07-16 00:00:27 +00001292bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00001293ClangASTContext::AreTypesSame (CompilerType type1,
1294 CompilerType type2,
Greg Clayton84db9102012-03-26 23:03:23 +00001295 bool ignore_qualifiers)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001296{
Greg Claytonf73034f2015-09-08 18:15:05 +00001297 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type1.GetTypeSystem());
1298 if (!ast || ast != type2.GetTypeSystem())
Greg Clayton57ee3062013-07-11 22:46:58 +00001299 return false;
1300
1301 if (type1.GetOpaqueQualType() == type2.GetOpaqueQualType())
Greg Clayton55995eb2012-04-06 17:38:55 +00001302 return true;
1303
Greg Claytond8d4a572015-08-11 21:38:15 +00001304 QualType type1_qual = GetQualType(type1);
1305 QualType type2_qual = GetQualType(type2);
Sean Callanan5056ab02012-02-18 02:01:03 +00001306
1307 if (ignore_qualifiers)
1308 {
1309 type1_qual = type1_qual.getUnqualifiedType();
1310 type2_qual = type2_qual.getUnqualifiedType();
1311 }
1312
Greg Claytonf73034f2015-09-08 18:15:05 +00001313 return ast->getASTContext()->hasSameType (type1_qual, type2_qual);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001314}
1315
Greg Claytona1e5dc82015-08-11 22:53:00 +00001316CompilerType
Sean Callanan9998acd2014-12-05 01:21:59 +00001317ClangASTContext::GetTypeForDecl (clang::NamedDecl *decl)
1318{
1319 if (clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
1320 return GetTypeForDecl(interface_decl);
1321 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
1322 return GetTypeForDecl(tag_decl);
Greg Claytona1e5dc82015-08-11 22:53:00 +00001323 return CompilerType();
Sean Callanan9998acd2014-12-05 01:21:59 +00001324}
1325
Greg Clayton6beaaa62011-01-17 03:46:26 +00001326
Greg Claytona1e5dc82015-08-11 22:53:00 +00001327CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001328ClangASTContext::GetTypeForDecl (TagDecl *decl)
1329{
1330 // No need to call the getASTContext() accessor (which can create the AST
1331 // if it isn't created yet, because we can't have created a decl in this
1332 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001333 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001334 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001335 return CompilerType (ast, ast->getTagDeclType(decl));
1336 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001337}
1338
Greg Claytona1e5dc82015-08-11 22:53:00 +00001339CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001340ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1341{
1342 // No need to call the getASTContext() accessor (which can create the AST
1343 // if it isn't created yet, because we can't have created a decl in this
1344 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001345 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001346 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001347 return CompilerType (ast, ast->getObjCInterfaceType(decl));
1348 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001349}
1350
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001351#pragma mark Structure, Unions, Classes
1352
Greg Claytona1e5dc82015-08-11 22:53:00 +00001353CompilerType
Greg Claytonc4ffd662013-03-08 01:37:30 +00001354ClangASTContext::CreateRecordType (DeclContext *decl_ctx,
1355 AccessType access_type,
1356 const char *name,
1357 int kind,
1358 LanguageType language,
1359 ClangASTMetadata *metadata)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001360{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001361 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001362 assert (ast != nullptr);
Sean Callananad880762012-04-18 01:06:17 +00001363
Ed Masted4612ad2014-04-20 13:17:36 +00001364 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001365 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001366
Greg Clayton9e409562010-07-28 02:04:09 +00001367
Greg Claytone1be9962011-08-24 23:50:00 +00001368 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001369 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001370 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001371 bool isInternal = false;
Sean Callananad880762012-04-18 01:06:17 +00001372 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
Greg Clayton9e409562010-07-28 02:04:09 +00001373 }
1374
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001375 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1376 // we will need to update this code. I was told to currently always use
1377 // the CXXRecordDecl class since we often don't know from debug information
1378 // if something is struct or a class, so we default to always use the more
1379 // complete definition just in case.
Sean Callanan11e32d32014-02-18 00:31:38 +00001380
1381 bool is_anonymous = (!name) || (!name[0]);
1382
Greg Claytonf0705c82011-10-22 03:33:13 +00001383 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1384 (TagDecl::TagKind)kind,
1385 decl_ctx,
1386 SourceLocation(),
1387 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001388 is_anonymous ? nullptr : &ast->Idents.get(name));
Sean Callanan11e32d32014-02-18 00:31:38 +00001389
1390 if (is_anonymous)
1391 decl->setAnonymousStructOrUnion(true);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001392
Greg Claytonc4ffd662013-03-08 01:37:30 +00001393 if (decl)
Greg Clayton55561e92011-10-26 03:31:36 +00001394 {
Greg Claytonc4ffd662013-03-08 01:37:30 +00001395 if (metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001396 SetMetadata(ast, decl, *metadata);
Greg Claytonc4ffd662013-03-08 01:37:30 +00001397
Greg Clayton55561e92011-10-26 03:31:36 +00001398 if (access_type != eAccessNone)
1399 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Claytonc4ffd662013-03-08 01:37:30 +00001400
1401 if (decl_ctx)
1402 decl_ctx->addDecl (decl);
1403
Greg Claytona1e5dc82015-08-11 22:53:00 +00001404 return CompilerType(ast, ast->getTagDeclType(decl));
Greg Clayton55561e92011-10-26 03:31:36 +00001405 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001406 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001407}
1408
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001409static TemplateParameterList *
1410CreateTemplateParameterList (ASTContext *ast,
Sean Callanan3d654b32012-09-24 22:25:51 +00001411 const ClangASTContext::TemplateParameterInfos &template_param_infos,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001412 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1413{
1414 const bool parameter_pack = false;
1415 const bool is_typename = false;
1416 const unsigned depth = 0;
1417 const size_t num_template_params = template_param_infos.GetSize();
1418 for (size_t i=0; i<num_template_params; ++i)
1419 {
1420 const char *name = template_param_infos.names[i];
Greg Clayton283b2652013-04-23 22:38:02 +00001421
Ed Masted4612ad2014-04-20 13:17:36 +00001422 IdentifierInfo *identifier_info = nullptr;
Greg Clayton283b2652013-04-23 22:38:02 +00001423 if (name && name[0])
1424 identifier_info = &ast->Idents.get(name);
Sean Callanan3d654b32012-09-24 22:25:51 +00001425 if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001426 {
1427 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1428 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1429 SourceLocation(),
1430 SourceLocation(),
1431 depth,
1432 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001433 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001434 template_param_infos.args[i].getIntegralType(),
1435 parameter_pack,
Ed Masted4612ad2014-04-20 13:17:36 +00001436 nullptr));
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001437
1438 }
1439 else
1440 {
1441 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1442 ast->getTranslationUnitDecl(), // Is this the right decl context?
1443 SourceLocation(),
1444 SourceLocation(),
1445 depth,
1446 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001447 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001448 is_typename,
1449 parameter_pack));
1450 }
1451 }
1452
1453 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1454 SourceLocation(),
1455 SourceLocation(),
David Majnemer48a065d2015-12-27 07:16:55 +00001456 template_param_decls,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001457 SourceLocation());
1458 return template_param_list;
1459}
1460
1461clang::FunctionTemplateDecl *
1462ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1463 clang::FunctionDecl *func_decl,
1464 const char *name,
1465 const TemplateParameterInfos &template_param_infos)
1466{
1467// /// \brief Create a function template node.
1468 ASTContext *ast = getASTContext();
1469
1470 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1471
1472 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1473 template_param_infos,
1474 template_param_decls);
1475 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1476 decl_ctx,
1477 func_decl->getLocation(),
1478 func_decl->getDeclName(),
1479 template_param_list,
1480 func_decl);
1481
1482 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1483 i < template_param_decl_count;
1484 ++i)
1485 {
1486 // TODO: verify which decl context we should put template_param_decls into..
1487 template_param_decls[i]->setDeclContext (func_decl);
1488 }
1489
1490 return func_tmpl_decl;
1491}
1492
1493void
1494ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1495 clang::FunctionTemplateDecl *func_tmpl_decl,
1496 const TemplateParameterInfos &infos)
1497{
1498 TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1499 infos.args.data(),
1500 infos.args.size());
1501
1502 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1503 &template_args,
Ed Masted4612ad2014-04-20 13:17:36 +00001504 nullptr);
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001505}
1506
1507
Greg Claytonf0705c82011-10-22 03:33:13 +00001508ClassTemplateDecl *
1509ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001510 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001511 const char *class_name,
1512 int kind,
1513 const TemplateParameterInfos &template_param_infos)
1514{
1515 ASTContext *ast = getASTContext();
1516
Ed Masted4612ad2014-04-20 13:17:36 +00001517 ClassTemplateDecl *class_template_decl = nullptr;
1518 if (decl_ctx == nullptr)
Greg Claytonf0705c82011-10-22 03:33:13 +00001519 decl_ctx = ast->getTranslationUnitDecl();
1520
1521 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1522 DeclarationName decl_name (&identifier_info);
1523
1524 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001525
1526 for (NamedDecl *decl : result)
Greg Claytonf0705c82011-10-22 03:33:13 +00001527 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001528 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
Greg Claytonf0705c82011-10-22 03:33:13 +00001529 if (class_template_decl)
1530 return class_template_decl;
1531 }
1532
1533 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf0705c82011-10-22 03:33:13 +00001534
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001535 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1536 template_param_infos,
1537 template_param_decls);
Greg Claytonf0705c82011-10-22 03:33:13 +00001538
1539 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1540 (TagDecl::TagKind)kind,
1541 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1542 SourceLocation(),
1543 SourceLocation(),
1544 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001545
1546 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1547 i < template_param_decl_count;
1548 ++i)
1549 {
1550 template_param_decls[i]->setDeclContext (template_cxx_decl);
1551 }
1552
Sean Callananb5c79622011-11-19 01:35:08 +00001553 // With templated classes, we say that a class is templated with
1554 // specializations, but that the bare class has no functions.
Sean Callananfa4fab72013-02-01 06:55:48 +00001555 //template_cxx_decl->startDefinition();
1556 //template_cxx_decl->completeDefinition();
Sean Callananb5c79622011-11-19 01:35:08 +00001557
Greg Claytonf0705c82011-10-22 03:33:13 +00001558 class_template_decl = ClassTemplateDecl::Create (*ast,
1559 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1560 SourceLocation(),
1561 decl_name,
1562 template_param_list,
1563 template_cxx_decl,
Ed Masted4612ad2014-04-20 13:17:36 +00001564 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001565
1566 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001567 {
Greg Clayton55561e92011-10-26 03:31:36 +00001568 if (access_type != eAccessNone)
1569 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan5b26f272012-02-04 08:49:35 +00001570
1571 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1572 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1573
Greg Claytonf0705c82011-10-22 03:33:13 +00001574 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001575
1576#ifdef LLDB_CONFIGURATION_DEBUG
1577 VerifyDecl(class_template_decl);
1578#endif
1579 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001580
1581 return class_template_decl;
1582}
1583
1584
1585ClassTemplateSpecializationDecl *
1586ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1587 ClassTemplateDecl *class_template_decl,
1588 int kind,
1589 const TemplateParameterInfos &template_param_infos)
1590{
1591 ASTContext *ast = getASTContext();
1592 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1593 (TagDecl::TagKind)kind,
1594 decl_ctx,
1595 SourceLocation(),
1596 SourceLocation(),
1597 class_template_decl,
1598 &template_param_infos.args.front(),
1599 template_param_infos.args.size(),
Ed Masted4612ad2014-04-20 13:17:36 +00001600 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001601
Sean Callananfa4fab72013-02-01 06:55:48 +00001602 class_template_specialization_decl->setSpecializationKind(TSK_ExplicitSpecialization);
1603
Greg Claytonf0705c82011-10-22 03:33:13 +00001604 return class_template_specialization_decl;
1605}
1606
Greg Claytona1e5dc82015-08-11 22:53:00 +00001607CompilerType
Greg Claytonf0705c82011-10-22 03:33:13 +00001608ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1609{
1610 if (class_template_specialization_decl)
1611 {
1612 ASTContext *ast = getASTContext();
1613 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001614 return CompilerType(ast, ast->getTagDeclType(class_template_specialization_decl));
Greg Claytonf0705c82011-10-22 03:33:13 +00001615 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001616 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001617}
1618
Greg Clayton090d0982011-06-19 03:43:27 +00001619static inline bool
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001620check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001621{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001622 // Special-case call since it can take any number of operands
1623 if(op_kind == OO_Call)
1624 return true;
1625
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001626 // The parameter count doesn't include "this"
Greg Clayton090d0982011-06-19 03:43:27 +00001627 if (num_params == 0)
1628 return unary;
1629 if (num_params == 1)
1630 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001631 else
Greg Clayton090d0982011-06-19 03:43:27 +00001632 return false;
1633}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001634
Greg Clayton090d0982011-06-19 03:43:27 +00001635bool
1636ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1637{
Sean Callanan5b26f272012-02-04 08:49:35 +00001638 switch (op_kind)
1639 {
1640 default:
1641 break;
1642 // C++ standard allows any number of arguments to new/delete
1643 case OO_New:
1644 case OO_Array_New:
1645 case OO_Delete:
1646 case OO_Array_Delete:
1647 return true;
1648 }
1649
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001650#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 +00001651 switch (op_kind)
1652 {
1653#include "clang/Basic/OperatorKinds.def"
1654 default: break;
1655 }
1656 return false;
1657}
1658
Greg Clayton57ee3062013-07-11 22:46:58 +00001659clang::AccessSpecifier
1660ClangASTContext::UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs)
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001661{
1662 clang::AccessSpecifier ret = lhs;
1663
1664 // Make the access equal to the stricter of the field and the nested field's access
1665 switch (ret)
1666 {
1667 case clang::AS_none:
1668 break;
1669 case clang::AS_private:
1670 break;
1671 case clang::AS_protected:
1672 if (rhs == AS_private)
1673 ret = AS_private;
1674 break;
1675 case clang::AS_public:
1676 ret = rhs;
1677 break;
1678 }
1679
1680 return ret;
1681}
1682
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001683bool
1684ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1685{
1686 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1687}
1688
1689bool
1690ClangASTContext::FieldIsBitfield
1691(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001692 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001693 FieldDecl* field,
1694 uint32_t& bitfield_bit_size
1695)
1696{
Ed Masted4612ad2014-04-20 13:17:36 +00001697 if (ast == nullptr || field == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001698 return false;
1699
1700 if (field->isBitField())
1701 {
1702 Expr* bit_width_expr = field->getBitWidth();
1703 if (bit_width_expr)
1704 {
1705 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001706 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001707 {
1708 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1709 return true;
1710 }
1711 }
1712 }
1713 return false;
1714}
1715
1716bool
1717ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1718{
Ed Masted4612ad2014-04-20 13:17:36 +00001719 if (record_decl == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001720 return false;
1721
1722 if (!record_decl->field_empty())
1723 return true;
1724
1725 // No fields, lets check this is a CXX record and check the base classes
1726 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1727 if (cxx_record_decl)
1728 {
1729 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1730 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1731 base_class != base_class_end;
1732 ++base_class)
1733 {
1734 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1735 if (RecordHasFields(base_class_decl))
1736 return true;
1737 }
1738 }
1739 return false;
1740}
1741
Greg Clayton8cf05932010-07-22 18:30:50 +00001742#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001743
Greg Claytona1e5dc82015-08-11 22:53:00 +00001744CompilerType
Sean Callananad880762012-04-18 01:06:17 +00001745ClangASTContext::CreateObjCClass
Greg Clayton8cf05932010-07-22 18:30:50 +00001746(
1747 const char *name,
1748 DeclContext *decl_ctx,
1749 bool isForwardDecl,
Sean Callananad880762012-04-18 01:06:17 +00001750 bool isInternal,
Jim Ingham379397632012-10-27 02:54:13 +00001751 ClangASTMetadata *metadata
Greg Clayton8cf05932010-07-22 18:30:50 +00001752)
1753{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001754 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001755 assert (ast != nullptr);
Greg Clayton8cf05932010-07-22 18:30:50 +00001756 assert (name && name[0]);
Ed Masted4612ad2014-04-20 13:17:36 +00001757 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001758 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00001759
Greg Clayton6beaaa62011-01-17 03:46:26 +00001760 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001761 decl_ctx,
1762 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001763 &ast->Idents.get(name),
Ed Masted4612ad2014-04-20 13:17:36 +00001764 nullptr,
Pavel Labath67add942015-07-07 10:11:16 +00001765 nullptr,
Greg Clayton8cf05932010-07-22 18:30:50 +00001766 SourceLocation(),
Sean Callanan5b26f272012-02-04 08:49:35 +00001767 /*isForwardDecl,*/
Greg Clayton8cf05932010-07-22 18:30:50 +00001768 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00001769
Jim Ingham379397632012-10-27 02:54:13 +00001770 if (decl && metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001771 SetMetadata(ast, decl, *metadata);
Sean Callananad880762012-04-18 01:06:17 +00001772
Greg Claytona1e5dc82015-08-11 22:53:00 +00001773 return CompilerType (ast, ast->getObjCInterfaceType(decl));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001774}
1775
1776static inline bool
1777BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
1778{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001779 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001780}
1781
Greg Clayton57ee3062013-07-11 22:46:58 +00001782uint32_t
1783ClangASTContext::GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001784{
1785 uint32_t num_bases = 0;
1786 if (cxx_record_decl)
1787 {
1788 if (omit_empty_base_classes)
1789 {
1790 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1791 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1792 base_class != base_class_end;
1793 ++base_class)
1794 {
1795 // Skip empty base classes
1796 if (omit_empty_base_classes)
1797 {
1798 if (BaseSpecifierIsEmpty (base_class))
1799 continue;
1800 }
1801 ++num_bases;
1802 }
1803 }
1804 else
1805 num_bases = cxx_record_decl->getNumBases();
1806 }
1807 return num_bases;
1808}
1809
1810
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001811#pragma mark Namespace Declarations
1812
1813NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00001814ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001815{
Ed Masted4612ad2014-04-20 13:17:36 +00001816 NamespaceDecl *namespace_decl = nullptr;
Greg Clayton9d3d6882011-10-31 23:51:19 +00001817 ASTContext *ast = getASTContext();
1818 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
Ed Masted4612ad2014-04-20 13:17:36 +00001819 if (decl_ctx == nullptr)
Greg Clayton9d3d6882011-10-31 23:51:19 +00001820 decl_ctx = translation_unit_decl;
1821
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001822 if (name)
1823 {
Greg Clayton030a2042011-10-14 21:34:45 +00001824 IdentifierInfo &identifier_info = ast->Idents.get(name);
1825 DeclarationName decl_name (&identifier_info);
1826 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001827 for (NamedDecl *decl : result)
Greg Clayton030a2042011-10-14 21:34:45 +00001828 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001829 namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
Greg Clayton030a2042011-10-14 21:34:45 +00001830 if (namespace_decl)
1831 return namespace_decl;
1832 }
1833
Sean Callanan5b26f272012-02-04 08:49:35 +00001834 namespace_decl = NamespaceDecl::Create(*ast,
1835 decl_ctx,
1836 false,
1837 SourceLocation(),
1838 SourceLocation(),
1839 &identifier_info,
Ed Masted4612ad2014-04-20 13:17:36 +00001840 nullptr);
Greg Clayton030a2042011-10-14 21:34:45 +00001841
Greg Clayton9d3d6882011-10-31 23:51:19 +00001842 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001843 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001844 else
1845 {
1846 if (decl_ctx == translation_unit_decl)
1847 {
1848 namespace_decl = translation_unit_decl->getAnonymousNamespace();
1849 if (namespace_decl)
1850 return namespace_decl;
1851
Sean Callanan5b26f272012-02-04 08:49:35 +00001852 namespace_decl = NamespaceDecl::Create(*ast,
1853 decl_ctx,
1854 false,
1855 SourceLocation(),
1856 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001857 nullptr,
1858 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001859 translation_unit_decl->setAnonymousNamespace (namespace_decl);
1860 translation_unit_decl->addDecl (namespace_decl);
1861 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
1862 }
1863 else
1864 {
1865 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
1866 if (parent_namespace_decl)
1867 {
1868 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
1869 if (namespace_decl)
1870 return namespace_decl;
Sean Callanan5b26f272012-02-04 08:49:35 +00001871 namespace_decl = NamespaceDecl::Create(*ast,
1872 decl_ctx,
1873 false,
1874 SourceLocation(),
1875 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001876 nullptr,
1877 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001878 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
1879 parent_namespace_decl->addDecl (namespace_decl);
1880 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
1881 }
1882 else
1883 {
1884 // BAD!!!
1885 }
1886 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001887 }
1888#ifdef LLDB_CONFIGURATION_DEBUG
1889 VerifyDecl(namespace_decl);
1890#endif
Greg Clayton030a2042011-10-14 21:34:45 +00001891 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001892}
1893
Siva Chandra03ff5c82016-02-05 19:10:04 +00001894NamespaceDecl *
1895ClangASTContext::GetUniqueNamespaceDeclaration (clang::ASTContext *ast,
1896 const char *name,
1897 clang::DeclContext *decl_ctx)
1898{
1899 ClangASTContext *ast_ctx = ClangASTContext::GetASTContext(ast);
1900 if (ast_ctx == nullptr)
1901 return nullptr;
1902
1903 return ast_ctx->GetUniqueNamespaceDeclaration(name, decl_ctx);
1904}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001905
Paul Hermand628cbb2015-09-15 23:44:17 +00001906clang::BlockDecl *
1907ClangASTContext::CreateBlockDeclaration (clang::DeclContext *ctx)
1908{
1909 if (ctx != nullptr)
1910 {
1911 clang::BlockDecl *decl = clang::BlockDecl::Create(*getASTContext(), ctx, clang::SourceLocation());
1912 ctx->addDecl(decl);
1913 return decl;
1914 }
1915 return nullptr;
1916}
1917
Paul Hermanea188fc2015-09-16 18:48:30 +00001918clang::DeclContext *
1919FindLCABetweenDecls(clang::DeclContext *left, clang::DeclContext *right, clang::DeclContext *root)
1920{
1921 if (root == nullptr)
1922 return nullptr;
1923
1924 std::set<clang::DeclContext *> path_left;
1925 for (clang::DeclContext *d = left; d != nullptr; d = d->getParent())
1926 path_left.insert(d);
1927
1928 for (clang::DeclContext *d = right; d != nullptr; d = d->getParent())
1929 if (path_left.find(d) != path_left.end())
1930 return d;
1931
1932 return nullptr;
1933}
1934
Paul Hermand628cbb2015-09-15 23:44:17 +00001935clang::UsingDirectiveDecl *
1936ClangASTContext::CreateUsingDirectiveDeclaration (clang::DeclContext *decl_ctx, clang::NamespaceDecl *ns_decl)
1937{
1938 if (decl_ctx != nullptr && ns_decl != nullptr)
1939 {
Paul Hermanea188fc2015-09-16 18:48:30 +00001940 clang::TranslationUnitDecl *translation_unit = (clang::TranslationUnitDecl *)GetTranslationUnitDecl(getASTContext());
Paul Hermand628cbb2015-09-15 23:44:17 +00001941 clang::UsingDirectiveDecl *using_decl = clang::UsingDirectiveDecl::Create(*getASTContext(),
1942 decl_ctx,
1943 clang::SourceLocation(),
1944 clang::SourceLocation(),
1945 clang::NestedNameSpecifierLoc(),
1946 clang::SourceLocation(),
1947 ns_decl,
Paul Hermanea188fc2015-09-16 18:48:30 +00001948 FindLCABetweenDecls(decl_ctx, ns_decl, translation_unit));
Paul Hermand628cbb2015-09-15 23:44:17 +00001949 decl_ctx->addDecl(using_decl);
1950 return using_decl;
1951 }
1952 return nullptr;
1953}
1954
1955clang::UsingDecl *
1956ClangASTContext::CreateUsingDeclaration (clang::DeclContext *current_decl_ctx, clang::NamedDecl *target)
1957{
1958 if (current_decl_ctx != nullptr && target != nullptr)
1959 {
1960 clang::UsingDecl *using_decl = clang::UsingDecl::Create(*getASTContext(),
1961 current_decl_ctx,
1962 clang::SourceLocation(),
1963 clang::NestedNameSpecifierLoc(),
1964 clang::DeclarationNameInfo(),
1965 false);
1966 clang::UsingShadowDecl *shadow_decl = clang::UsingShadowDecl::Create(*getASTContext(),
1967 current_decl_ctx,
1968 clang::SourceLocation(),
1969 using_decl,
1970 target);
1971 using_decl->addShadowDecl(shadow_decl);
1972 current_decl_ctx->addDecl(using_decl);
1973 return using_decl;
1974 }
1975 return nullptr;
1976}
1977
1978clang::VarDecl *
1979ClangASTContext::CreateVariableDeclaration (clang::DeclContext *decl_context, const char *name, clang::QualType type)
1980{
1981 if (decl_context != nullptr)
1982 {
1983 clang::VarDecl *var_decl = clang::VarDecl::Create(*getASTContext(),
1984 decl_context,
1985 clang::SourceLocation(),
1986 clang::SourceLocation(),
1987 name && name[0] ? &getASTContext()->Idents.getOwn(name) : nullptr,
1988 type,
1989 nullptr,
1990 clang::SC_None);
1991 var_decl->setAccess(clang::AS_public);
1992 decl_context->addDecl(var_decl);
Paul Hermand628cbb2015-09-15 23:44:17 +00001993 return var_decl;
1994 }
1995 return nullptr;
1996}
1997
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001998#pragma mark Function Types
1999
2000FunctionDecl *
Greg Clayton57ee3062013-07-11 22:46:58 +00002001ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx,
2002 const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002003 const CompilerType &function_clang_type,
Greg Clayton57ee3062013-07-11 22:46:58 +00002004 int storage,
2005 bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002006{
Ed Masted4612ad2014-04-20 13:17:36 +00002007 FunctionDecl *func_decl = nullptr;
Greg Clayton147e1fa2011-10-14 22:47:18 +00002008 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002009 if (decl_ctx == nullptr)
Greg Clayton147e1fa2011-10-14 22:47:18 +00002010 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002011
Greg Clayton0d551042013-06-28 21:08:47 +00002012
2013 const bool hasWrittenPrototype = true;
2014 const bool isConstexprSpecified = false;
2015
Greg Clayton147e1fa2011-10-14 22:47:18 +00002016 if (name && name[0])
2017 {
2018 func_decl = FunctionDecl::Create (*ast,
2019 decl_ctx,
2020 SourceLocation(),
2021 SourceLocation(),
2022 DeclarationName (&ast->Idents.get(name)),
Greg Claytond8d4a572015-08-11 21:38:15 +00002023 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00002024 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00002025 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00002026 is_inline,
2027 hasWrittenPrototype,
2028 isConstexprSpecified);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002029 }
Greg Clayton147e1fa2011-10-14 22:47:18 +00002030 else
2031 {
2032 func_decl = FunctionDecl::Create (*ast,
2033 decl_ctx,
2034 SourceLocation(),
2035 SourceLocation(),
2036 DeclarationName (),
Greg Claytond8d4a572015-08-11 21:38:15 +00002037 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00002038 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00002039 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00002040 is_inline,
2041 hasWrittenPrototype,
2042 isConstexprSpecified);
Greg Clayton147e1fa2011-10-14 22:47:18 +00002043 }
2044 if (func_decl)
2045 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00002046
2047#ifdef LLDB_CONFIGURATION_DEBUG
2048 VerifyDecl(func_decl);
2049#endif
2050
Greg Clayton147e1fa2011-10-14 22:47:18 +00002051 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002052}
2053
Greg Claytona1e5dc82015-08-11 22:53:00 +00002054CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00002055ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002056 const CompilerType& result_type,
2057 const CompilerType *args,
Sean Callananc81256a2010-09-16 20:40:25 +00002058 unsigned num_args,
2059 bool is_variadic,
2060 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002061{
Ed Masted4612ad2014-04-20 13:17:36 +00002062 assert (ast != nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002063 std::vector<QualType> qual_type_args;
2064 for (unsigned i=0; i<num_args; ++i)
Greg Claytond8d4a572015-08-11 21:38:15 +00002065 qual_type_args.push_back (GetQualType(args[i]));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002066
2067 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00002068 FunctionProtoType::ExtProtoInfo proto_info;
2069 proto_info.Variadic = is_variadic;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00002070 proto_info.ExceptionSpec = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00002071 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00002072 proto_info.RefQualifier = RQ_None;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00002073
Greg Claytona1e5dc82015-08-11 22:53:00 +00002074 return CompilerType (ast, ast->getFunctionType (GetQualType(result_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00002075 qual_type_args,
Greg Claytond8d4a572015-08-11 21:38:15 +00002076 proto_info));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002077}
2078
2079ParmVarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00002080ClangASTContext::CreateParameterDeclaration (const char *name, const CompilerType &param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002081{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002082 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002083 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00002084 return ParmVarDecl::Create(*ast,
2085 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002086 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00002087 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00002088 name && name[0] ? &ast->Idents.get(name) : nullptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00002089 GetQualType(param_type),
Ed Masted4612ad2014-04-20 13:17:36 +00002090 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00002091 (clang::StorageClass)storage,
Ed Masted4612ad2014-04-20 13:17:36 +00002092 nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002093}
2094
2095void
2096ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
2097{
2098 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00002099 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002100}
2101
2102
2103#pragma mark Array Types
2104
Greg Claytona1e5dc82015-08-11 22:53:00 +00002105CompilerType
2106ClangASTContext::CreateArrayType (const CompilerType &element_type,
Greg Clayton1c8ef472013-04-05 23:27:21 +00002107 size_t element_count,
2108 bool is_vector)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002109{
Greg Clayton57ee3062013-07-11 22:46:58 +00002110 if (element_type.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002111 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002112 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002113 assert (ast != nullptr);
Greg Clayton4ef877f2012-12-06 02:33:54 +00002114
Greg Clayton1c8ef472013-04-05 23:27:21 +00002115 if (is_vector)
2116 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00002117 return CompilerType (ast, ast->getExtVectorType(GetQualType(element_type), element_count));
Greg Clayton4ef877f2012-12-06 02:33:54 +00002118 }
2119 else
2120 {
Greg Clayton1c8ef472013-04-05 23:27:21 +00002121
2122 llvm::APInt ap_element_count (64, element_count);
2123 if (element_count == 0)
2124 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00002125 return CompilerType (ast, ast->getIncompleteArrayType (GetQualType(element_type),
Ewan Crawfordd0d85d22016-01-14 12:18:09 +00002126 clang::ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00002127 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00002128 }
2129 else
2130 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00002131 return CompilerType (ast, ast->getConstantArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00002132 ap_element_count,
Ewan Crawfordd0d85d22016-01-14 12:18:09 +00002133 clang::ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00002134 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00002135 }
Greg Clayton4ef877f2012-12-06 02:33:54 +00002136 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002137 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002138 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002139}
2140
Greg Claytona1e5dc82015-08-11 22:53:00 +00002141CompilerType
Enrico Granata76b08d52014-10-29 23:08:02 +00002142ClangASTContext::GetOrCreateStructForIdentifier (const ConstString &type_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002143 const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields,
Enrico Granataa449e862014-10-30 00:53:28 +00002144 bool packed)
Enrico Granata76b08d52014-10-29 23:08:02 +00002145{
Greg Claytona1e5dc82015-08-11 22:53:00 +00002146 CompilerType type;
Enrico Granata76b08d52014-10-29 23:08:02 +00002147 if ((type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
2148 return type;
2149 type = CreateRecordType(nullptr, lldb::eAccessPublic, type_name.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC);
Greg Claytond8d4a572015-08-11 21:38:15 +00002150 StartTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00002151 for (const auto& field : type_fields)
Greg Claytond8d4a572015-08-11 21:38:15 +00002152 AddFieldToRecordType(type, field.first, field.second, lldb::eAccessPublic, 0);
Enrico Granataa449e862014-10-30 00:53:28 +00002153 if (packed)
Greg Claytond8d4a572015-08-11 21:38:15 +00002154 SetIsPacked(type);
2155 CompleteTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00002156 return type;
2157}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002158
2159#pragma mark Enumeration Types
2160
Greg Claytona1e5dc82015-08-11 22:53:00 +00002161CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00002162ClangASTContext::CreateEnumerationType
Greg Claytonca512b32011-01-14 04:54:56 +00002163(
Greg Claytond8d4a572015-08-11 21:38:15 +00002164 const char *name,
2165 DeclContext *decl_ctx,
2166 const Declaration &decl,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002167 const CompilerType &integer_clang_type
Greg Claytond8d4a572015-08-11 21:38:15 +00002168 )
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002169{
2170 // TODO: Do something intelligent with the Declaration object passed in
2171 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00002172 ASTContext *ast = getASTContext();
Greg Claytond8d4a572015-08-11 21:38:15 +00002173
Greg Claytone02b8502010-10-12 04:29:14 +00002174 // TODO: ask about these...
Greg Claytond8d4a572015-08-11 21:38:15 +00002175 // const bool IsScoped = false;
2176 // const bool IsFixed = false;
2177
Greg Clayton6beaaa62011-01-17 03:46:26 +00002178 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00002179 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00002180 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00002181 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00002182 name && name[0] ? &ast->Idents.get(name) : nullptr,
2183 nullptr,
Sean Callanan48114472010-12-13 01:26:27 +00002184 false, // IsScoped
2185 false, // IsScopedUsingClassTag
2186 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00002187
2188
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002189 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00002190 {
2191 // TODO: check if we should be setting the promotion type too?
Greg Claytond8d4a572015-08-11 21:38:15 +00002192 enum_decl->setIntegerType(GetQualType(integer_clang_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00002193
2194 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
2195
Greg Claytona1e5dc82015-08-11 22:53:00 +00002196 return CompilerType (ast, ast->getTagDeclType(enum_decl));
Greg Clayton83ff3892010-09-12 23:17:56 +00002197 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002198 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002199}
2200
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002201// Disable this for now since I can't seem to get a nicely formatted float
2202// out of the APFloat class without just getting the float, double or quad
2203// and then using a formatted print on it which defeats the purpose. We ideally
2204// would like to get perfect string values for any kind of float semantics
2205// so we can support remote targets. The code below also requires a patch to
2206// llvm::APInt.
2207//bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002208//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 +00002209//{
2210// uint32_t count = 0;
2211// bool is_complex = false;
2212// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
2213// {
2214// unsigned num_bytes_per_float = byte_size / count;
2215// unsigned num_bits_per_float = num_bytes_per_float * 8;
2216//
2217// float_str.clear();
2218// uint32_t i;
2219// for (i=0; i<count; i++)
2220// {
2221// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
2222// bool is_ieee = false;
2223// APFloat ap_float(ap_int, is_ieee);
2224// char s[1024];
2225// unsigned int hex_digits = 0;
2226// bool upper_case = false;
2227//
2228// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
2229// {
2230// if (i > 0)
2231// float_str.append(", ");
2232// float_str.append(s);
2233// if (i == 1 && is_complex)
2234// float_str.append(1, 'i');
2235// }
2236// }
2237// return !float_str.empty();
2238// }
2239// return false;
2240//}
2241
Greg Claytona1e5dc82015-08-11 22:53:00 +00002242CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002243ClangASTContext::GetIntTypeFromBitSize (clang::ASTContext *ast,
2244 size_t bit_size, bool is_signed)
2245{
2246 if (ast)
2247 {
2248 if (is_signed)
2249 {
2250 if (bit_size == ast->getTypeSize(ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002251 return CompilerType(ast, ast->SignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002252
2253 if (bit_size == ast->getTypeSize(ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002254 return CompilerType(ast, ast->ShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002255
2256 if (bit_size == ast->getTypeSize(ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002257 return CompilerType(ast, ast->IntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002258
2259 if (bit_size == ast->getTypeSize(ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002260 return CompilerType(ast, ast->LongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002261
2262 if (bit_size == ast->getTypeSize(ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002263 return CompilerType(ast, ast->LongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002264
2265 if (bit_size == ast->getTypeSize(ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002266 return CompilerType(ast, ast->Int128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002267 }
2268 else
2269 {
2270 if (bit_size == ast->getTypeSize(ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002271 return CompilerType(ast, ast->UnsignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002272
2273 if (bit_size == ast->getTypeSize(ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002274 return CompilerType(ast, ast->UnsignedShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002275
2276 if (bit_size == ast->getTypeSize(ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002277 return CompilerType(ast, ast->UnsignedIntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002278
2279 if (bit_size == ast->getTypeSize(ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002280 return CompilerType(ast, ast->UnsignedLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002281
2282 if (bit_size == ast->getTypeSize(ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002283 return CompilerType(ast, ast->UnsignedLongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002284
2285 if (bit_size == ast->getTypeSize(ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002286 return CompilerType(ast, ast->UnsignedInt128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002287 }
2288 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002289 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002290}
2291
Greg Claytona1e5dc82015-08-11 22:53:00 +00002292CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002293ClangASTContext::GetPointerSizedIntType (clang::ASTContext *ast, bool is_signed)
2294{
2295 if (ast)
2296 return GetIntTypeFromBitSize(ast, ast->getTypeSize(ast->VoidPtrTy), is_signed);
Greg Claytona1e5dc82015-08-11 22:53:00 +00002297 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002298}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002299
Greg Claytone6b36cd2015-12-08 01:02:08 +00002300void
2301ClangASTContext::DumpDeclContextHiearchy (clang::DeclContext *decl_ctx)
2302{
2303 if (decl_ctx)
2304 {
2305 DumpDeclContextHiearchy (decl_ctx->getParent());
2306
2307 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl_ctx);
2308 if (named_decl)
2309 {
2310 printf ("%20s: %s\n", decl_ctx->getDeclKindName(), named_decl->getDeclName().getAsString().c_str());
2311 }
2312 else
2313 {
2314 printf ("%20s\n", decl_ctx->getDeclKindName());
2315 }
2316 }
2317}
2318
2319void
2320ClangASTContext::DumpDeclHiearchy (clang::Decl *decl)
2321{
2322 if (decl == nullptr)
2323 return;
2324 DumpDeclContextHiearchy(decl->getDeclContext());
2325
2326 clang::RecordDecl *record_decl = llvm::dyn_cast<clang::RecordDecl>(decl);
2327 if (record_decl)
2328 {
2329 printf ("%20s: %s%s\n", decl->getDeclKindName(), record_decl->getDeclName().getAsString().c_str(), record_decl->isInjectedClassName() ? " (injected class name)" : "");
2330
2331 }
2332 else
2333 {
2334 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl);
2335 if (named_decl)
2336 {
2337 printf ("%20s: %s\n", decl->getDeclKindName(), named_decl->getDeclName().getAsString().c_str());
2338 }
2339 else
2340 {
2341 printf ("%20s\n", decl->getDeclKindName());
2342 }
2343 }
2344}
2345
2346bool
2347ClangASTContext::DeclsAreEquivalent (clang::Decl *lhs_decl, clang::Decl *rhs_decl)
2348{
2349 if (lhs_decl && rhs_decl)
2350 {
2351 //----------------------------------------------------------------------
2352 // Make sure the decl kinds match first
2353 //----------------------------------------------------------------------
2354 const clang::Decl::Kind lhs_decl_kind = lhs_decl->getKind();
2355 const clang::Decl::Kind rhs_decl_kind = rhs_decl->getKind();
2356
2357 if (lhs_decl_kind == rhs_decl_kind)
2358 {
2359 //------------------------------------------------------------------
2360 // Now check that the decl contexts kinds are all equivalent
2361 // before we have to check any names of the decl contexts...
2362 //------------------------------------------------------------------
2363 clang::DeclContext *lhs_decl_ctx = lhs_decl->getDeclContext();
2364 clang::DeclContext *rhs_decl_ctx = rhs_decl->getDeclContext();
2365 if (lhs_decl_ctx && rhs_decl_ctx)
2366 {
2367 while (1)
2368 {
2369 if (lhs_decl_ctx && rhs_decl_ctx)
2370 {
2371 const clang::Decl::Kind lhs_decl_ctx_kind = lhs_decl_ctx->getDeclKind();
2372 const clang::Decl::Kind rhs_decl_ctx_kind = rhs_decl_ctx->getDeclKind();
2373 if (lhs_decl_ctx_kind == rhs_decl_ctx_kind)
2374 {
2375 lhs_decl_ctx = lhs_decl_ctx->getParent();
2376 rhs_decl_ctx = rhs_decl_ctx->getParent();
2377
2378 if (lhs_decl_ctx == nullptr && rhs_decl_ctx == nullptr)
2379 break;
2380 }
2381 else
2382 return false;
2383 }
2384 else
2385 return false;
2386 }
2387
2388 //--------------------------------------------------------------
2389 // Now make sure the name of the decls match
2390 //--------------------------------------------------------------
2391 clang::NamedDecl *lhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(lhs_decl);
2392 clang::NamedDecl *rhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(rhs_decl);
2393 if (lhs_named_decl && rhs_named_decl)
2394 {
2395 clang::DeclarationName lhs_decl_name = lhs_named_decl->getDeclName();
2396 clang::DeclarationName rhs_decl_name = rhs_named_decl->getDeclName();
2397 if (lhs_decl_name.getNameKind() == rhs_decl_name.getNameKind())
2398 {
2399 if (lhs_decl_name.getAsString() != rhs_decl_name.getAsString())
2400 return false;
2401 }
2402 else
2403 return false;
2404 }
2405 else
2406 return false;
2407
2408 //--------------------------------------------------------------
2409 // We know that the decl context kinds all match, so now we need
2410 // to make sure the names match as well
2411 //--------------------------------------------------------------
2412 lhs_decl_ctx = lhs_decl->getDeclContext();
2413 rhs_decl_ctx = rhs_decl->getDeclContext();
2414 while (1)
2415 {
2416 switch (lhs_decl_ctx->getDeclKind())
2417 {
2418 case clang::Decl::TranslationUnit:
2419 // We don't care about the translation unit names
2420 return true;
2421 default:
2422 {
2423 clang::NamedDecl *lhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(lhs_decl_ctx);
2424 clang::NamedDecl *rhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(rhs_decl_ctx);
2425 if (lhs_named_decl && rhs_named_decl)
2426 {
2427 clang::DeclarationName lhs_decl_name = lhs_named_decl->getDeclName();
2428 clang::DeclarationName rhs_decl_name = rhs_named_decl->getDeclName();
2429 if (lhs_decl_name.getNameKind() == rhs_decl_name.getNameKind())
2430 {
2431 if (lhs_decl_name.getAsString() != rhs_decl_name.getAsString())
2432 return false;
2433 }
2434 else
2435 return false;
2436 }
2437 else
2438 return false;
2439 }
2440 break;
2441
2442 }
2443 lhs_decl_ctx = lhs_decl_ctx->getParent();
2444 rhs_decl_ctx = rhs_decl_ctx->getParent();
2445 }
2446 }
2447 }
2448 }
2449 return false;
2450}
Enrico Granata86027e92012-03-24 01:11:14 +00002451bool
Greg Claytona2721472011-06-25 00:44:06 +00002452ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
2453 clang::Decl *decl)
2454{
2455 if (!decl)
2456 return false;
2457
2458 ExternalASTSource *ast_source = ast->getExternalSource();
2459
2460 if (!ast_source)
2461 return false;
2462
2463 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
2464 {
Greg Clayton219cf312012-03-30 00:51:13 +00002465 if (tag_decl->isCompleteDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002466 return true;
2467
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00002468 if (!tag_decl->hasExternalLexicalStorage())
2469 return false;
2470
Greg Claytona2721472011-06-25 00:44:06 +00002471 ast_source->CompleteType(tag_decl);
2472
2473 return !tag_decl->getTypeForDecl()->isIncompleteType();
2474 }
2475 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
2476 {
Sean Callanan5b26f272012-02-04 08:49:35 +00002477 if (objc_interface_decl->getDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002478 return true;
2479
2480 if (!objc_interface_decl->hasExternalLexicalStorage())
2481 return false;
2482
2483 ast_source->CompleteType(objc_interface_decl);
2484
Sean Callanan5b26f272012-02-04 08:49:35 +00002485 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytona2721472011-06-25 00:44:06 +00002486 }
2487 else
2488 {
2489 return false;
2490 }
2491}
2492
Sean Callanan60217122012-04-13 00:10:03 +00002493void
Greg Claytond0029442013-03-27 01:48:02 +00002494ClangASTContext::SetMetadataAsUserID (const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002495 user_id_t user_id)
2496{
2497 ClangASTMetadata meta_data;
2498 meta_data.SetUserID (user_id);
2499 SetMetadata (object, meta_data);
2500}
2501
2502void
Sean Callanan60217122012-04-13 00:10:03 +00002503ClangASTContext::SetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002504 const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002505 ClangASTMetadata &metadata)
Sean Callanan60217122012-04-13 00:10:03 +00002506{
2507 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002508 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002509
2510 if (external_source)
2511 external_source->SetMetadata(object, metadata);
2512}
2513
Jim Ingham379397632012-10-27 02:54:13 +00002514ClangASTMetadata *
Sean Callanan60217122012-04-13 00:10:03 +00002515ClangASTContext::GetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002516 const void *object)
Sean Callanan60217122012-04-13 00:10:03 +00002517{
2518 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002519 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002520
2521 if (external_source && external_source->HasMetadata(object))
2522 return external_source->GetMetadata(object);
2523 else
Ed Masted4612ad2014-04-20 13:17:36 +00002524 return nullptr;
Sean Callanan60217122012-04-13 00:10:03 +00002525}
2526
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002527clang::DeclContext *
2528ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
2529{
Sean Callanana87bee82011-08-19 06:19:25 +00002530 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002531}
2532
2533clang::DeclContext *
2534ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
2535{
Sean Callanana87bee82011-08-19 06:19:25 +00002536 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002537}
2538
Greg Claytond8d4a572015-08-11 21:38:15 +00002539bool
2540ClangASTContext::SetTagTypeKind (clang::QualType tag_qual_type, int kind) const
2541{
2542 const clang::Type *clang_type = tag_qual_type.getTypePtr();
2543 if (clang_type)
2544 {
2545 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(clang_type);
2546 if (tag_type)
2547 {
2548 clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(tag_type->getDecl());
2549 if (tag_decl)
2550 {
2551 tag_decl->setTagKind ((clang::TagDecl::TagKind)kind);
2552 return true;
2553 }
2554 }
2555 }
2556 return false;
2557}
2558
2559
2560bool
2561ClangASTContext::SetDefaultAccessForRecordFields (clang::RecordDecl* record_decl,
2562 int default_accessibility,
2563 int *assigned_accessibilities,
2564 size_t num_assigned_accessibilities)
2565{
2566 if (record_decl)
2567 {
2568 uint32_t field_idx;
2569 clang::RecordDecl::field_iterator field, field_end;
2570 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2571 field != field_end;
2572 ++field, ++field_idx)
2573 {
2574 // If no accessibility was assigned, assign the correct one
2575 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2576 field->setAccess ((clang::AccessSpecifier)default_accessibility);
2577 }
2578 return true;
2579 }
2580 return false;
2581}
2582
2583clang::DeclContext *
Greg Clayton99558cc42015-08-24 23:46:31 +00002584ClangASTContext::GetDeclContextForType (const CompilerType& type)
2585{
2586 return GetDeclContextForType(GetQualType(type));
2587}
2588
2589clang::DeclContext *
Greg Claytond8d4a572015-08-11 21:38:15 +00002590ClangASTContext::GetDeclContextForType (clang::QualType type)
2591{
2592 if (type.isNull())
2593 return nullptr;
2594
2595 clang::QualType qual_type = type.getCanonicalType();
2596 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2597 switch (type_class)
2598 {
Greg Claytond8d4a572015-08-11 21:38:15 +00002599 case clang::Type::ObjCInterface: return llvm::cast<clang::ObjCObjectType>(qual_type.getTypePtr())->getInterface();
2600 case clang::Type::ObjCObjectPointer: return GetDeclContextForType (llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
2601 case clang::Type::Record: return llvm::cast<clang::RecordType>(qual_type)->getDecl();
2602 case clang::Type::Enum: return llvm::cast<clang::EnumType>(qual_type)->getDecl();
2603 case clang::Type::Typedef: return GetDeclContextForType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Enrico Granata36f51e42015-12-18 22:41:25 +00002604 case clang::Type::Auto: return GetDeclContextForType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002605 case clang::Type::Elaborated: return GetDeclContextForType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
2606 case clang::Type::Paren: return GetDeclContextForType (llvm::cast<clang::ParenType>(qual_type)->desugar());
Greg Clayton99558cc42015-08-24 23:46:31 +00002607 default:
2608 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00002609 }
2610 // No DeclContext in this type...
2611 return nullptr;
2612}
2613
2614static bool
2615GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true)
2616{
2617 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2618 switch (type_class)
2619 {
2620 case clang::Type::ConstantArray:
2621 case clang::Type::IncompleteArray:
2622 case clang::Type::VariableArray:
Greg Claytond8d4a572015-08-11 21:38:15 +00002623 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002624 const clang::ArrayType *array_type = llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
2625
2626 if (array_type)
2627 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
2628 }
2629 break;
2630 case clang::Type::Record:
2631 {
2632 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2633 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00002634 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002635 if (cxx_record_decl->hasExternalLexicalStorage())
Greg Claytond8d4a572015-08-11 21:38:15 +00002636 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002637 const bool is_complete = cxx_record_decl->isCompleteDefinition();
2638 const bool fields_loaded = cxx_record_decl->hasLoadedFieldsFromExternalStorage();
2639 if (is_complete && fields_loaded)
2640 return true;
2641
2642 if (!allow_completion)
2643 return false;
2644
2645 // Call the field_begin() accessor to for it to use the external source
2646 // to load the fields...
2647 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2648 if (external_ast_source)
Greg Claytond8d4a572015-08-11 21:38:15 +00002649 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002650 external_ast_source->CompleteType(cxx_record_decl);
2651 if (cxx_record_decl->isCompleteDefinition())
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002652 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002653 cxx_record_decl->setHasLoadedFieldsFromExternalStorage (true);
2654 cxx_record_decl->field_begin();
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002655 }
2656 }
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002657 }
2658 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00002659 const clang::TagType *tag_type = llvm::cast<clang::TagType>(qual_type.getTypePtr());
2660 return !tag_type->isIncompleteType();
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002661 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002662 break;
Greg Claytone6b36cd2015-12-08 01:02:08 +00002663
2664 case clang::Type::Enum:
2665 {
2666 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
2667 if (tag_type)
2668 {
2669 clang::TagDecl *tag_decl = tag_type->getDecl();
2670 if (tag_decl)
2671 {
2672 if (tag_decl->getDefinition())
2673 return true;
2674
2675 if (!allow_completion)
2676 return false;
2677
2678 if (tag_decl->hasExternalLexicalStorage())
2679 {
2680 if (ast)
2681 {
2682 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2683 if (external_ast_source)
2684 {
2685 external_ast_source->CompleteType(tag_decl);
2686 return !tag_type->isIncompleteType();
2687 }
2688 }
2689 }
2690 return false;
2691 }
2692 }
2693
2694 }
2695 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00002696 case clang::Type::ObjCObject:
2697 case clang::Type::ObjCInterface:
Greg Claytond8d4a572015-08-11 21:38:15 +00002698 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002699 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
2700 if (objc_class_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002701 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002702 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2703 // We currently can't complete objective C types through the newly added ASTContext
2704 // because it only supports TagDecl objects right now...
2705 if (class_interface_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00002706 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002707 if (class_interface_decl->getDefinition())
2708 return true;
2709
2710 if (!allow_completion)
2711 return false;
2712
2713 if (class_interface_decl->hasExternalLexicalStorage())
Greg Claytond8d4a572015-08-11 21:38:15 +00002714 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002715 if (ast)
Greg Claytond8d4a572015-08-11 21:38:15 +00002716 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002717 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2718 if (external_ast_source)
2719 {
2720 external_ast_source->CompleteType (class_interface_decl);
2721 return !objc_class_type->isIncompleteType();
2722 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002723 }
2724 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00002725 return false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002726 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002727 }
2728 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002729 break;
2730
2731 case clang::Type::Typedef:
2732 return GetCompleteQualType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
2733
Enrico Granata36f51e42015-12-18 22:41:25 +00002734 case clang::Type::Auto:
2735 return GetCompleteQualType (ast, llvm::cast<clang::AutoType>(qual_type)->getDeducedType(), allow_completion);
2736
Greg Claytond8d4a572015-08-11 21:38:15 +00002737 case clang::Type::Elaborated:
2738 return GetCompleteQualType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType(), allow_completion);
2739
2740 case clang::Type::Paren:
2741 return GetCompleteQualType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar(), allow_completion);
Greg Claytone6b36cd2015-12-08 01:02:08 +00002742
2743 case clang::Type::Attributed:
2744 return GetCompleteQualType (ast, llvm::cast<clang::AttributedType>(qual_type)->getModifiedType(), allow_completion);
2745
Greg Claytond8d4a572015-08-11 21:38:15 +00002746 default:
2747 break;
2748 }
2749
2750 return true;
2751}
2752
2753static clang::ObjCIvarDecl::AccessControl
2754ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
2755{
2756 switch (access)
2757 {
2758 case eAccessNone: return clang::ObjCIvarDecl::None;
2759 case eAccessPublic: return clang::ObjCIvarDecl::Public;
2760 case eAccessPrivate: return clang::ObjCIvarDecl::Private;
2761 case eAccessProtected: return clang::ObjCIvarDecl::Protected;
2762 case eAccessPackage: return clang::ObjCIvarDecl::Package;
2763 }
2764 return clang::ObjCIvarDecl::None;
2765}
2766
2767
2768//----------------------------------------------------------------------
2769// Tests
2770//----------------------------------------------------------------------
2771
2772bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002773ClangASTContext::IsAggregateType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002774{
2775 clang::QualType qual_type (GetCanonicalQualType(type));
2776
2777 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2778 switch (type_class)
2779 {
2780 case clang::Type::IncompleteArray:
2781 case clang::Type::VariableArray:
2782 case clang::Type::ConstantArray:
2783 case clang::Type::ExtVector:
2784 case clang::Type::Vector:
2785 case clang::Type::Record:
2786 case clang::Type::ObjCObject:
2787 case clang::Type::ObjCInterface:
2788 return true;
Enrico Granata36f51e42015-12-18 22:41:25 +00002789 case clang::Type::Auto:
2790 return IsAggregateType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00002791 case clang::Type::Elaborated:
2792 return IsAggregateType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2793 case clang::Type::Typedef:
2794 return IsAggregateType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2795 case clang::Type::Paren:
2796 return IsAggregateType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2797 default:
2798 break;
2799 }
2800 // The clang type does have a value
2801 return false;
2802}
2803
2804bool
Enrico Granata7123e2b2015-11-07 02:06:57 +00002805ClangASTContext::IsAnonymousType (lldb::opaque_compiler_type_t type)
2806{
2807 clang::QualType qual_type (GetCanonicalQualType(type));
2808
2809 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2810 switch (type_class)
2811 {
2812 case clang::Type::Record:
2813 {
2814 if (const clang::RecordType *record_type = llvm::dyn_cast_or_null<clang::RecordType>(qual_type.getTypePtrOrNull()))
2815 {
2816 if (const clang::RecordDecl *record_decl = record_type->getDecl())
2817 {
2818 return record_decl->isAnonymousStructOrUnion();
2819 }
2820 }
2821 break;
2822 }
Enrico Granata36f51e42015-12-18 22:41:25 +00002823 case clang::Type::Auto:
2824 return IsAnonymousType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
Enrico Granata7123e2b2015-11-07 02:06:57 +00002825 case clang::Type::Elaborated:
2826 return IsAnonymousType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2827 case clang::Type::Typedef:
2828 return IsAnonymousType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2829 case clang::Type::Paren:
2830 return IsAnonymousType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2831 default:
2832 break;
2833 }
2834 // The clang type does have a value
2835 return false;
2836}
2837
2838bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002839ClangASTContext::IsArrayType (lldb::opaque_compiler_type_t type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002840 CompilerType *element_type_ptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00002841 uint64_t *size,
2842 bool *is_incomplete)
2843{
2844 clang::QualType qual_type (GetCanonicalQualType(type));
2845
2846 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2847 switch (type_class)
2848 {
2849 default:
2850 break;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002851
Greg Claytond8d4a572015-08-11 21:38:15 +00002852 case clang::Type::ConstantArray:
2853 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002854 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::ConstantArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002855 if (size)
2856 *size = llvm::cast<clang::ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002857 if (is_incomplete)
2858 *is_incomplete = false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002859 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002860
Greg Claytond8d4a572015-08-11 21:38:15 +00002861 case clang::Type::IncompleteArray:
2862 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002863 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::IncompleteArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002864 if (size)
2865 *size = 0;
2866 if (is_incomplete)
2867 *is_incomplete = true;
2868 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002869
Greg Claytond8d4a572015-08-11 21:38:15 +00002870 case clang::Type::VariableArray:
2871 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002872 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::VariableArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002873 if (size)
2874 *size = 0;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002875 if (is_incomplete)
2876 *is_incomplete = false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002877 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002878
Greg Claytond8d4a572015-08-11 21:38:15 +00002879 case clang::Type::DependentSizedArray:
2880 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002881 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::DependentSizedArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002882 if (size)
2883 *size = 0;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002884 if (is_incomplete)
2885 *is_incomplete = false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002886 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002887
Greg Claytond8d4a572015-08-11 21:38:15 +00002888 case clang::Type::Typedef:
2889 return IsArrayType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2890 element_type_ptr,
2891 size,
2892 is_incomplete);
Enrico Granata36f51e42015-12-18 22:41:25 +00002893 case clang::Type::Auto:
2894 return IsArrayType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(),
2895 element_type_ptr,
2896 size,
2897 is_incomplete);
Greg Claytond8d4a572015-08-11 21:38:15 +00002898 case clang::Type::Elaborated:
2899 return IsArrayType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2900 element_type_ptr,
2901 size,
2902 is_incomplete);
2903 case clang::Type::Paren:
2904 return IsArrayType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
2905 element_type_ptr,
2906 size,
2907 is_incomplete);
2908 }
2909 if (element_type_ptr)
2910 element_type_ptr->Clear();
2911 if (size)
2912 *size = 0;
2913 if (is_incomplete)
2914 *is_incomplete = false;
Bruce Mitchener778e7ab2015-09-16 00:00:16 +00002915 return false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002916}
2917
2918bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002919ClangASTContext::IsVectorType (lldb::opaque_compiler_type_t type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002920 CompilerType *element_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00002921 uint64_t *size)
2922{
2923 clang::QualType qual_type (GetCanonicalQualType(type));
2924
2925 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2926 switch (type_class)
2927 {
2928 case clang::Type::Vector:
2929 {
2930 const clang::VectorType *vector_type = qual_type->getAs<clang::VectorType>();
2931 if (vector_type)
2932 {
2933 if (size)
2934 *size = vector_type->getNumElements();
2935 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002936 *element_type = CompilerType(getASTContext(), vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002937 }
2938 return true;
2939 }
2940 break;
2941 case clang::Type::ExtVector:
2942 {
2943 const clang::ExtVectorType *ext_vector_type = qual_type->getAs<clang::ExtVectorType>();
2944 if (ext_vector_type)
2945 {
2946 if (size)
2947 *size = ext_vector_type->getNumElements();
2948 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002949 *element_type = CompilerType(getASTContext(), ext_vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002950 }
2951 return true;
2952 }
2953 default:
2954 break;
2955 }
2956 return false;
2957}
2958
2959bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002960ClangASTContext::IsRuntimeGeneratedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002961{
2962 clang::DeclContext* decl_ctx = ClangASTContext::GetASTContext(getASTContext())->GetDeclContextForType(GetQualType(type));
2963 if (!decl_ctx)
2964 return false;
2965
2966 if (!llvm::isa<clang::ObjCInterfaceDecl>(decl_ctx))
2967 return false;
2968
2969 clang::ObjCInterfaceDecl *result_iface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
2970
2971 ClangASTMetadata* ast_metadata = ClangASTContext::GetMetadata(getASTContext(), result_iface_decl);
2972 if (!ast_metadata)
2973 return false;
2974 return (ast_metadata->GetISAPtr() != 0);
2975}
2976
2977bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002978ClangASTContext::IsCharType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002979{
2980 return GetQualType(type).getUnqualifiedType()->isCharType();
2981}
2982
2983
2984bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002985ClangASTContext::IsCompleteType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002986{
2987 const bool allow_completion = false;
2988 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
2989}
2990
2991bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002992ClangASTContext::IsConst(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002993{
2994 return GetQualType(type).isConstQualified();
2995}
2996
2997bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002998ClangASTContext::IsCStringType (lldb::opaque_compiler_type_t type, uint32_t &length)
Greg Claytond8d4a572015-08-11 21:38:15 +00002999{
Greg Claytona1e5dc82015-08-11 22:53:00 +00003000 CompilerType pointee_or_element_clang_type;
Greg Claytond8d4a572015-08-11 21:38:15 +00003001 length = 0;
3002 Flags type_flags (GetTypeInfo (type, &pointee_or_element_clang_type));
3003
3004 if (!pointee_or_element_clang_type.IsValid())
3005 return false;
3006
3007 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
3008 {
3009 if (pointee_or_element_clang_type.IsCharType())
3010 {
3011 if (type_flags.Test (eTypeIsArray))
3012 {
3013 // We know the size of the array and it could be a C string
3014 // since it is an array of characters
3015 length = llvm::cast<clang::ConstantArrayType>(GetCanonicalQualType(type).getTypePtr())->getSize().getLimitedValue();
3016 }
3017 return true;
3018
3019 }
3020 }
3021 return false;
3022}
3023
3024bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003025ClangASTContext::IsFunctionType (lldb::opaque_compiler_type_t type, bool *is_variadic_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003026{
3027 if (type)
3028 {
3029 clang::QualType qual_type (GetCanonicalQualType(type));
3030
3031 if (qual_type->isFunctionType())
3032 {
3033 if (is_variadic_ptr)
3034 {
3035 const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3036 if (function_proto_type)
3037 *is_variadic_ptr = function_proto_type->isVariadic();
3038 else
3039 *is_variadic_ptr = false;
3040 }
3041 return true;
3042 }
3043
3044 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3045 switch (type_class)
3046 {
3047 default:
3048 break;
3049 case clang::Type::Typedef:
3050 return IsFunctionType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), nullptr);
Enrico Granata36f51e42015-12-18 22:41:25 +00003051 case clang::Type::Auto:
3052 return IsFunctionType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), nullptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00003053 case clang::Type::Elaborated:
3054 return IsFunctionType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), nullptr);
3055 case clang::Type::Paren:
3056 return IsFunctionType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), nullptr);
3057 case clang::Type::LValueReference:
3058 case clang::Type::RValueReference:
3059 {
3060 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3061 if (reference_type)
3062 return IsFunctionType(reference_type->getPointeeType().getAsOpaquePtr(), nullptr);
3063 }
3064 break;
3065 }
3066 }
3067 return false;
3068}
3069
3070// Used to detect "Homogeneous Floating-point Aggregates"
3071uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003072ClangASTContext::IsHomogeneousAggregate (lldb::opaque_compiler_type_t type, CompilerType* base_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003073{
3074 if (!type)
3075 return 0;
3076
3077 clang::QualType qual_type(GetCanonicalQualType(type));
3078 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3079 switch (type_class)
3080 {
3081 case clang::Type::Record:
3082 if (GetCompleteType (type))
3083 {
3084 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3085 if (cxx_record_decl)
3086 {
3087 if (cxx_record_decl->getNumBases() ||
3088 cxx_record_decl->isDynamicClass())
3089 return 0;
3090 }
3091 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3092 if (record_type)
3093 {
3094 const clang::RecordDecl *record_decl = record_type->getDecl();
3095 if (record_decl)
3096 {
3097 // We are looking for a structure that contains only floating point types
3098 clang::RecordDecl::field_iterator field_pos, field_end = record_decl->field_end();
3099 uint32_t num_fields = 0;
3100 bool is_hva = false;
3101 bool is_hfa = false;
3102 clang::QualType base_qual_type;
3103 for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos)
3104 {
3105 clang::QualType field_qual_type = field_pos->getType();
3106 if (field_qual_type->isFloatingType())
3107 {
3108 if (field_qual_type->isComplexType())
3109 return 0;
3110 else
3111 {
3112 if (num_fields == 0)
3113 base_qual_type = field_qual_type;
3114 else
3115 {
3116 if (is_hva)
3117 return 0;
3118 is_hfa = true;
3119 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
3120 return 0;
3121 }
3122 }
3123 }
3124 else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType())
3125 {
3126 const clang::VectorType *array = field_qual_type.getTypePtr()->getAs<clang::VectorType>();
3127 if (array && array->getNumElements() <= 4)
3128 {
3129 if (num_fields == 0)
3130 base_qual_type = array->getElementType();
3131 else
3132 {
3133 if (is_hfa)
3134 return 0;
3135 is_hva = true;
3136 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
3137 return 0;
3138 }
3139 }
3140 else
3141 return 0;
3142 }
3143 else
3144 return 0;
3145 ++num_fields;
3146 }
3147 if (base_type_ptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003148 *base_type_ptr = CompilerType (getASTContext(), base_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003149 return num_fields;
3150 }
3151 }
3152 }
3153 break;
3154
3155 case clang::Type::Typedef:
3156 return IsHomogeneousAggregate(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), base_type_ptr);
Enrico Granata36f51e42015-12-18 22:41:25 +00003157
3158 case clang::Type::Auto:
3159 return IsHomogeneousAggregate(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), base_type_ptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00003160
3161 case clang::Type::Elaborated:
3162 return IsHomogeneousAggregate(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), base_type_ptr);
3163 default:
3164 break;
3165 }
3166 return 0;
3167}
3168
3169size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003170ClangASTContext::GetNumberOfFunctionArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003171{
3172 if (type)
3173 {
3174 clang::QualType qual_type (GetCanonicalQualType(type));
3175 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3176 if (func)
3177 return func->getNumParams();
3178 }
3179 return 0;
3180}
3181
Greg Claytona1e5dc82015-08-11 22:53:00 +00003182CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003183ClangASTContext::GetFunctionArgumentAtIndex (lldb::opaque_compiler_type_t type, const size_t index)
Greg Claytond8d4a572015-08-11 21:38:15 +00003184{
3185 if (type)
3186 {
3187 clang::QualType qual_type (GetCanonicalQualType(type));
3188 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3189 if (func)
3190 {
3191 if (index < func->getNumParams())
Greg Claytona1e5dc82015-08-11 22:53:00 +00003192 return CompilerType(getASTContext(), func->getParamType(index));
Greg Claytond8d4a572015-08-11 21:38:15 +00003193 }
3194 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003195 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003196}
3197
3198bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003199ClangASTContext::IsFunctionPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003200{
3201 if (type)
3202 {
3203 clang::QualType qual_type (GetCanonicalQualType(type));
3204
3205 if (qual_type->isFunctionPointerType())
3206 return true;
3207
3208 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3209 switch (type_class)
3210 {
3211 default:
3212 break;
3213 case clang::Type::Typedef:
3214 return IsFunctionPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Enrico Granata36f51e42015-12-18 22:41:25 +00003215 case clang::Type::Auto:
3216 return IsFunctionPointerType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003217 case clang::Type::Elaborated:
3218 return IsFunctionPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3219 case clang::Type::Paren:
3220 return IsFunctionPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
3221
3222 case clang::Type::LValueReference:
3223 case clang::Type::RValueReference:
3224 {
3225 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3226 if (reference_type)
3227 return IsFunctionPointerType(reference_type->getPointeeType().getAsOpaquePtr());
3228 }
3229 break;
3230 }
3231 }
3232 return false;
3233
3234}
3235
3236bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003237ClangASTContext::IsIntegerType (lldb::opaque_compiler_type_t type, bool &is_signed)
Greg Claytond8d4a572015-08-11 21:38:15 +00003238{
3239 if (!type)
3240 return false;
3241
3242 clang::QualType qual_type (GetCanonicalQualType(type));
3243 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3244
3245 if (builtin_type)
3246 {
3247 if (builtin_type->isInteger())
3248 {
3249 is_signed = builtin_type->isSignedInteger();
3250 return true;
3251 }
3252 }
3253
3254 return false;
3255}
3256
3257bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003258ClangASTContext::IsPointerType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003259{
3260 if (type)
3261 {
3262 clang::QualType qual_type (GetCanonicalQualType(type));
3263 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3264 switch (type_class)
3265 {
3266 case clang::Type::Builtin:
3267 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3268 {
3269 default:
3270 break;
3271 case clang::BuiltinType::ObjCId:
3272 case clang::BuiltinType::ObjCClass:
3273 return true;
3274 }
3275 return false;
3276 case clang::Type::ObjCObjectPointer:
3277 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003278 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003279 return true;
3280 case clang::Type::BlockPointer:
3281 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003282 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003283 return true;
3284 case clang::Type::Pointer:
3285 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003286 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003287 return true;
3288 case clang::Type::MemberPointer:
3289 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003290 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003291 return true;
3292 case clang::Type::Typedef:
3293 return IsPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
Enrico Granata36f51e42015-12-18 22:41:25 +00003294 case clang::Type::Auto:
3295 return IsPointerType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003296 case clang::Type::Elaborated:
3297 return IsPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3298 case clang::Type::Paren:
3299 return IsPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3300 default:
3301 break;
3302 }
3303 }
3304 if (pointee_type)
3305 pointee_type->Clear();
3306 return false;
3307}
3308
3309
3310bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003311ClangASTContext::IsPointerOrReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003312{
3313 if (type)
3314 {
3315 clang::QualType qual_type (GetCanonicalQualType(type));
3316 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3317 switch (type_class)
3318 {
3319 case clang::Type::Builtin:
3320 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3321 {
3322 default:
3323 break;
3324 case clang::BuiltinType::ObjCId:
3325 case clang::BuiltinType::ObjCClass:
3326 return true;
3327 }
3328 return false;
3329 case clang::Type::ObjCObjectPointer:
3330 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003331 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003332 return true;
3333 case clang::Type::BlockPointer:
3334 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003335 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003336 return true;
3337 case clang::Type::Pointer:
3338 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003339 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003340 return true;
3341 case clang::Type::MemberPointer:
3342 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003343 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003344 return true;
3345 case clang::Type::LValueReference:
3346 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003347 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003348 return true;
3349 case clang::Type::RValueReference:
3350 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003351 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003352 return true;
3353 case clang::Type::Typedef:
3354 return IsPointerOrReferenceType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
Enrico Granata36f51e42015-12-18 22:41:25 +00003355 case clang::Type::Auto:
3356 return IsPointerOrReferenceType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003357 case clang::Type::Elaborated:
3358 return IsPointerOrReferenceType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3359 case clang::Type::Paren:
3360 return IsPointerOrReferenceType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3361 default:
3362 break;
3363 }
3364 }
3365 if (pointee_type)
3366 pointee_type->Clear();
3367 return false;
3368}
3369
3370
3371bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003372ClangASTContext::IsReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool* is_rvalue)
Greg Claytond8d4a572015-08-11 21:38:15 +00003373{
3374 if (type)
3375 {
3376 clang::QualType qual_type (GetCanonicalQualType(type));
3377 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3378
3379 switch (type_class)
3380 {
3381 case clang::Type::LValueReference:
3382 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003383 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003384 if (is_rvalue)
3385 *is_rvalue = false;
3386 return true;
3387 case clang::Type::RValueReference:
3388 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003389 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003390 if (is_rvalue)
3391 *is_rvalue = true;
3392 return true;
3393 case clang::Type::Typedef:
3394 return IsReferenceType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type, is_rvalue);
Enrico Granata36f51e42015-12-18 22:41:25 +00003395 case clang::Type::Auto:
3396 return IsReferenceType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), pointee_type, is_rvalue);
Greg Claytond8d4a572015-08-11 21:38:15 +00003397 case clang::Type::Elaborated:
3398 return IsReferenceType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type, is_rvalue);
3399 case clang::Type::Paren:
3400 return IsReferenceType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type, is_rvalue);
3401
3402 default:
3403 break;
3404 }
3405 }
3406 if (pointee_type)
3407 pointee_type->Clear();
3408 return false;
3409}
3410
3411bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003412ClangASTContext::IsFloatingPointType (lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex)
Greg Claytond8d4a572015-08-11 21:38:15 +00003413{
3414 if (type)
3415 {
3416 clang::QualType qual_type (GetCanonicalQualType(type));
3417
3418 if (const clang::BuiltinType *BT = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal()))
3419 {
3420 clang::BuiltinType::Kind kind = BT->getKind();
3421 if (kind >= clang::BuiltinType::Float && kind <= clang::BuiltinType::LongDouble)
3422 {
3423 count = 1;
3424 is_complex = false;
3425 return true;
3426 }
3427 }
3428 else if (const clang::ComplexType *CT = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal()))
3429 {
3430 if (IsFloatingPointType (CT->getElementType().getAsOpaquePtr(), count, is_complex))
3431 {
3432 count = 2;
3433 is_complex = true;
3434 return true;
3435 }
3436 }
3437 else if (const clang::VectorType *VT = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal()))
3438 {
3439 if (IsFloatingPointType (VT->getElementType().getAsOpaquePtr(), count, is_complex))
3440 {
3441 count = VT->getNumElements();
3442 is_complex = false;
3443 return true;
3444 }
3445 }
3446 }
3447 count = 0;
3448 is_complex = false;
3449 return false;
3450}
3451
3452
3453bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003454ClangASTContext::IsDefined(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003455{
3456 if (!type)
3457 return false;
3458
3459 clang::QualType qual_type(GetQualType(type));
3460 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
3461 if (tag_type)
3462 {
3463 clang::TagDecl *tag_decl = tag_type->getDecl();
3464 if (tag_decl)
3465 return tag_decl->isCompleteDefinition();
3466 return false;
3467 }
3468 else
3469 {
3470 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3471 if (objc_class_type)
3472 {
3473 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3474 if (class_interface_decl)
3475 return class_interface_decl->getDefinition() != nullptr;
3476 return false;
3477 }
3478 }
3479 return true;
3480}
3481
3482bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003483ClangASTContext::IsObjCClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003484{
3485 if (type)
3486 {
3487 clang::QualType qual_type (GetCanonicalQualType(type));
3488
3489 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3490
3491 if (obj_pointer_type)
3492 return obj_pointer_type->isObjCClassType();
3493 }
3494 return false;
3495}
3496
3497bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003498ClangASTContext::IsObjCObjectOrInterfaceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003499{
Ryan Brown57bee1e2015-09-14 22:45:11 +00003500 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00003501 return GetCanonicalQualType(type)->isObjCObjectOrInterfaceType();
3502 return false;
3503}
3504
3505bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003506ClangASTContext::IsPolymorphicClass (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003507{
3508 if (type)
3509 {
3510 clang::QualType qual_type(GetCanonicalQualType(type));
3511 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3512 switch (type_class)
3513 {
3514 case clang::Type::Record:
3515 if (GetCompleteType(type))
3516 {
3517 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3518 const clang::RecordDecl *record_decl = record_type->getDecl();
3519 if (record_decl)
3520 {
3521 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3522 if (cxx_record_decl)
3523 return cxx_record_decl->isPolymorphic();
3524 }
3525 }
3526 break;
3527
3528 default:
3529 break;
3530 }
3531 }
3532 return false;
3533}
3534
3535bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003536ClangASTContext::IsPossibleDynamicType (lldb::opaque_compiler_type_t type, CompilerType *dynamic_pointee_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00003537 bool check_cplusplus,
3538 bool check_objc)
3539{
3540 clang::QualType pointee_qual_type;
3541 if (type)
3542 {
3543 clang::QualType qual_type (GetCanonicalQualType(type));
3544 bool success = false;
3545 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3546 switch (type_class)
3547 {
3548 case clang::Type::Builtin:
3549 if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
3550 {
3551 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003552 dynamic_pointee_type->SetCompilerType(this, type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003553 return true;
3554 }
3555 break;
3556
3557 case clang::Type::ObjCObjectPointer:
3558 if (check_objc)
3559 {
3560 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003561 dynamic_pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003562 return true;
3563 }
3564 break;
3565
3566 case clang::Type::Pointer:
3567 pointee_qual_type = llvm::cast<clang::PointerType>(qual_type)->getPointeeType();
3568 success = true;
3569 break;
3570
3571 case clang::Type::LValueReference:
3572 case clang::Type::RValueReference:
3573 pointee_qual_type = llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType();
3574 success = true;
3575 break;
3576
3577 case clang::Type::Typedef:
3578 return IsPossibleDynamicType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3579 dynamic_pointee_type,
3580 check_cplusplus,
3581 check_objc);
Enrico Granata36f51e42015-12-18 22:41:25 +00003582
3583 case clang::Type::Auto:
3584 return IsPossibleDynamicType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(),
3585 dynamic_pointee_type,
3586 check_cplusplus,
3587 check_objc);
Greg Claytond8d4a572015-08-11 21:38:15 +00003588
3589 case clang::Type::Elaborated:
3590 return IsPossibleDynamicType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3591 dynamic_pointee_type,
3592 check_cplusplus,
3593 check_objc);
3594
3595 case clang::Type::Paren:
3596 return IsPossibleDynamicType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
3597 dynamic_pointee_type,
3598 check_cplusplus,
3599 check_objc);
3600 default:
3601 break;
3602 }
3603
3604 if (success)
3605 {
3606 // Check to make sure what we are pointing too is a possible dynamic C++ type
3607 // We currently accept any "void *" (in case we have a class that has been
3608 // watered down to an opaque pointer) and virtual C++ classes.
3609 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
3610 switch (pointee_type_class)
3611 {
3612 case clang::Type::Builtin:
3613 switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind())
3614 {
3615 case clang::BuiltinType::UnknownAny:
3616 case clang::BuiltinType::Void:
3617 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003618 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003619 return true;
Zachary Turnerdd07e002015-09-16 18:08:45 +00003620 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00003621 break;
3622 }
3623 break;
3624
3625 case clang::Type::Record:
3626 if (check_cplusplus)
3627 {
3628 clang::CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
3629 if (cxx_record_decl)
3630 {
3631 bool is_complete = cxx_record_decl->isCompleteDefinition();
3632
3633 if (is_complete)
3634 success = cxx_record_decl->isDynamicClass();
3635 else
3636 {
3637 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), cxx_record_decl);
3638 if (metadata)
3639 success = metadata->GetIsDynamicCXXType();
3640 else
3641 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00003642 is_complete = CompilerType(getASTContext(), pointee_qual_type).GetCompleteType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003643 if (is_complete)
3644 success = cxx_record_decl->isDynamicClass();
3645 else
3646 success = false;
3647 }
3648 }
3649
3650 if (success)
3651 {
3652 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003653 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003654 return true;
3655 }
3656 }
3657 }
3658 break;
3659
3660 case clang::Type::ObjCObject:
3661 case clang::Type::ObjCInterface:
3662 if (check_objc)
3663 {
3664 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003665 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003666 return true;
3667 }
3668 break;
3669
3670 default:
3671 break;
3672 }
3673 }
3674 }
3675 if (dynamic_pointee_type)
3676 dynamic_pointee_type->Clear();
3677 return false;
3678}
3679
3680
3681bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003682ClangASTContext::IsScalarType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003683{
3684 if (!type)
3685 return false;
3686
3687 return (GetTypeInfo (type, nullptr) & eTypeIsScalar) != 0;
3688}
3689
3690bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003691ClangASTContext::IsTypedefType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003692{
3693 if (!type)
3694 return false;
3695 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
3696}
3697
3698bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003699ClangASTContext::IsVoidType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003700{
3701 if (!type)
3702 return false;
3703 return GetCanonicalQualType(type)->isVoidType();
3704}
3705
3706bool
Greg Clayton56939cb2015-09-17 22:23:34 +00003707ClangASTContext::SupportsLanguage (lldb::LanguageType language)
3708{
3709 return ClangASTContextSupportsLanguage(language);
3710}
3711
3712bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003713ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003714{
3715 if (type)
3716 {
3717 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003718 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00003719 {
Ryan Brown57bee1e2015-09-14 22:45:11 +00003720 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3721 if (cxx_record_decl)
3722 {
3723 class_name.assign(cxx_record_decl->getIdentifier()->getNameStart());
3724 return true;
3725 }
Greg Claytond8d4a572015-08-11 21:38:15 +00003726 }
3727 }
3728 class_name.clear();
3729 return false;
3730}
3731
3732
3733bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003734ClangASTContext::IsCXXClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003735{
3736 if (!type)
3737 return false;
3738
3739 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003740 if (!qual_type.isNull() && qual_type->getAsCXXRecordDecl() != nullptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003741 return true;
3742 return false;
3743}
3744
3745bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003746ClangASTContext::IsBeingDefined (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003747{
3748 if (!type)
3749 return false;
3750 clang::QualType qual_type (GetCanonicalQualType(type));
3751 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
3752 if (tag_type)
3753 return tag_type->isBeingDefined();
3754 return false;
3755}
3756
3757bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003758ClangASTContext::IsObjCObjectPointerType (const CompilerType& type, CompilerType *class_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003759{
3760 if (!type)
3761 return false;
3762
3763 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003764
3765 if (!qual_type.isNull() && qual_type->isObjCObjectPointerType())
Greg Claytond8d4a572015-08-11 21:38:15 +00003766 {
3767 if (class_type_ptr)
3768 {
3769 if (!qual_type->isObjCClassType() &&
3770 !qual_type->isObjCIdType())
3771 {
3772 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3773 if (obj_pointer_type == nullptr)
3774 class_type_ptr->Clear();
3775 else
Greg Clayton99558cc42015-08-24 23:46:31 +00003776 class_type_ptr->SetCompilerType (type.GetTypeSystem(), clang::QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003777 }
3778 }
3779 return true;
3780 }
3781 if (class_type_ptr)
3782 class_type_ptr->Clear();
3783 return false;
3784}
3785
3786bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003787ClangASTContext::GetObjCClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003788{
3789 if (!type)
3790 return false;
3791
3792 clang::QualType qual_type (GetCanonicalQualType(type));
3793
3794 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3795 if (object_type)
3796 {
3797 const clang::ObjCInterfaceDecl *interface = object_type->getInterface();
3798 if (interface)
3799 {
3800 class_name = interface->getNameAsString();
3801 return true;
3802 }
3803 }
3804 return false;
3805}
3806
3807
3808//----------------------------------------------------------------------
3809// Type Completion
3810//----------------------------------------------------------------------
3811
3812bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003813ClangASTContext::GetCompleteType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003814{
3815 if (!type)
3816 return false;
3817 const bool allow_completion = true;
3818 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
3819}
3820
3821ConstString
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003822ClangASTContext::GetTypeName (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003823{
3824 std::string type_name;
3825 if (type)
3826 {
3827 clang::PrintingPolicy printing_policy (getASTContext()->getPrintingPolicy());
3828 clang::QualType qual_type(GetQualType(type));
3829 printing_policy.SuppressTagKeyword = true;
3830 printing_policy.LangOpts.WChar = true;
3831 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
3832 if (typedef_type)
3833 {
3834 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
3835 type_name = typedef_decl->getQualifiedNameAsString();
3836 }
3837 else
3838 {
3839 type_name = qual_type.getAsString(printing_policy);
3840 }
3841 }
3842 return ConstString(type_name);
3843}
3844
3845uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003846ClangASTContext::GetTypeInfo (lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003847{
3848 if (!type)
3849 return 0;
3850
3851 if (pointee_or_element_clang_type)
3852 pointee_or_element_clang_type->Clear();
3853
3854 clang::QualType qual_type (GetQualType(type));
3855
3856 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3857 switch (type_class)
3858 {
3859 case clang::Type::Builtin:
3860 {
3861 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3862
3863 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
3864 switch (builtin_type->getKind())
3865 {
3866 case clang::BuiltinType::ObjCId:
3867 case clang::BuiltinType::ObjCClass:
3868 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003869 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003870 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3871 break;
3872
3873 case clang::BuiltinType::ObjCSel:
3874 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003875 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->CharTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003876 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3877 break;
3878
3879 case clang::BuiltinType::Bool:
3880 case clang::BuiltinType::Char_U:
3881 case clang::BuiltinType::UChar:
3882 case clang::BuiltinType::WChar_U:
3883 case clang::BuiltinType::Char16:
3884 case clang::BuiltinType::Char32:
3885 case clang::BuiltinType::UShort:
3886 case clang::BuiltinType::UInt:
3887 case clang::BuiltinType::ULong:
3888 case clang::BuiltinType::ULongLong:
3889 case clang::BuiltinType::UInt128:
3890 case clang::BuiltinType::Char_S:
3891 case clang::BuiltinType::SChar:
3892 case clang::BuiltinType::WChar_S:
3893 case clang::BuiltinType::Short:
3894 case clang::BuiltinType::Int:
3895 case clang::BuiltinType::Long:
3896 case clang::BuiltinType::LongLong:
3897 case clang::BuiltinType::Int128:
3898 case clang::BuiltinType::Float:
3899 case clang::BuiltinType::Double:
3900 case clang::BuiltinType::LongDouble:
3901 builtin_type_flags |= eTypeIsScalar;
3902 if (builtin_type->isInteger())
3903 {
3904 builtin_type_flags |= eTypeIsInteger;
3905 if (builtin_type->isSignedInteger())
3906 builtin_type_flags |= eTypeIsSigned;
3907 }
3908 else if (builtin_type->isFloatingPoint())
3909 builtin_type_flags |= eTypeIsFloat;
3910 break;
3911 default:
3912 break;
3913 }
3914 return builtin_type_flags;
3915 }
3916
3917 case clang::Type::BlockPointer:
3918 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003919 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003920 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3921
3922 case clang::Type::Complex:
3923 {
3924 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3925 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal());
3926 if (complex_type)
3927 {
3928 clang::QualType complex_element_type (complex_type->getElementType());
3929 if (complex_element_type->isIntegerType())
3930 complex_type_flags |= eTypeIsFloat;
3931 else if (complex_element_type->isFloatingType())
3932 complex_type_flags |= eTypeIsInteger;
3933 }
3934 return complex_type_flags;
3935 }
3936 break;
3937
3938 case clang::Type::ConstantArray:
3939 case clang::Type::DependentSizedArray:
3940 case clang::Type::IncompleteArray:
3941 case clang::Type::VariableArray:
3942 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003943 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ArrayType>(qual_type.getTypePtr())->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003944 return eTypeHasChildren | eTypeIsArray;
3945
3946 case clang::Type::DependentName: return 0;
3947 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
3948 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
3949 case clang::Type::Decltype: return 0;
3950
3951 case clang::Type::Enum:
3952 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003953 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::EnumType>(qual_type)->getDecl()->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003954 return eTypeIsEnumeration | eTypeHasValue;
Enrico Granata36f51e42015-12-18 22:41:25 +00003955
3956 case clang::Type::Auto:
3957 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003958 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003959 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003960 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003961 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003962
3963 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
3964 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
3965 case clang::Type::InjectedClassName: return 0;
3966
3967 case clang::Type::LValueReference:
3968 case clang::Type::RValueReference:
3969 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003970 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003971 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3972
3973 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
3974
3975 case clang::Type::ObjCObjectPointer:
3976 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003977 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003978 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
3979
3980 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3981 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3982
3983 case clang::Type::Pointer:
3984 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003985 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003986 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3987
3988 case clang::Type::Record:
3989 if (qual_type->getAsCXXRecordDecl())
3990 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3991 else
3992 return eTypeHasChildren | eTypeIsStructUnion;
3993 break;
3994 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
3995 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
3996 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
3997
3998 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003999 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 +00004000 case clang::Type::TypeOfExpr: return 0;
4001 case clang::Type::TypeOf: return 0;
4002 case clang::Type::UnresolvedUsing: return 0;
4003
4004 case clang::Type::ExtVector:
4005 case clang::Type::Vector:
4006 {
4007 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
4008 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal());
4009 if (vector_type)
4010 {
4011 if (vector_type->isIntegerType())
4012 vector_type_flags |= eTypeIsFloat;
4013 else if (vector_type->isFloatingType())
4014 vector_type_flags |= eTypeIsInteger;
4015 }
4016 return vector_type_flags;
4017 }
4018 default: return 0;
4019 }
4020 return 0;
4021}
4022
4023
4024
4025lldb::LanguageType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004026ClangASTContext::GetMinimumLanguage (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004027{
4028 if (!type)
4029 return lldb::eLanguageTypeC;
4030
4031 // If the type is a reference, then resolve it to what it refers to first:
4032 clang::QualType qual_type (GetCanonicalQualType(type).getNonReferenceType());
4033 if (qual_type->isAnyPointerType())
4034 {
4035 if (qual_type->isObjCObjectPointerType())
4036 return lldb::eLanguageTypeObjC;
4037
4038 clang::QualType pointee_type (qual_type->getPointeeType());
4039 if (pointee_type->getPointeeCXXRecordDecl() != nullptr)
4040 return lldb::eLanguageTypeC_plus_plus;
4041 if (pointee_type->isObjCObjectOrInterfaceType())
4042 return lldb::eLanguageTypeObjC;
4043 if (pointee_type->isObjCClassType())
4044 return lldb::eLanguageTypeObjC;
4045 if (pointee_type.getTypePtr() == getASTContext()->ObjCBuiltinIdTy.getTypePtr())
4046 return lldb::eLanguageTypeObjC;
4047 }
4048 else
4049 {
4050 if (qual_type->isObjCObjectOrInterfaceType())
4051 return lldb::eLanguageTypeObjC;
4052 if (qual_type->getAsCXXRecordDecl())
4053 return lldb::eLanguageTypeC_plus_plus;
4054 switch (qual_type->getTypeClass())
4055 {
4056 default:
4057 break;
4058 case clang::Type::Builtin:
4059 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4060 {
4061 default:
4062 case clang::BuiltinType::Void:
4063 case clang::BuiltinType::Bool:
4064 case clang::BuiltinType::Char_U:
4065 case clang::BuiltinType::UChar:
4066 case clang::BuiltinType::WChar_U:
4067 case clang::BuiltinType::Char16:
4068 case clang::BuiltinType::Char32:
4069 case clang::BuiltinType::UShort:
4070 case clang::BuiltinType::UInt:
4071 case clang::BuiltinType::ULong:
4072 case clang::BuiltinType::ULongLong:
4073 case clang::BuiltinType::UInt128:
4074 case clang::BuiltinType::Char_S:
4075 case clang::BuiltinType::SChar:
4076 case clang::BuiltinType::WChar_S:
4077 case clang::BuiltinType::Short:
4078 case clang::BuiltinType::Int:
4079 case clang::BuiltinType::Long:
4080 case clang::BuiltinType::LongLong:
4081 case clang::BuiltinType::Int128:
4082 case clang::BuiltinType::Float:
4083 case clang::BuiltinType::Double:
4084 case clang::BuiltinType::LongDouble:
4085 break;
4086
4087 case clang::BuiltinType::NullPtr:
4088 return eLanguageTypeC_plus_plus;
4089
4090 case clang::BuiltinType::ObjCId:
4091 case clang::BuiltinType::ObjCClass:
4092 case clang::BuiltinType::ObjCSel:
4093 return eLanguageTypeObjC;
4094
4095 case clang::BuiltinType::Dependent:
4096 case clang::BuiltinType::Overload:
4097 case clang::BuiltinType::BoundMember:
4098 case clang::BuiltinType::UnknownAny:
4099 break;
4100 }
4101 break;
4102 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004103 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
Greg Claytond8d4a572015-08-11 21:38:15 +00004104 }
4105 }
4106 return lldb::eLanguageTypeC;
4107}
4108
4109lldb::TypeClass
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004110ClangASTContext::GetTypeClass (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004111{
4112 if (!type)
4113 return lldb::eTypeClassInvalid;
4114
4115 clang::QualType qual_type(GetQualType(type));
4116
4117 switch (qual_type->getTypeClass())
4118 {
4119 case clang::Type::UnaryTransform: break;
4120 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
4121 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
4122 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
4123 case clang::Type::VariableArray: return lldb::eTypeClassArray;
4124 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
4125 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
4126 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
4127 case clang::Type::ExtVector: return lldb::eTypeClassVector;
4128 case clang::Type::Vector: return lldb::eTypeClassVector;
4129 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
4130 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
4131 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
4132 case clang::Type::Pointer: return lldb::eTypeClassPointer;
4133 case clang::Type::LValueReference: return lldb::eTypeClassReference;
4134 case clang::Type::RValueReference: return lldb::eTypeClassReference;
4135 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
4136 case clang::Type::Complex:
4137 if (qual_type->isComplexType())
4138 return lldb::eTypeClassComplexFloat;
4139 else
4140 return lldb::eTypeClassComplexInteger;
4141 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
4142 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
4143 case clang::Type::Record:
4144 {
4145 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4146 const clang::RecordDecl *record_decl = record_type->getDecl();
4147 if (record_decl->isUnion())
4148 return lldb::eTypeClassUnion;
4149 else if (record_decl->isStruct())
4150 return lldb::eTypeClassStruct;
4151 else
4152 return lldb::eTypeClassClass;
4153 }
4154 break;
4155 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
4156 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
4157 case clang::Type::UnresolvedUsing: break;
4158 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004159 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeClass();
Enrico Granata36f51e42015-12-18 22:41:25 +00004160 case clang::Type::Auto:
4161 return CompilerType(getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00004162 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004163 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00004164
4165 case clang::Type::Attributed: break;
4166 case clang::Type::TemplateTypeParm: break;
4167 case clang::Type::SubstTemplateTypeParm: break;
4168 case clang::Type::SubstTemplateTypeParmPack:break;
Greg Claytond8d4a572015-08-11 21:38:15 +00004169 case clang::Type::InjectedClassName: break;
4170 case clang::Type::DependentName: break;
4171 case clang::Type::DependentTemplateSpecialization: break;
4172 case clang::Type::PackExpansion: break;
4173
4174 case clang::Type::TypeOfExpr: break;
4175 case clang::Type::TypeOf: break;
4176 case clang::Type::Decltype: break;
4177 case clang::Type::TemplateSpecialization: break;
4178 case clang::Type::Atomic: break;
Pavel Labath484f0a32016-01-12 08:51:28 +00004179 case clang::Type::Pipe: break;
Greg Claytond8d4a572015-08-11 21:38:15 +00004180
4181 // pointer type decayed from an array or function type.
4182 case clang::Type::Decayed: break;
4183 case clang::Type::Adjusted: break;
4184 }
4185 // We don't know hot to display this type...
4186 return lldb::eTypeClassOther;
4187
4188}
4189
4190unsigned
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004191ClangASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004192{
4193 if (type)
4194 return GetQualType(type).getQualifiers().getCVRQualifiers();
4195 return 0;
4196}
4197
4198//----------------------------------------------------------------------
4199// Creating related types
4200//----------------------------------------------------------------------
4201
Greg Claytona1e5dc82015-08-11 22:53:00 +00004202CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004203ClangASTContext::GetArrayElementType (lldb::opaque_compiler_type_t type, uint64_t *stride)
Greg Claytond8d4a572015-08-11 21:38:15 +00004204{
4205 if (type)
4206 {
4207 clang::QualType qual_type(GetCanonicalQualType(type));
4208
4209 const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
4210
4211 if (!array_eletype)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004212 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004213
Greg Claytona1e5dc82015-08-11 22:53:00 +00004214 CompilerType element_type (getASTContext(), array_eletype->getCanonicalTypeUnqualified());
Greg Claytond8d4a572015-08-11 21:38:15 +00004215
4216 // TODO: the real stride will be >= this value.. find the real one!
4217 if (stride)
4218 *stride = element_type.GetByteSize(nullptr);
4219
4220 return element_type;
4221
4222 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004223 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004224}
4225
Greg Claytona1e5dc82015-08-11 22:53:00 +00004226CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004227ClangASTContext::GetCanonicalType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004228{
4229 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004230 return CompilerType (getASTContext(), GetCanonicalQualType(type));
4231 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004232}
4233
4234static clang::QualType
4235GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
4236{
4237 if (qual_type->isPointerType())
4238 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
4239 else
4240 qual_type = qual_type.getUnqualifiedType();
4241 qual_type.removeLocalConst();
4242 qual_type.removeLocalRestrict();
4243 qual_type.removeLocalVolatile();
4244 return qual_type;
4245}
4246
Greg Claytona1e5dc82015-08-11 22:53:00 +00004247CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004248ClangASTContext::GetFullyUnqualifiedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004249{
4250 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004251 return CompilerType(getASTContext(), GetFullyUnqualifiedType_Impl(getASTContext(), GetQualType(type)));
4252 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004253}
4254
4255
4256int
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004257ClangASTContext::GetFunctionArgumentCount (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004258{
4259 if (type)
4260 {
4261 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
4262 if (func)
4263 return func->getNumParams();
4264 }
4265 return -1;
4266}
4267
Greg Claytona1e5dc82015-08-11 22:53:00 +00004268CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004269ClangASTContext::GetFunctionArgumentTypeAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004270{
4271 if (type)
4272 {
Greg Clayton8b8874e2015-12-17 00:58:41 +00004273 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004274 if (func)
4275 {
4276 const uint32_t num_args = func->getNumParams();
4277 if (idx < num_args)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004278 return CompilerType(getASTContext(), func->getParamType(idx));
Greg Claytond8d4a572015-08-11 21:38:15 +00004279 }
4280 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004281 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004282}
4283
Greg Claytona1e5dc82015-08-11 22:53:00 +00004284CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004285ClangASTContext::GetFunctionReturnType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004286{
4287 if (type)
4288 {
Greg Clayton8b8874e2015-12-17 00:58:41 +00004289 clang::QualType qual_type(GetQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004290 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
4291 if (func)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004292 return CompilerType(getASTContext(), func->getReturnType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004293 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004294 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004295}
4296
4297size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004298ClangASTContext::GetNumMemberFunctions (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004299{
4300 size_t num_functions = 0;
4301 if (type)
4302 {
4303 clang::QualType qual_type(GetCanonicalQualType(type));
4304 switch (qual_type->getTypeClass()) {
4305 case clang::Type::Record:
4306 if (GetCompleteQualType (getASTContext(), qual_type))
4307 {
4308 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4309 const clang::RecordDecl *record_decl = record_type->getDecl();
4310 assert(record_decl);
4311 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4312 if (cxx_record_decl)
4313 num_functions = std::distance(cxx_record_decl->method_begin(), cxx_record_decl->method_end());
4314 }
4315 break;
4316
4317 case clang::Type::ObjCObjectPointer:
4318 if (GetCompleteType(type))
4319 {
4320 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4321 if (objc_class_type)
4322 {
4323 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4324 if (class_interface_decl)
4325 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4326 }
4327 }
4328 break;
4329
4330 case clang::Type::ObjCObject:
4331 case clang::Type::ObjCInterface:
4332 if (GetCompleteType(type))
4333 {
4334 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4335 if (objc_class_type)
4336 {
4337 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4338 if (class_interface_decl)
4339 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4340 }
4341 }
4342 break;
4343
4344
4345 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004346 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumMemberFunctions();
Enrico Granata36f51e42015-12-18 22:41:25 +00004347
4348 case clang::Type::Auto:
4349 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004350
4351 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004352 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004353
4354 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004355 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004356
4357 default:
4358 break;
4359 }
4360 }
4361 return num_functions;
4362}
4363
4364TypeMemberFunctionImpl
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004365ClangASTContext::GetMemberFunctionAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004366{
Greg Claytonfe689042015-11-10 17:47:04 +00004367 std::string name;
Greg Claytond8d4a572015-08-11 21:38:15 +00004368 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
Greg Claytonfe689042015-11-10 17:47:04 +00004369 CompilerType clang_type;
4370 CompilerDecl clang_decl;
Greg Claytond8d4a572015-08-11 21:38:15 +00004371 if (type)
4372 {
4373 clang::QualType qual_type(GetCanonicalQualType(type));
4374 switch (qual_type->getTypeClass()) {
4375 case clang::Type::Record:
4376 if (GetCompleteQualType (getASTContext(), qual_type))
4377 {
4378 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4379 const clang::RecordDecl *record_decl = record_type->getDecl();
4380 assert(record_decl);
4381 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4382 if (cxx_record_decl)
4383 {
4384 auto method_iter = cxx_record_decl->method_begin();
4385 auto method_end = cxx_record_decl->method_end();
4386 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4387 {
4388 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004389 clang::CXXMethodDecl *cxx_method_decl = method_iter->getCanonicalDecl();
4390 if (cxx_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004391 {
Greg Claytonfe689042015-11-10 17:47:04 +00004392 name = cxx_method_decl->getDeclName().getAsString();
4393 if (cxx_method_decl->isStatic())
Greg Claytond8d4a572015-08-11 21:38:15 +00004394 kind = lldb::eMemberFunctionKindStaticMethod;
Greg Claytonfe689042015-11-10 17:47:04 +00004395 else if (llvm::isa<clang::CXXConstructorDecl>(cxx_method_decl))
Greg Claytond8d4a572015-08-11 21:38:15 +00004396 kind = lldb::eMemberFunctionKindConstructor;
Greg Claytonfe689042015-11-10 17:47:04 +00004397 else if (llvm::isa<clang::CXXDestructorDecl>(cxx_method_decl))
Greg Claytond8d4a572015-08-11 21:38:15 +00004398 kind = lldb::eMemberFunctionKindDestructor;
4399 else
4400 kind = lldb::eMemberFunctionKindInstanceMethod;
Greg Claytonfe689042015-11-10 17:47:04 +00004401 clang_type = CompilerType(this, cxx_method_decl->getType().getAsOpaquePtr());
4402 clang_decl = CompilerDecl(this, cxx_method_decl);
Greg Claytond8d4a572015-08-11 21:38:15 +00004403 }
4404 }
4405 }
4406 }
4407 break;
4408
4409 case clang::Type::ObjCObjectPointer:
4410 if (GetCompleteType(type))
4411 {
4412 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4413 if (objc_class_type)
4414 {
4415 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4416 if (class_interface_decl)
4417 {
4418 auto method_iter = class_interface_decl->meth_begin();
4419 auto method_end = class_interface_decl->meth_end();
4420 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4421 {
4422 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004423 clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
4424 if (objc_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004425 {
Greg Claytonfe689042015-11-10 17:47:04 +00004426 clang_decl = CompilerDecl(this, objc_method_decl);
4427 name = objc_method_decl->getSelector().getAsString();
4428 if (objc_method_decl->isClassMethod())
Greg Claytond8d4a572015-08-11 21:38:15 +00004429 kind = lldb::eMemberFunctionKindStaticMethod;
4430 else
4431 kind = lldb::eMemberFunctionKindInstanceMethod;
4432 }
4433 }
4434 }
4435 }
4436 }
4437 break;
4438
4439 case clang::Type::ObjCObject:
4440 case clang::Type::ObjCInterface:
4441 if (GetCompleteType(type))
4442 {
4443 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4444 if (objc_class_type)
4445 {
4446 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4447 if (class_interface_decl)
4448 {
4449 auto method_iter = class_interface_decl->meth_begin();
4450 auto method_end = class_interface_decl->meth_end();
4451 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4452 {
4453 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004454 clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
4455 if (objc_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004456 {
Greg Claytonfe689042015-11-10 17:47:04 +00004457 clang_decl = CompilerDecl(this, objc_method_decl);
4458 name = objc_method_decl->getSelector().getAsString();
4459 if (objc_method_decl->isClassMethod())
Greg Claytond8d4a572015-08-11 21:38:15 +00004460 kind = lldb::eMemberFunctionKindStaticMethod;
4461 else
4462 kind = lldb::eMemberFunctionKindInstanceMethod;
4463 }
4464 }
4465 }
4466 }
4467 }
4468 break;
4469
4470 case clang::Type::Typedef:
4471 return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx);
Enrico Granata36f51e42015-12-18 22:41:25 +00004472
4473 case clang::Type::Auto:
4474 return GetMemberFunctionAtIndex(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004475
4476 case clang::Type::Elaborated:
4477 return GetMemberFunctionAtIndex(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx);
4478
4479 case clang::Type::Paren:
4480 return GetMemberFunctionAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx);
4481
4482 default:
4483 break;
4484 }
4485 }
4486
4487 if (kind == eMemberFunctionKindUnknown)
4488 return TypeMemberFunctionImpl();
Greg Claytonfe689042015-11-10 17:47:04 +00004489 else
4490 return TypeMemberFunctionImpl(clang_type, clang_decl, name, kind);
Greg Claytond8d4a572015-08-11 21:38:15 +00004491}
4492
Greg Claytona1e5dc82015-08-11 22:53:00 +00004493CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004494ClangASTContext::GetNonReferenceType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004495{
4496 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004497 return CompilerType(getASTContext(), GetQualType(type).getNonReferenceType());
4498 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004499}
4500
Greg Claytona1e5dc82015-08-11 22:53:00 +00004501CompilerType
4502ClangASTContext::CreateTypedefType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00004503 const char *typedef_name,
Greg Clayton99558cc42015-08-24 23:46:31 +00004504 const CompilerDeclContext &compiler_decl_ctx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004505{
4506 if (type && typedef_name && typedef_name[0])
4507 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004508 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004509 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004510 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004511 clang::ASTContext* clang_ast = ast->getASTContext();
4512 clang::QualType qual_type (GetQualType(type));
Greg Clayton99558cc42015-08-24 23:46:31 +00004513
4514 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004515 if (decl_ctx == nullptr)
4516 decl_ctx = ast->getASTContext()->getTranslationUnitDecl();
Greg Clayton99558cc42015-08-24 23:46:31 +00004517
Greg Claytond8d4a572015-08-11 21:38:15 +00004518 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4519 decl_ctx,
4520 clang::SourceLocation(),
4521 clang::SourceLocation(),
4522 &clang_ast->Idents.get(typedef_name),
4523 clang_ast->getTrivialTypeSourceInfo(qual_type));
4524
4525 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4526
4527 // Get a uniqued clang::QualType for the typedef decl type
Greg Claytona1e5dc82015-08-11 22:53:00 +00004528 return CompilerType (clang_ast, clang_ast->getTypedefType (decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00004529 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004530 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004531
4532}
4533
Greg Claytona1e5dc82015-08-11 22:53:00 +00004534CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004535ClangASTContext::GetPointeeType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004536{
4537 if (type)
4538 {
4539 clang::QualType qual_type(GetQualType(type));
Greg Claytona1e5dc82015-08-11 22:53:00 +00004540 return CompilerType (getASTContext(), qual_type.getTypePtr()->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004541 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004542 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004543}
4544
Greg Claytona1e5dc82015-08-11 22:53:00 +00004545CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004546ClangASTContext::GetPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004547{
4548 if (type)
4549 {
4550 clang::QualType qual_type (GetQualType(type));
4551
4552 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4553 switch (type_class)
4554 {
4555 case clang::Type::ObjCObject:
4556 case clang::Type::ObjCInterface:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004557 return CompilerType(getASTContext(), getASTContext()->getObjCObjectPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004558
4559 default:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004560 return CompilerType(getASTContext(), getASTContext()->getPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004561 }
4562 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004563 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004564}
4565
Greg Clayton56939cb2015-09-17 22:23:34 +00004566
4567CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004568ClangASTContext::GetLValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004569{
4570 if (type)
4571 return CompilerType(this, getASTContext()->getLValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4572 else
4573 return CompilerType();
4574}
4575
4576CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004577ClangASTContext::GetRValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004578{
4579 if (type)
4580 return CompilerType(this, getASTContext()->getRValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4581 else
4582 return CompilerType();
4583}
4584
4585CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004586ClangASTContext::AddConstModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004587{
4588 if (type)
4589 {
4590 clang::QualType result(GetQualType(type));
4591 result.addConst();
4592 return CompilerType (this, result.getAsOpaquePtr());
4593 }
4594 return CompilerType();
4595}
4596
4597CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004598ClangASTContext::AddVolatileModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004599{
4600 if (type)
4601 {
4602 clang::QualType result(GetQualType(type));
4603 result.addVolatile();
4604 return CompilerType (this, result.getAsOpaquePtr());
4605 }
4606 return CompilerType();
4607
4608}
4609
4610CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004611ClangASTContext::AddRestrictModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004612{
4613 if (type)
4614 {
4615 clang::QualType result(GetQualType(type));
4616 result.addRestrict();
4617 return CompilerType (this, result.getAsOpaquePtr());
4618 }
4619 return CompilerType();
4620
4621}
4622
4623CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004624ClangASTContext::CreateTypedef (lldb::opaque_compiler_type_t type, const char *typedef_name, const CompilerDeclContext &compiler_decl_ctx)
Greg Clayton56939cb2015-09-17 22:23:34 +00004625{
4626 if (type)
4627 {
4628 clang::ASTContext* clang_ast = getASTContext();
4629 clang::QualType qual_type (GetQualType(type));
4630
4631 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
4632 if (decl_ctx == nullptr)
4633 decl_ctx = getASTContext()->getTranslationUnitDecl();
4634
4635 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4636 decl_ctx,
4637 clang::SourceLocation(),
4638 clang::SourceLocation(),
4639 &clang_ast->Idents.get(typedef_name),
4640 clang_ast->getTrivialTypeSourceInfo(qual_type));
4641
4642 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4643
4644 // Get a uniqued clang::QualType for the typedef decl type
4645 return CompilerType (this, clang_ast->getTypedefType (decl).getAsOpaquePtr());
4646
4647 }
4648 return CompilerType();
4649
4650}
4651
Greg Claytona1e5dc82015-08-11 22:53:00 +00004652CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004653ClangASTContext::GetTypedefedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004654{
4655 if (type)
4656 {
4657 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4658 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004659 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004660 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004661 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004662}
4663
Greg Claytona1e5dc82015-08-11 22:53:00 +00004664CompilerType
4665ClangASTContext::RemoveFastQualifiers (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004666{
Ryan Brown57bee1e2015-09-14 22:45:11 +00004667 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00004668 {
4669 clang::QualType qual_type(GetQualType(type));
4670 qual_type.getQualifiers().removeFastQualifiers();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004671 return CompilerType (type.GetTypeSystem(), qual_type.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004672 }
4673 return type;
4674}
4675
4676
4677//----------------------------------------------------------------------
4678// Create related types using the current type's AST
4679//----------------------------------------------------------------------
4680
Greg Claytona1e5dc82015-08-11 22:53:00 +00004681CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00004682ClangASTContext::GetBasicTypeFromAST (lldb::BasicType basic_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004683{
Greg Clayton99558cc42015-08-24 23:46:31 +00004684 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004685}
4686//----------------------------------------------------------------------
4687// Exploring the type
4688//----------------------------------------------------------------------
4689
4690uint64_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004691ClangASTContext::GetBitSize (lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope)
Greg Claytond8d4a572015-08-11 21:38:15 +00004692{
4693 if (GetCompleteType (type))
4694 {
4695 clang::QualType qual_type(GetCanonicalQualType(type));
4696 switch (qual_type->getTypeClass())
4697 {
4698 case clang::Type::ObjCInterface:
4699 case clang::Type::ObjCObject:
4700 {
4701 ExecutionContext exe_ctx (exe_scope);
4702 Process *process = exe_ctx.GetProcessPtr();
4703 if (process)
4704 {
4705 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4706 if (objc_runtime)
4707 {
4708 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004709 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00004710 return bit_size;
4711 }
4712 }
4713 else
4714 {
4715 static bool g_printed = false;
4716 if (!g_printed)
4717 {
4718 StreamString s;
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00004719 DumpTypeDescription(type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00004720
4721 llvm::outs() << "warning: trying to determine the size of type ";
4722 llvm::outs() << s.GetString() << "\n";
4723 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
4724 llvm::outs() << "backtrace:\n";
4725 llvm::sys::PrintStackTrace(llvm::outs());
4726 llvm::outs() << "\n";
4727 g_printed = true;
4728 }
4729 }
4730 }
4731 // fallthrough
4732 default:
4733 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
4734 if (bit_size == 0)
4735 {
4736 if (qual_type->isIncompleteArrayType())
4737 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
4738 }
4739 if (qual_type->isObjCObjectOrInterfaceType())
4740 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
4741 return bit_size;
4742 }
4743 }
4744 return 0;
4745}
4746
4747size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004748ClangASTContext::GetTypeBitAlign (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004749{
4750 if (GetCompleteType(type))
4751 return getASTContext()->getTypeAlign(GetQualType(type));
4752 return 0;
4753}
4754
4755
4756lldb::Encoding
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004757ClangASTContext::GetEncoding (lldb::opaque_compiler_type_t type, uint64_t &count)
Greg Claytond8d4a572015-08-11 21:38:15 +00004758{
4759 if (!type)
4760 return lldb::eEncodingInvalid;
4761
4762 count = 1;
4763 clang::QualType qual_type(GetCanonicalQualType(type));
4764
4765 switch (qual_type->getTypeClass())
4766 {
4767 case clang::Type::UnaryTransform:
4768 break;
4769
4770 case clang::Type::FunctionNoProto:
4771 case clang::Type::FunctionProto:
4772 break;
4773
4774 case clang::Type::IncompleteArray:
4775 case clang::Type::VariableArray:
4776 break;
4777
4778 case clang::Type::ConstantArray:
4779 break;
4780
4781 case clang::Type::ExtVector:
4782 case clang::Type::Vector:
4783 // TODO: Set this to more than one???
4784 break;
4785
4786 case clang::Type::Builtin:
4787 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4788 {
Greg Claytond8d4a572015-08-11 21:38:15 +00004789 case clang::BuiltinType::Void:
4790 break;
4791
4792 case clang::BuiltinType::Bool:
4793 case clang::BuiltinType::Char_S:
4794 case clang::BuiltinType::SChar:
4795 case clang::BuiltinType::WChar_S:
4796 case clang::BuiltinType::Char16:
4797 case clang::BuiltinType::Char32:
4798 case clang::BuiltinType::Short:
4799 case clang::BuiltinType::Int:
4800 case clang::BuiltinType::Long:
4801 case clang::BuiltinType::LongLong:
4802 case clang::BuiltinType::Int128: return lldb::eEncodingSint;
4803
4804 case clang::BuiltinType::Char_U:
4805 case clang::BuiltinType::UChar:
4806 case clang::BuiltinType::WChar_U:
4807 case clang::BuiltinType::UShort:
4808 case clang::BuiltinType::UInt:
4809 case clang::BuiltinType::ULong:
4810 case clang::BuiltinType::ULongLong:
4811 case clang::BuiltinType::UInt128: return lldb::eEncodingUint;
4812
Greg Claytondee40e72015-11-03 23:23:22 +00004813 case clang::BuiltinType::Half:
Greg Claytond8d4a572015-08-11 21:38:15 +00004814 case clang::BuiltinType::Float:
4815 case clang::BuiltinType::Double:
4816 case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
4817
4818 case clang::BuiltinType::ObjCClass:
4819 case clang::BuiltinType::ObjCId:
4820 case clang::BuiltinType::ObjCSel: return lldb::eEncodingUint;
4821
4822 case clang::BuiltinType::NullPtr: return lldb::eEncodingUint;
4823
4824 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4825 case clang::BuiltinType::Kind::BoundMember:
4826 case clang::BuiltinType::Kind::BuiltinFn:
4827 case clang::BuiltinType::Kind::Dependent:
Ed Mastec6dd6512015-09-23 18:32:34 +00004828 case clang::BuiltinType::Kind::OCLClkEvent:
Greg Claytond8d4a572015-08-11 21:38:15 +00004829 case clang::BuiltinType::Kind::OCLEvent:
4830 case clang::BuiltinType::Kind::OCLImage1d:
4831 case clang::BuiltinType::Kind::OCLImage1dArray:
4832 case clang::BuiltinType::Kind::OCLImage1dBuffer:
4833 case clang::BuiltinType::Kind::OCLImage2d:
4834 case clang::BuiltinType::Kind::OCLImage2dArray:
Ed Mastec6dd6512015-09-23 18:32:34 +00004835 case clang::BuiltinType::Kind::OCLImage2dArrayDepth:
4836 case clang::BuiltinType::Kind::OCLImage2dArrayMSAA:
4837 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepth:
4838 case clang::BuiltinType::Kind::OCLImage2dDepth:
4839 case clang::BuiltinType::Kind::OCLImage2dMSAA:
4840 case clang::BuiltinType::Kind::OCLImage2dMSAADepth:
Greg Claytond8d4a572015-08-11 21:38:15 +00004841 case clang::BuiltinType::Kind::OCLImage3d:
Ed Mastec6dd6512015-09-23 18:32:34 +00004842 case clang::BuiltinType::Kind::OCLQueue:
4843 case clang::BuiltinType::Kind::OCLNDRange:
4844 case clang::BuiltinType::Kind::OCLReserveID:
Greg Claytond8d4a572015-08-11 21:38:15 +00004845 case clang::BuiltinType::Kind::OCLSampler:
Ed Mastec6dd6512015-09-23 18:32:34 +00004846 case clang::BuiltinType::Kind::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00004847 case clang::BuiltinType::Kind::Overload:
4848 case clang::BuiltinType::Kind::PseudoObject:
4849 case clang::BuiltinType::Kind::UnknownAny:
4850 break;
4851 }
4852 break;
4853 // All pointer types are represented as unsigned integer encodings.
4854 // We may nee to add a eEncodingPointer if we ever need to know the
4855 // difference
4856 case clang::Type::ObjCObjectPointer:
4857 case clang::Type::BlockPointer:
4858 case clang::Type::Pointer:
4859 case clang::Type::LValueReference:
4860 case clang::Type::RValueReference:
4861 case clang::Type::MemberPointer: return lldb::eEncodingUint;
4862 case clang::Type::Complex:
4863 {
4864 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4865 if (qual_type->isComplexType())
4866 encoding = lldb::eEncodingIEEE754;
4867 else
4868 {
4869 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
4870 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004871 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004872 else
4873 encoding = lldb::eEncodingSint;
4874 }
4875 count = 2;
4876 return encoding;
4877 }
4878
4879 case clang::Type::ObjCInterface: break;
4880 case clang::Type::Record: break;
4881 case clang::Type::Enum: return lldb::eEncodingSint;
4882 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004883 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Enrico Granata36f51e42015-12-18 22:41:25 +00004884
4885 case clang::Type::Auto:
4886 return CompilerType(getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004887
4888 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004889 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004890
4891 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004892 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004893
4894 case clang::Type::DependentSizedArray:
4895 case clang::Type::DependentSizedExtVector:
4896 case clang::Type::UnresolvedUsing:
4897 case clang::Type::Attributed:
4898 case clang::Type::TemplateTypeParm:
4899 case clang::Type::SubstTemplateTypeParm:
4900 case clang::Type::SubstTemplateTypeParmPack:
Greg Claytond8d4a572015-08-11 21:38:15 +00004901 case clang::Type::InjectedClassName:
4902 case clang::Type::DependentName:
4903 case clang::Type::DependentTemplateSpecialization:
4904 case clang::Type::PackExpansion:
4905 case clang::Type::ObjCObject:
4906
4907 case clang::Type::TypeOfExpr:
4908 case clang::Type::TypeOf:
4909 case clang::Type::Decltype:
4910 case clang::Type::TemplateSpecialization:
4911 case clang::Type::Atomic:
4912 case clang::Type::Adjusted:
Pavel Labath484f0a32016-01-12 08:51:28 +00004913 case clang::Type::Pipe:
Greg Claytond8d4a572015-08-11 21:38:15 +00004914 break;
4915
4916 // pointer type decayed from an array or function type.
4917 case clang::Type::Decayed:
4918 break;
4919 }
4920 count = 0;
4921 return lldb::eEncodingInvalid;
4922}
4923
4924lldb::Format
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004925ClangASTContext::GetFormat (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004926{
4927 if (!type)
4928 return lldb::eFormatDefault;
4929
4930 clang::QualType qual_type(GetCanonicalQualType(type));
4931
4932 switch (qual_type->getTypeClass())
4933 {
4934 case clang::Type::UnaryTransform:
4935 break;
4936
4937 case clang::Type::FunctionNoProto:
4938 case clang::Type::FunctionProto:
4939 break;
4940
4941 case clang::Type::IncompleteArray:
4942 case clang::Type::VariableArray:
4943 break;
4944
4945 case clang::Type::ConstantArray:
4946 return lldb::eFormatVoid; // no value
4947
4948 case clang::Type::ExtVector:
4949 case clang::Type::Vector:
4950 break;
4951
4952 case clang::Type::Builtin:
4953 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4954 {
4955 //default: assert(0 && "Unknown builtin type!");
4956 case clang::BuiltinType::UnknownAny:
4957 case clang::BuiltinType::Void:
4958 case clang::BuiltinType::BoundMember:
4959 break;
4960
4961 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
4962 case clang::BuiltinType::Char_S:
4963 case clang::BuiltinType::SChar:
4964 case clang::BuiltinType::WChar_S:
4965 case clang::BuiltinType::Char_U:
4966 case clang::BuiltinType::UChar:
4967 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
4968 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
4969 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
4970 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
4971 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
4972 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
4973 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
4974 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
4975 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
4976 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
4977 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
4978 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
4979 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
Greg Claytondee40e72015-11-03 23:23:22 +00004980 case clang::BuiltinType::Half:
4981 case clang::BuiltinType::Float:
4982 case clang::BuiltinType::Double:
Greg Claytond8d4a572015-08-11 21:38:15 +00004983 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
Zachary Turnerdd07e002015-09-16 18:08:45 +00004984 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00004985 return lldb::eFormatHex;
4986 }
4987 break;
4988 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
4989 case clang::Type::BlockPointer: return lldb::eFormatHex;
4990 case clang::Type::Pointer: return lldb::eFormatHex;
4991 case clang::Type::LValueReference:
4992 case clang::Type::RValueReference: return lldb::eFormatHex;
4993 case clang::Type::MemberPointer: break;
4994 case clang::Type::Complex:
4995 {
4996 if (qual_type->isComplexType())
4997 return lldb::eFormatComplex;
4998 else
4999 return lldb::eFormatComplexInteger;
5000 }
5001 case clang::Type::ObjCInterface: break;
5002 case clang::Type::Record: break;
5003 case clang::Type::Enum: return lldb::eFormatEnum;
5004 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005005 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005006 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005007 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005008 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005009 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005010 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005011 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005012 case clang::Type::DependentSizedArray:
5013 case clang::Type::DependentSizedExtVector:
5014 case clang::Type::UnresolvedUsing:
5015 case clang::Type::Attributed:
5016 case clang::Type::TemplateTypeParm:
5017 case clang::Type::SubstTemplateTypeParm:
5018 case clang::Type::SubstTemplateTypeParmPack:
5019 case clang::Type::InjectedClassName:
5020 case clang::Type::DependentName:
5021 case clang::Type::DependentTemplateSpecialization:
5022 case clang::Type::PackExpansion:
5023 case clang::Type::ObjCObject:
5024
5025 case clang::Type::TypeOfExpr:
5026 case clang::Type::TypeOf:
5027 case clang::Type::Decltype:
5028 case clang::Type::TemplateSpecialization:
5029 case clang::Type::Atomic:
5030 case clang::Type::Adjusted:
Pavel Labath484f0a32016-01-12 08:51:28 +00005031 case clang::Type::Pipe:
Greg Claytond8d4a572015-08-11 21:38:15 +00005032 break;
5033
5034 // pointer type decayed from an array or function type.
5035 case clang::Type::Decayed:
5036 break;
5037 }
5038 // We don't know hot to display this type...
5039 return lldb::eFormatBytes;
5040}
5041
5042static bool
5043ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
5044{
5045 while (class_interface_decl)
5046 {
5047 if (class_interface_decl->ivar_size() > 0)
5048 return true;
5049
5050 if (check_superclass)
5051 class_interface_decl = class_interface_decl->getSuperClass();
5052 else
5053 break;
5054 }
5055 return false;
5056}
5057
5058uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005059ClangASTContext::GetNumChildren (lldb::opaque_compiler_type_t type, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00005060{
5061 if (!type)
5062 return 0;
5063
5064 uint32_t num_children = 0;
5065 clang::QualType qual_type(GetQualType(type));
5066 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5067 switch (type_class)
5068 {
5069 case clang::Type::Builtin:
5070 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5071 {
5072 case clang::BuiltinType::ObjCId: // child is Class
5073 case clang::BuiltinType::ObjCClass: // child is Class
5074 num_children = 1;
5075 break;
5076
5077 default:
5078 break;
5079 }
5080 break;
5081
5082 case clang::Type::Complex: return 0;
5083
5084 case clang::Type::Record:
5085 if (GetCompleteQualType (getASTContext(), qual_type))
5086 {
5087 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5088 const clang::RecordDecl *record_decl = record_type->getDecl();
5089 assert(record_decl);
5090 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5091 if (cxx_record_decl)
5092 {
5093 if (omit_empty_base_classes)
5094 {
5095 // Check each base classes to see if it or any of its
5096 // base classes contain any fields. This can help
5097 // limit the noise in variable views by not having to
5098 // show base classes that contain no members.
5099 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5100 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5101 base_class != base_class_end;
5102 ++base_class)
5103 {
5104 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5105
5106 // Skip empty base classes
5107 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5108 continue;
5109
5110 num_children++;
5111 }
5112 }
5113 else
5114 {
5115 // Include all base classes
5116 num_children += cxx_record_decl->getNumBases();
5117 }
5118
5119 }
5120 clang::RecordDecl::field_iterator field, field_end;
5121 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5122 ++num_children;
5123 }
5124 break;
5125
5126 case clang::Type::ObjCObject:
5127 case clang::Type::ObjCInterface:
5128 if (GetCompleteQualType (getASTContext(), qual_type))
5129 {
5130 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5131 assert (objc_class_type);
5132 if (objc_class_type)
5133 {
5134 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5135
5136 if (class_interface_decl)
5137 {
5138
5139 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5140 if (superclass_interface_decl)
5141 {
5142 if (omit_empty_base_classes)
5143 {
5144 if (ObjCDeclHasIVars (superclass_interface_decl, true))
5145 ++num_children;
5146 }
5147 else
5148 ++num_children;
5149 }
5150
5151 num_children += class_interface_decl->ivar_size();
5152 }
5153 }
5154 }
5155 break;
5156
5157 case clang::Type::ObjCObjectPointer:
5158 {
5159 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
5160 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005161 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005162 // If this type points to a simple type, then it has 1 child
5163 if (num_pointee_children == 0)
5164 num_children = 1;
5165 else
5166 num_children = num_pointee_children;
5167 }
5168 break;
5169
5170 case clang::Type::Vector:
5171 case clang::Type::ExtVector:
5172 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
5173 break;
5174
5175 case clang::Type::ConstantArray:
5176 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
5177 break;
5178
5179 case clang::Type::Pointer:
5180 {
5181 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
5182 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00005183 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005184 if (num_pointee_children == 0)
5185 {
5186 // We have a pointer to a pointee type that claims it has no children.
5187 // We will want to look at
5188 num_children = GetNumPointeeChildren (pointee_type);
5189 }
5190 else
5191 num_children = num_pointee_children;
5192 }
5193 break;
5194
5195 case clang::Type::LValueReference:
5196 case clang::Type::RValueReference:
5197 {
5198 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
5199 clang::QualType pointee_type = reference_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005200 uint32_t num_pointee_children = CompilerType (getASTContext(), pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005201 // If this type points to a simple type, then it has 1 child
5202 if (num_pointee_children == 0)
5203 num_children = 1;
5204 else
5205 num_children = num_pointee_children;
5206 }
5207 break;
5208
5209
5210 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005211 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005212 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00005213
5214 case clang::Type::Auto:
5215 num_children = CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumChildren (omit_empty_base_classes);
5216 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00005217
5218 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005219 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005220 break;
5221
5222 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005223 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005224 break;
5225 default:
5226 break;
5227 }
5228 return num_children;
5229}
5230
Greg Clayton56939cb2015-09-17 22:23:34 +00005231CompilerType
5232ClangASTContext::GetBuiltinTypeByName (const ConstString &name)
5233{
5234 return GetBasicType (GetBasicTypeEnumeration (name));
5235}
5236
Greg Claytond8d4a572015-08-11 21:38:15 +00005237lldb::BasicType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005238ClangASTContext::GetBasicTypeEnumeration (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005239{
5240 if (type)
5241 {
5242 clang::QualType qual_type(GetQualType(type));
5243 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5244 if (type_class == clang::Type::Builtin)
5245 {
5246 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5247 {
5248 case clang::BuiltinType::Void: return eBasicTypeVoid;
5249 case clang::BuiltinType::Bool: return eBasicTypeBool;
5250 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
5251 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
5252 case clang::BuiltinType::Char16: return eBasicTypeChar16;
5253 case clang::BuiltinType::Char32: return eBasicTypeChar32;
5254 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
5255 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
5256 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
5257 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
5258 case clang::BuiltinType::Short: return eBasicTypeShort;
5259 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
5260 case clang::BuiltinType::Int: return eBasicTypeInt;
5261 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
5262 case clang::BuiltinType::Long: return eBasicTypeLong;
5263 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
5264 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
5265 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
5266 case clang::BuiltinType::Int128: return eBasicTypeInt128;
5267 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
5268
5269 case clang::BuiltinType::Half: return eBasicTypeHalf;
5270 case clang::BuiltinType::Float: return eBasicTypeFloat;
5271 case clang::BuiltinType::Double: return eBasicTypeDouble;
5272 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
5273
5274 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
5275 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
5276 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
5277 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005278 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00005279 return eBasicTypeOther;
5280 }
5281 }
5282 }
5283 return eBasicTypeInvalid;
5284}
5285
Greg Clayton99558cc42015-08-24 23:46:31 +00005286void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005287ClangASTContext::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 +00005288{
5289 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
5290 if (enum_type)
5291 {
5292 const clang::EnumDecl *enum_decl = enum_type->getDecl();
5293 if (enum_decl)
5294 {
5295 CompilerType integer_type(this, enum_decl->getIntegerType().getAsOpaquePtr());
5296
5297 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
5298 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
5299 {
5300 ConstString name(enum_pos->getNameAsString().c_str());
5301 if (!callback (integer_type, name, enum_pos->getInitVal()))
5302 break;
5303 }
5304 }
5305 }
5306}
5307
Greg Claytond8d4a572015-08-11 21:38:15 +00005308
5309#pragma mark Aggregate Types
5310
5311uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005312ClangASTContext::GetNumFields (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005313{
5314 if (!type)
5315 return 0;
5316
5317 uint32_t count = 0;
5318 clang::QualType qual_type(GetCanonicalQualType(type));
5319 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5320 switch (type_class)
5321 {
5322 case clang::Type::Record:
5323 if (GetCompleteType(type))
5324 {
5325 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
5326 if (record_type)
5327 {
5328 clang::RecordDecl *record_decl = record_type->getDecl();
5329 if (record_decl)
5330 {
5331 uint32_t field_idx = 0;
5332 clang::RecordDecl::field_iterator field, field_end;
5333 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5334 ++field_idx;
5335 count = field_idx;
5336 }
5337 }
5338 }
5339 break;
5340
5341 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005342 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005343 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00005344
5345 case clang::Type::Auto:
5346 count = CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumFields();
5347 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00005348
5349 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005350 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005351 break;
5352
5353 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005354 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005355 break;
5356
5357 case clang::Type::ObjCObjectPointer:
5358 if (GetCompleteType(type))
5359 {
5360 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5361 if (objc_class_type)
5362 {
5363 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
5364
5365 if (class_interface_decl)
5366 count = class_interface_decl->ivar_size();
5367 }
5368 }
5369 break;
5370
5371 case clang::Type::ObjCObject:
5372 case clang::Type::ObjCInterface:
5373 if (GetCompleteType(type))
5374 {
5375 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5376 if (objc_class_type)
5377 {
5378 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5379
5380 if (class_interface_decl)
5381 count = class_interface_decl->ivar_size();
5382 }
5383 }
5384 break;
5385
5386 default:
5387 break;
5388 }
5389 return count;
5390}
5391
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005392static lldb::opaque_compiler_type_t
Greg Claytond8d4a572015-08-11 21:38:15 +00005393GetObjCFieldAtIndex (clang::ASTContext *ast,
5394 clang::ObjCInterfaceDecl *class_interface_decl,
5395 size_t idx,
5396 std::string& name,
5397 uint64_t *bit_offset_ptr,
5398 uint32_t *bitfield_bit_size_ptr,
5399 bool *is_bitfield_ptr)
5400{
5401 if (class_interface_decl)
5402 {
5403 if (idx < (class_interface_decl->ivar_size()))
5404 {
5405 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5406 uint32_t ivar_idx = 0;
5407
5408 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
5409 {
5410 if (ivar_idx == idx)
5411 {
5412 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5413
5414 clang::QualType ivar_qual_type(ivar_decl->getType());
5415
5416 name.assign(ivar_decl->getNameAsString());
5417
5418 if (bit_offset_ptr)
5419 {
5420 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
5421 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
5422 }
5423
5424 const bool is_bitfield = ivar_pos->isBitField();
5425
5426 if (bitfield_bit_size_ptr)
5427 {
5428 *bitfield_bit_size_ptr = 0;
5429
5430 if (is_bitfield && ast)
5431 {
5432 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
5433 llvm::APSInt bitfield_apsint;
5434 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
5435 {
5436 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5437 }
5438 }
5439 }
5440 if (is_bitfield_ptr)
5441 *is_bitfield_ptr = is_bitfield;
5442
5443 return ivar_qual_type.getAsOpaquePtr();
5444 }
5445 }
5446 }
5447 }
5448 return nullptr;
5449}
5450
Greg Claytona1e5dc82015-08-11 22:53:00 +00005451CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005452ClangASTContext::GetFieldAtIndex (lldb::opaque_compiler_type_t type, size_t idx,
Greg Claytond8d4a572015-08-11 21:38:15 +00005453 std::string& name,
5454 uint64_t *bit_offset_ptr,
5455 uint32_t *bitfield_bit_size_ptr,
5456 bool *is_bitfield_ptr)
5457{
5458 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005459 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005460
5461 clang::QualType qual_type(GetCanonicalQualType(type));
5462 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5463 switch (type_class)
5464 {
5465 case clang::Type::Record:
5466 if (GetCompleteType(type))
5467 {
5468 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5469 const clang::RecordDecl *record_decl = record_type->getDecl();
5470 uint32_t field_idx = 0;
5471 clang::RecordDecl::field_iterator field, field_end;
5472 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
5473 {
5474 if (idx == field_idx)
5475 {
5476 // Print the member type if requested
5477 // Print the member name and equal sign
5478 name.assign(field->getNameAsString());
5479
5480 // Figure out the type byte size (field_type_info.first) and
5481 // alignment (field_type_info.second) from the AST context.
5482 if (bit_offset_ptr)
5483 {
5484 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5485 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5486 }
5487
5488 const bool is_bitfield = field->isBitField();
5489
5490 if (bitfield_bit_size_ptr)
5491 {
5492 *bitfield_bit_size_ptr = 0;
5493
5494 if (is_bitfield)
5495 {
5496 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5497 llvm::APSInt bitfield_apsint;
5498 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5499 {
5500 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5501 }
5502 }
5503 }
5504 if (is_bitfield_ptr)
5505 *is_bitfield_ptr = is_bitfield;
5506
Greg Claytona1e5dc82015-08-11 22:53:00 +00005507 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005508 }
5509 }
5510 }
5511 break;
5512
5513 case clang::Type::ObjCObjectPointer:
5514 if (GetCompleteType(type))
5515 {
5516 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5517 if (objc_class_type)
5518 {
5519 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005520 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 +00005521 }
5522 }
5523 break;
5524
5525 case clang::Type::ObjCObject:
5526 case clang::Type::ObjCInterface:
5527 if (GetCompleteType(type))
5528 {
5529 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5530 assert (objc_class_type);
5531 if (objc_class_type)
5532 {
5533 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005534 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 +00005535 }
5536 }
5537 break;
5538
5539
5540 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005541 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005542 GetFieldAtIndex (idx,
5543 name,
5544 bit_offset_ptr,
5545 bitfield_bit_size_ptr,
5546 is_bitfield_ptr);
5547
Enrico Granata36f51e42015-12-18 22:41:25 +00005548 case clang::Type::Auto:
5549 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).
5550 GetFieldAtIndex (idx,
5551 name,
5552 bit_offset_ptr,
5553 bitfield_bit_size_ptr,
5554 is_bitfield_ptr);
5555
Greg Claytond8d4a572015-08-11 21:38:15 +00005556 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005557 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005558 GetFieldAtIndex (idx,
5559 name,
5560 bit_offset_ptr,
5561 bitfield_bit_size_ptr,
5562 is_bitfield_ptr);
5563
5564 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005565 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005566 GetFieldAtIndex (idx,
5567 name,
5568 bit_offset_ptr,
5569 bitfield_bit_size_ptr,
5570 is_bitfield_ptr);
5571
5572 default:
5573 break;
5574 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005575 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005576}
5577
Greg Clayton99558cc42015-08-24 23:46:31 +00005578uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005579ClangASTContext::GetNumDirectBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005580{
5581 uint32_t count = 0;
5582 clang::QualType qual_type(GetCanonicalQualType(type));
5583 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5584 switch (type_class)
5585 {
5586 case clang::Type::Record:
5587 if (GetCompleteType(type))
5588 {
5589 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5590 if (cxx_record_decl)
5591 count = cxx_record_decl->getNumBases();
5592 }
5593 break;
5594
5595 case clang::Type::ObjCObjectPointer:
5596 count = GetPointeeType(type).GetNumDirectBaseClasses();
5597 break;
5598
5599 case clang::Type::ObjCObject:
5600 if (GetCompleteType(type))
5601 {
5602 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5603 if (objc_class_type)
5604 {
5605 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5606
5607 if (class_interface_decl && class_interface_decl->getSuperClass())
5608 count = 1;
5609 }
5610 }
5611 break;
5612 case clang::Type::ObjCInterface:
5613 if (GetCompleteType(type))
5614 {
5615 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5616 if (objc_interface_type)
5617 {
5618 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5619
5620 if (class_interface_decl && class_interface_decl->getSuperClass())
5621 count = 1;
5622 }
5623 }
5624 break;
5625
5626
5627 case clang::Type::Typedef:
5628 count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5629 break;
5630
Enrico Granata36f51e42015-12-18 22:41:25 +00005631 case clang::Type::Auto:
5632 count = GetNumDirectBaseClasses(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
5633 break;
5634
Greg Clayton99558cc42015-08-24 23:46:31 +00005635 case clang::Type::Elaborated:
5636 count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5637 break;
5638
5639 case clang::Type::Paren:
5640 return GetNumDirectBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5641
5642 default:
5643 break;
5644 }
5645 return count;
5646
5647}
5648
5649uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005650ClangASTContext::GetNumVirtualBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005651{
5652 uint32_t count = 0;
5653 clang::QualType qual_type(GetCanonicalQualType(type));
5654 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5655 switch (type_class)
5656 {
5657 case clang::Type::Record:
5658 if (GetCompleteType(type))
5659 {
5660 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5661 if (cxx_record_decl)
5662 count = cxx_record_decl->getNumVBases();
5663 }
5664 break;
5665
5666 case clang::Type::Typedef:
5667 count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5668 break;
5669
Enrico Granata36f51e42015-12-18 22:41:25 +00005670 case clang::Type::Auto:
5671 count = GetNumVirtualBaseClasses(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
5672 break;
5673
Greg Clayton99558cc42015-08-24 23:46:31 +00005674 case clang::Type::Elaborated:
5675 count = GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5676 break;
5677
5678 case clang::Type::Paren:
5679 count = GetNumVirtualBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5680 break;
5681
5682 default:
5683 break;
5684 }
5685 return count;
5686
5687}
5688
5689CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005690ClangASTContext::GetDirectBaseClassAtIndex (lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00005691{
5692 clang::QualType qual_type(GetCanonicalQualType(type));
5693 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5694 switch (type_class)
5695 {
5696 case clang::Type::Record:
5697 if (GetCompleteType(type))
5698 {
5699 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5700 if (cxx_record_decl)
5701 {
5702 uint32_t curr_idx = 0;
5703 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5704 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5705 base_class != base_class_end;
5706 ++base_class, ++curr_idx)
5707 {
5708 if (curr_idx == idx)
5709 {
5710 if (bit_offset_ptr)
5711 {
5712 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5713 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5714 if (base_class->isVirtual())
5715 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5716 else
5717 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5718 }
5719 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5720 }
5721 }
5722 }
5723 }
5724 break;
5725
5726 case clang::Type::ObjCObjectPointer:
5727 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
5728
5729 case clang::Type::ObjCObject:
5730 if (idx == 0 && GetCompleteType(type))
5731 {
5732 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5733 if (objc_class_type)
5734 {
5735 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5736
5737 if (class_interface_decl)
5738 {
5739 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5740 if (superclass_interface_decl)
5741 {
5742 if (bit_offset_ptr)
5743 *bit_offset_ptr = 0;
5744 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5745 }
5746 }
5747 }
5748 }
5749 break;
5750 case clang::Type::ObjCInterface:
5751 if (idx == 0 && GetCompleteType(type))
5752 {
5753 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5754 if (objc_interface_type)
5755 {
5756 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5757
5758 if (class_interface_decl)
5759 {
5760 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5761 if (superclass_interface_decl)
5762 {
5763 if (bit_offset_ptr)
5764 *bit_offset_ptr = 0;
5765 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5766 }
5767 }
5768 }
5769 }
5770 break;
5771
5772
5773 case clang::Type::Typedef:
5774 return GetDirectBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5775
Enrico Granata36f51e42015-12-18 22:41:25 +00005776 case clang::Type::Auto:
5777 return GetDirectBaseClassAtIndex (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5778
Greg Clayton99558cc42015-08-24 23:46:31 +00005779 case clang::Type::Elaborated:
5780 return GetDirectBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5781
5782 case clang::Type::Paren:
5783 return GetDirectBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5784
5785 default:
5786 break;
5787 }
5788 return CompilerType();
5789}
5790
5791CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005792ClangASTContext::GetVirtualBaseClassAtIndex (lldb::opaque_compiler_type_t type,
Greg Clayton99558cc42015-08-24 23:46:31 +00005793 size_t idx,
5794 uint32_t *bit_offset_ptr)
5795{
5796 clang::QualType qual_type(GetCanonicalQualType(type));
5797 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5798 switch (type_class)
5799 {
5800 case clang::Type::Record:
5801 if (GetCompleteType(type))
5802 {
5803 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5804 if (cxx_record_decl)
5805 {
5806 uint32_t curr_idx = 0;
5807 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5808 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
5809 base_class != base_class_end;
5810 ++base_class, ++curr_idx)
5811 {
5812 if (curr_idx == idx)
5813 {
5814 if (bit_offset_ptr)
5815 {
5816 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5817 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5818 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5819
5820 }
5821 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5822 }
5823 }
5824 }
5825 }
5826 break;
5827
5828 case clang::Type::Typedef:
5829 return GetVirtualBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
Enrico Granata36f51e42015-12-18 22:41:25 +00005830
5831 case clang::Type::Auto:
5832 return GetVirtualBaseClassAtIndex (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5833
Greg Clayton99558cc42015-08-24 23:46:31 +00005834 case clang::Type::Elaborated:
5835 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5836
5837 case clang::Type::Paren:
5838 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5839
5840 default:
5841 break;
5842 }
5843 return CompilerType();
5844
5845}
5846
Greg Claytond8d4a572015-08-11 21:38:15 +00005847// If a pointer to a pointee type (the clang_type arg) says that it has no
5848// children, then we either need to trust it, or override it and return a
5849// different result. For example, an "int *" has one child that is an integer,
5850// but a function pointer doesn't have any children. Likewise if a Record type
5851// claims it has no children, then there really is nothing to show.
5852uint32_t
5853ClangASTContext::GetNumPointeeChildren (clang::QualType type)
5854{
5855 if (type.isNull())
5856 return 0;
5857
5858 clang::QualType qual_type(type.getCanonicalType());
5859 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5860 switch (type_class)
5861 {
5862 case clang::Type::Builtin:
5863 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5864 {
5865 case clang::BuiltinType::UnknownAny:
5866 case clang::BuiltinType::Void:
5867 case clang::BuiltinType::NullPtr:
5868 case clang::BuiltinType::OCLEvent:
5869 case clang::BuiltinType::OCLImage1d:
5870 case clang::BuiltinType::OCLImage1dArray:
5871 case clang::BuiltinType::OCLImage1dBuffer:
5872 case clang::BuiltinType::OCLImage2d:
5873 case clang::BuiltinType::OCLImage2dArray:
5874 case clang::BuiltinType::OCLImage3d:
5875 case clang::BuiltinType::OCLSampler:
5876 return 0;
5877 case clang::BuiltinType::Bool:
5878 case clang::BuiltinType::Char_U:
5879 case clang::BuiltinType::UChar:
5880 case clang::BuiltinType::WChar_U:
5881 case clang::BuiltinType::Char16:
5882 case clang::BuiltinType::Char32:
5883 case clang::BuiltinType::UShort:
5884 case clang::BuiltinType::UInt:
5885 case clang::BuiltinType::ULong:
5886 case clang::BuiltinType::ULongLong:
5887 case clang::BuiltinType::UInt128:
5888 case clang::BuiltinType::Char_S:
5889 case clang::BuiltinType::SChar:
5890 case clang::BuiltinType::WChar_S:
5891 case clang::BuiltinType::Short:
5892 case clang::BuiltinType::Int:
5893 case clang::BuiltinType::Long:
5894 case clang::BuiltinType::LongLong:
5895 case clang::BuiltinType::Int128:
5896 case clang::BuiltinType::Float:
5897 case clang::BuiltinType::Double:
5898 case clang::BuiltinType::LongDouble:
5899 case clang::BuiltinType::Dependent:
5900 case clang::BuiltinType::Overload:
5901 case clang::BuiltinType::ObjCId:
5902 case clang::BuiltinType::ObjCClass:
5903 case clang::BuiltinType::ObjCSel:
5904 case clang::BuiltinType::BoundMember:
5905 case clang::BuiltinType::Half:
5906 case clang::BuiltinType::ARCUnbridgedCast:
5907 case clang::BuiltinType::PseudoObject:
5908 case clang::BuiltinType::BuiltinFn:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00005909 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00005910 return 1;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005911 default:
5912 return 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00005913 }
5914 break;
5915
5916 case clang::Type::Complex: return 1;
5917 case clang::Type::Pointer: return 1;
5918 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
5919 case clang::Type::LValueReference: return 1;
5920 case clang::Type::RValueReference: return 1;
5921 case clang::Type::MemberPointer: return 0;
5922 case clang::Type::ConstantArray: return 0;
5923 case clang::Type::IncompleteArray: return 0;
5924 case clang::Type::VariableArray: return 0;
5925 case clang::Type::DependentSizedArray: return 0;
5926 case clang::Type::DependentSizedExtVector: return 0;
5927 case clang::Type::Vector: return 0;
5928 case clang::Type::ExtVector: return 0;
5929 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
5930 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
5931 case clang::Type::UnresolvedUsing: return 0;
5932 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
5933 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Enrico Granata36f51e42015-12-18 22:41:25 +00005934 case clang::Type::Auto: return GetNumPointeeChildren (llvm::cast<clang::AutoType>(qual_type)->getDeducedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005935 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
5936 case clang::Type::TypeOfExpr: return 0;
5937 case clang::Type::TypeOf: return 0;
5938 case clang::Type::Decltype: return 0;
5939 case clang::Type::Record: return 0;
5940 case clang::Type::Enum: return 1;
5941 case clang::Type::TemplateTypeParm: return 1;
5942 case clang::Type::SubstTemplateTypeParm: return 1;
5943 case clang::Type::TemplateSpecialization: return 1;
5944 case clang::Type::InjectedClassName: return 0;
5945 case clang::Type::DependentName: return 1;
5946 case clang::Type::DependentTemplateSpecialization: return 1;
5947 case clang::Type::ObjCObject: return 0;
5948 case clang::Type::ObjCInterface: return 0;
5949 case clang::Type::ObjCObjectPointer: return 1;
5950 default:
5951 break;
5952 }
5953 return 0;
5954}
5955
5956
Greg Claytona1e5dc82015-08-11 22:53:00 +00005957CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005958ClangASTContext::GetChildCompilerTypeAtIndex (lldb::opaque_compiler_type_t type,
Bruce Mitchener4ad83342015-09-21 16:48:48 +00005959 ExecutionContext *exe_ctx,
5960 size_t idx,
5961 bool transparent_pointers,
5962 bool omit_empty_base_classes,
5963 bool ignore_array_bounds,
5964 std::string& child_name,
5965 uint32_t &child_byte_size,
5966 int32_t &child_byte_offset,
5967 uint32_t &child_bitfield_bit_size,
5968 uint32_t &child_bitfield_bit_offset,
5969 bool &child_is_base_class,
5970 bool &child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00005971 ValueObject *valobj,
5972 uint64_t &language_flags)
Greg Claytond8d4a572015-08-11 21:38:15 +00005973{
5974 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005975 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005976
5977 clang::QualType parent_qual_type(GetCanonicalQualType(type));
5978 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
5979 child_bitfield_bit_size = 0;
5980 child_bitfield_bit_offset = 0;
5981 child_is_base_class = false;
Enrico Granatadc62ffd2015-11-09 19:27:34 +00005982 language_flags = 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00005983
5984 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
5985 uint32_t bit_offset;
5986 switch (parent_type_class)
5987 {
5988 case clang::Type::Builtin:
5989 if (idx_is_valid)
5990 {
5991 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
5992 {
5993 case clang::BuiltinType::ObjCId:
5994 case clang::BuiltinType::ObjCClass:
5995 child_name = "isa";
5996 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005997 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00005998
5999 default:
6000 break;
6001 }
6002 }
6003 break;
6004
6005 case clang::Type::Record:
6006 if (idx_is_valid && GetCompleteType(type))
6007 {
6008 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
6009 const clang::RecordDecl *record_decl = record_type->getDecl();
6010 assert(record_decl);
6011 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
6012 uint32_t child_idx = 0;
6013
6014 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6015 if (cxx_record_decl)
6016 {
6017 // We might have base classes to print out first
6018 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6019 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6020 base_class != base_class_end;
6021 ++base_class)
6022 {
6023 const clang::CXXRecordDecl *base_class_decl = nullptr;
6024
6025 // Skip empty base classes
6026 if (omit_empty_base_classes)
6027 {
6028 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6029 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
6030 continue;
6031 }
6032
6033 if (idx == child_idx)
6034 {
6035 if (base_class_decl == nullptr)
6036 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6037
6038
6039 if (base_class->isVirtual())
6040 {
6041 bool handled = false;
6042 if (valobj)
6043 {
6044 Error err;
6045 AddressType addr_type = eAddressTypeInvalid;
6046 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
6047
6048 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
6049 {
6050
6051 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
6052 Process *process = exe_ctx.GetProcessPtr();
6053 if (process)
6054 {
6055 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
6056 if (vtable_ctx)
6057 {
6058 if (vtable_ctx->isMicrosoft())
6059 {
6060 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
6061
6062 if (vtable_ptr_addr)
6063 {
6064 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
6065
6066 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
6067 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
6068 {
6069 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
6070 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
6071 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
6072 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
6073 if (base_offset != UINT32_MAX)
6074 {
6075 handled = true;
6076 bit_offset = base_offset * 8;
6077 }
6078 }
6079 }
6080 }
6081 else
6082 {
6083 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
6084 if (vtable_ptr_addr)
6085 {
6086 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
6087 if (vtable_ptr != LLDB_INVALID_ADDRESS)
6088 {
6089 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
6090 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
6091 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
6092 if (base_offset != UINT32_MAX)
6093 {
6094 handled = true;
6095 bit_offset = base_offset * 8;
6096 }
6097 }
6098 }
6099 }
6100 }
6101 }
6102 }
6103
6104 }
6105 if (!handled)
6106 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
6107 }
6108 else
6109 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
6110
6111 // Base classes should be a multiple of 8 bits in size
6112 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006113 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006114 child_name = base_class_clang_type.GetTypeName().AsCString("");
6115 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6116
6117 // Base classes bit sizes should be a multiple of 8 bits in size
6118 assert (base_class_clang_type_bit_size % 8 == 0);
6119 child_byte_size = base_class_clang_type_bit_size / 8;
6120 child_is_base_class = true;
6121 return base_class_clang_type;
6122 }
6123 // We don't increment the child index in the for loop since we might
6124 // be skipping empty base classes
6125 ++child_idx;
6126 }
6127 }
6128 // Make sure index is in range...
6129 uint32_t field_idx = 0;
6130 clang::RecordDecl::field_iterator field, field_end;
6131 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
6132 {
6133 if (idx == child_idx)
6134 {
6135 // Print the member type if requested
6136 // Print the member name and equal sign
6137 child_name.assign(field->getNameAsString().c_str());
6138
6139 // Figure out the type byte size (field_type_info.first) and
6140 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00006141 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006142 assert(field_idx < record_layout.getFieldCount());
6143 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6144
6145 // Figure out the field offset within the current struct/union/class type
6146 bit_offset = record_layout.getFieldOffset (field_idx);
6147 child_byte_offset = bit_offset / 8;
6148 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
6149 child_bitfield_bit_offset = bit_offset % 8;
6150
6151 return field_clang_type;
6152 }
6153 }
6154 }
6155 break;
6156
6157 case clang::Type::ObjCObject:
6158 case clang::Type::ObjCInterface:
6159 if (idx_is_valid && GetCompleteType(type))
6160 {
6161 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
6162 assert (objc_class_type);
6163 if (objc_class_type)
6164 {
6165 uint32_t child_idx = 0;
6166 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6167
6168 if (class_interface_decl)
6169 {
6170
6171 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
6172 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6173 if (superclass_interface_decl)
6174 {
6175 if (omit_empty_base_classes)
6176 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006177 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006178 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
6179 {
6180 if (idx == 0)
6181 {
6182 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
6183
6184
6185 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
6186
6187 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6188
6189 child_byte_size = ivar_type_info.Width / 8;
6190 child_byte_offset = 0;
6191 child_is_base_class = true;
6192
Greg Claytona1e5dc82015-08-11 22:53:00 +00006193 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006194 }
6195
6196 ++child_idx;
6197 }
6198 }
6199 else
6200 ++child_idx;
6201 }
6202
6203 const uint32_t superclass_idx = child_idx;
6204
6205 if (idx < (child_idx + class_interface_decl->ivar_size()))
6206 {
6207 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6208
6209 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
6210 {
6211 if (child_idx == idx)
6212 {
6213 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6214
6215 clang::QualType ivar_qual_type(ivar_decl->getType());
6216
6217 child_name.assign(ivar_decl->getNameAsString().c_str());
6218
6219 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6220
6221 child_byte_size = ivar_type_info.Width / 8;
6222
6223 // Figure out the field offset within the current struct/union/class type
6224 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
6225 // that doesn't account for the space taken up by unbacked properties, or from
6226 // the changing size of base classes that are newer than this class.
6227 // So if we have a process around that we can ask about this object, do so.
6228 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
6229 Process *process = nullptr;
6230 if (exe_ctx)
6231 process = exe_ctx->GetProcessPtr();
6232 if (process)
6233 {
6234 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
6235 if (objc_runtime != nullptr)
6236 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006237 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006238 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
6239 }
6240 }
6241
6242 // Setting this to UINT32_MAX to make sure we don't compute it twice...
6243 bit_offset = UINT32_MAX;
6244
6245 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
6246 {
6247 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6248 child_byte_offset = bit_offset / 8;
6249 }
6250
6251 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
6252 // of a bitfield within its containing object. So regardless of where we get the byte
6253 // offset from, we still need to get the bit offset for bitfields from the layout.
6254
6255 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
6256 {
6257 if (bit_offset == UINT32_MAX)
6258 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6259
6260 child_bitfield_bit_offset = bit_offset % 8;
6261 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006262 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006263 }
6264 ++child_idx;
6265 }
6266 }
6267 }
6268 }
6269 }
6270 break;
6271
6272 case clang::Type::ObjCObjectPointer:
6273 if (idx_is_valid)
6274 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006275 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006276
6277 if (transparent_pointers && pointee_clang_type.IsAggregateType())
6278 {
6279 child_is_deref_of_parent = false;
6280 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006281 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6282 idx,
6283 transparent_pointers,
6284 omit_empty_base_classes,
6285 ignore_array_bounds,
6286 child_name,
6287 child_byte_size,
6288 child_byte_offset,
6289 child_bitfield_bit_size,
6290 child_bitfield_bit_offset,
6291 child_is_base_class,
6292 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006293 valobj,
6294 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006295 }
6296 else
6297 {
6298 child_is_deref_of_parent = true;
6299 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6300 if (parent_name)
6301 {
6302 child_name.assign(1, '*');
6303 child_name += parent_name;
6304 }
6305
6306 // We have a pointer to an simple type
6307 if (idx == 0 && pointee_clang_type.GetCompleteType())
6308 {
6309 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6310 child_byte_offset = 0;
6311 return pointee_clang_type;
6312 }
6313 }
6314 }
6315 break;
6316
6317 case clang::Type::Vector:
6318 case clang::Type::ExtVector:
6319 if (idx_is_valid)
6320 {
6321 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
6322 if (array)
6323 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006324 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006325 if (element_type.GetCompleteType())
6326 {
6327 char element_name[64];
6328 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6329 child_name.assign(element_name);
6330 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6331 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6332 return element_type;
6333 }
6334 }
6335 }
6336 break;
6337
6338 case clang::Type::ConstantArray:
6339 case clang::Type::IncompleteArray:
6340 if (ignore_array_bounds || idx_is_valid)
6341 {
6342 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
6343 if (array)
6344 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006345 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006346 if (element_type.GetCompleteType())
6347 {
6348 char element_name[64];
6349 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6350 child_name.assign(element_name);
6351 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6352 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6353 return element_type;
6354 }
6355 }
6356 }
6357 break;
6358
6359
6360 case clang::Type::Pointer:
6361 if (idx_is_valid)
6362 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006363 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006364
6365 // Don't dereference "void *" pointers
6366 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00006367 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006368
6369 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6370 {
6371 child_is_deref_of_parent = false;
6372 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006373 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6374 idx,
6375 transparent_pointers,
6376 omit_empty_base_classes,
6377 ignore_array_bounds,
6378 child_name,
6379 child_byte_size,
6380 child_byte_offset,
6381 child_bitfield_bit_size,
6382 child_bitfield_bit_offset,
6383 child_is_base_class,
6384 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006385 valobj,
6386 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006387 }
6388 else
6389 {
6390 child_is_deref_of_parent = true;
6391
6392 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6393 if (parent_name)
6394 {
6395 child_name.assign(1, '*');
6396 child_name += parent_name;
6397 }
6398
6399 // We have a pointer to an simple type
6400 if (idx == 0)
6401 {
6402 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6403 child_byte_offset = 0;
6404 return pointee_clang_type;
6405 }
6406 }
6407 }
6408 break;
6409
6410 case clang::Type::LValueReference:
6411 case clang::Type::RValueReference:
6412 if (idx_is_valid)
6413 {
6414 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006415 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006416 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6417 {
6418 child_is_deref_of_parent = false;
6419 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006420 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6421 idx,
6422 transparent_pointers,
6423 omit_empty_base_classes,
6424 ignore_array_bounds,
6425 child_name,
6426 child_byte_size,
6427 child_byte_offset,
6428 child_bitfield_bit_size,
6429 child_bitfield_bit_offset,
6430 child_is_base_class,
6431 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006432 valobj,
6433 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006434 }
6435 else
6436 {
6437 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6438 if (parent_name)
6439 {
6440 child_name.assign(1, '&');
6441 child_name += parent_name;
6442 }
6443
6444 // We have a pointer to an simple type
6445 if (idx == 0)
6446 {
6447 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6448 child_byte_offset = 0;
6449 return pointee_clang_type;
6450 }
6451 }
6452 }
6453 break;
6454
6455 case clang::Type::Typedef:
6456 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006457 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006458 return typedefed_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6459 idx,
6460 transparent_pointers,
6461 omit_empty_base_classes,
6462 ignore_array_bounds,
6463 child_name,
6464 child_byte_size,
6465 child_byte_offset,
6466 child_bitfield_bit_size,
6467 child_bitfield_bit_offset,
6468 child_is_base_class,
6469 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006470 valobj,
6471 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006472 }
6473 break;
6474
Enrico Granata36f51e42015-12-18 22:41:25 +00006475 case clang::Type::Auto:
6476 {
6477 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::AutoType>(parent_qual_type)->getDeducedType());
6478 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6479 idx,
6480 transparent_pointers,
6481 omit_empty_base_classes,
6482 ignore_array_bounds,
6483 child_name,
6484 child_byte_size,
6485 child_byte_offset,
6486 child_bitfield_bit_size,
6487 child_bitfield_bit_offset,
6488 child_is_base_class,
6489 child_is_deref_of_parent,
6490 valobj,
6491 language_flags);
6492 }
6493
Greg Claytond8d4a572015-08-11 21:38:15 +00006494 case clang::Type::Elaborated:
6495 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006496 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006497 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6498 idx,
6499 transparent_pointers,
6500 omit_empty_base_classes,
6501 ignore_array_bounds,
6502 child_name,
6503 child_byte_size,
6504 child_byte_offset,
6505 child_bitfield_bit_size,
6506 child_bitfield_bit_offset,
6507 child_is_base_class,
6508 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006509 valobj,
6510 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006511 }
6512
6513 case clang::Type::Paren:
6514 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006515 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006516 return paren_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6517 idx,
6518 transparent_pointers,
6519 omit_empty_base_classes,
6520 ignore_array_bounds,
6521 child_name,
6522 child_byte_size,
6523 child_byte_offset,
6524 child_bitfield_bit_size,
6525 child_bitfield_bit_offset,
6526 child_is_base_class,
6527 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006528 valobj,
6529 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006530 }
6531
6532
6533 default:
6534 break;
6535 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006536 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006537}
6538
6539static uint32_t
6540GetIndexForRecordBase
6541(
6542 const clang::RecordDecl *record_decl,
6543 const clang::CXXBaseSpecifier *base_spec,
6544 bool omit_empty_base_classes
6545 )
6546{
6547 uint32_t child_idx = 0;
6548
6549 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6550
6551 // const char *super_name = record_decl->getNameAsCString();
6552 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6553 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6554 //
6555 if (cxx_record_decl)
6556 {
6557 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6558 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6559 base_class != base_class_end;
6560 ++base_class)
6561 {
6562 if (omit_empty_base_classes)
6563 {
6564 if (BaseSpecifierIsEmpty (base_class))
6565 continue;
6566 }
6567
6568 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6569 // child_idx,
6570 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6571 //
6572 //
6573 if (base_class == base_spec)
6574 return child_idx;
6575 ++child_idx;
6576 }
6577 }
6578
6579 return UINT32_MAX;
6580}
6581
6582
6583static uint32_t
6584GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6585 clang::NamedDecl *canonical_decl,
6586 bool omit_empty_base_classes)
6587{
6588 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6589 omit_empty_base_classes);
6590
6591 clang::RecordDecl::field_iterator field, field_end;
6592 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6593 field != field_end;
6594 ++field, ++child_idx)
6595 {
6596 if (field->getCanonicalDecl() == canonical_decl)
6597 return child_idx;
6598 }
6599
6600 return UINT32_MAX;
6601}
6602
6603// Look for a child member (doesn't include base classes, but it does include
6604// their members) in the type hierarchy. Returns an index path into "clang_type"
6605// on how to reach the appropriate member.
6606//
6607// class A
6608// {
6609// public:
6610// int m_a;
6611// int m_b;
6612// };
6613//
6614// class B
6615// {
6616// };
6617//
6618// class C :
6619// public B,
6620// public A
6621// {
6622// };
6623//
6624// If we have a clang type that describes "class C", and we wanted to looked
6625// "m_b" in it:
6626//
6627// With omit_empty_base_classes == false we would get an integer array back with:
6628// { 1, 1 }
6629// The first index 1 is the child index for "class A" within class C
6630// The second index 1 is the child index for "m_b" within class A
6631//
6632// With omit_empty_base_classes == true we would get an integer array back with:
6633// { 0, 1 }
6634// 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)
6635// The second index 1 is the child index for "m_b" within class A
6636
6637size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006638ClangASTContext::GetIndexOfChildMemberWithName (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006639 bool omit_empty_base_classes,
6640 std::vector<uint32_t>& child_indexes)
6641{
6642 if (type && name && name[0])
6643 {
6644 clang::QualType qual_type(GetCanonicalQualType(type));
6645 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6646 switch (type_class)
6647 {
6648 case clang::Type::Record:
6649 if (GetCompleteType(type))
6650 {
6651 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6652 const clang::RecordDecl *record_decl = record_type->getDecl();
6653
6654 assert(record_decl);
6655 uint32_t child_idx = 0;
6656
6657 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6658
6659 // Try and find a field that matches NAME
6660 clang::RecordDecl::field_iterator field, field_end;
6661 llvm::StringRef name_sref(name);
6662 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6663 field != field_end;
6664 ++field, ++child_idx)
6665 {
6666 llvm::StringRef field_name = field->getName();
6667 if (field_name.empty())
6668 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006669 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006670 child_indexes.push_back(child_idx);
6671 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
6672 return child_indexes.size();
6673 child_indexes.pop_back();
6674
6675 }
6676 else if (field_name.equals (name_sref))
6677 {
6678 // We have to add on the number of base classes to this index!
6679 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
6680 return child_indexes.size();
6681 }
6682 }
6683
6684 if (cxx_record_decl)
6685 {
6686 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6687
6688 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6689
6690 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6691 // Didn't find things easily, lets let clang do its thang...
6692 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
6693 clang::DeclarationName decl_name(&ident_ref);
6694
6695 clang::CXXBasePaths paths;
6696 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
6697 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
6698 },
6699 paths))
6700 {
6701 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
6702 for (path = paths.begin(); path != path_end; ++path)
6703 {
6704 const size_t num_path_elements = path->size();
6705 for (size_t e=0; e<num_path_elements; ++e)
6706 {
6707 clang::CXXBasePathElement elem = (*path)[e];
6708
6709 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
6710 if (child_idx == UINT32_MAX)
6711 {
6712 child_indexes.clear();
6713 return 0;
6714 }
6715 else
6716 {
6717 child_indexes.push_back (child_idx);
6718 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
6719 }
6720 }
6721 for (clang::NamedDecl *path_decl : path->Decls)
6722 {
6723 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
6724 if (child_idx == UINT32_MAX)
6725 {
6726 child_indexes.clear();
6727 return 0;
6728 }
6729 else
6730 {
6731 child_indexes.push_back (child_idx);
6732 }
6733 }
6734 }
6735 return child_indexes.size();
6736 }
6737 }
6738
6739 }
6740 break;
6741
6742 case clang::Type::ObjCObject:
6743 case clang::Type::ObjCInterface:
6744 if (GetCompleteType(type))
6745 {
6746 llvm::StringRef name_sref(name);
6747 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6748 assert (objc_class_type);
6749 if (objc_class_type)
6750 {
6751 uint32_t child_idx = 0;
6752 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6753
6754 if (class_interface_decl)
6755 {
6756 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6757 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6758
6759 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6760 {
6761 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6762
6763 if (ivar_decl->getName().equals (name_sref))
6764 {
6765 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6766 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6767 ++child_idx;
6768
6769 child_indexes.push_back (child_idx);
6770 return child_indexes.size();
6771 }
6772 }
6773
6774 if (superclass_interface_decl)
6775 {
6776 // The super class index is always zero for ObjC classes,
6777 // so we push it onto the child indexes in case we find
6778 // an ivar in our superclass...
6779 child_indexes.push_back (0);
6780
Greg Claytona1e5dc82015-08-11 22:53:00 +00006781 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006782 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
6783 omit_empty_base_classes,
6784 child_indexes))
6785 {
6786 // We did find an ivar in a superclass so just
6787 // return the results!
6788 return child_indexes.size();
6789 }
6790
6791 // We didn't find an ivar matching "name" in our
6792 // superclass, pop the superclass zero index that
6793 // we pushed on above.
6794 child_indexes.pop_back();
6795 }
6796 }
6797 }
6798 }
6799 break;
6800
6801 case clang::Type::ObjCObjectPointer:
6802 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006803 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006804 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
6805 omit_empty_base_classes,
6806 child_indexes);
6807 }
6808 break;
6809
6810
6811 case clang::Type::ConstantArray:
6812 {
6813 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6814 // const uint64_t element_count = array->getSize().getLimitedValue();
6815 //
6816 // if (idx < element_count)
6817 // {
6818 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6819 //
6820 // char element_name[32];
6821 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6822 //
6823 // child_name.assign(element_name);
6824 // assert(field_type_info.first % 8 == 0);
6825 // child_byte_size = field_type_info.first / 8;
6826 // child_byte_offset = idx * child_byte_size;
6827 // return array->getElementType().getAsOpaquePtr();
6828 // }
6829 }
6830 break;
6831
6832 // case clang::Type::MemberPointerType:
6833 // {
6834 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6835 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6836 //
6837 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6838 // {
6839 // return GetIndexOfChildWithName (ast,
6840 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6841 // name);
6842 // }
6843 // }
6844 // break;
6845 //
6846 case clang::Type::LValueReference:
6847 case clang::Type::RValueReference:
6848 {
6849 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6850 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006851 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006852
6853 if (pointee_clang_type.IsAggregateType ())
6854 {
6855 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6856 omit_empty_base_classes,
6857 child_indexes);
6858 }
6859 }
6860 break;
6861
6862 case clang::Type::Pointer:
6863 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006864 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006865
6866 if (pointee_clang_type.IsAggregateType ())
6867 {
6868 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6869 omit_empty_base_classes,
6870 child_indexes);
6871 }
6872 }
6873 break;
6874
6875 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006876 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00006877 omit_empty_base_classes,
6878 child_indexes);
6879
6880 case clang::Type::Auto:
6881 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetIndexOfChildMemberWithName (name,
6882 omit_empty_base_classes,
6883 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006884
6885 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006886 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00006887 omit_empty_base_classes,
6888 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006889
6890 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006891 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00006892 omit_empty_base_classes,
6893 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006894
6895 default:
6896 break;
6897 }
6898 }
6899 return 0;
6900}
6901
6902
6903// Get the index of the child of "clang_type" whose name matches. This function
6904// doesn't descend into the children, but only looks one level deep and name
6905// matches can include base class names.
6906
6907uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006908ClangASTContext::GetIndexOfChildWithName (lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00006909{
6910 if (type && name && name[0])
6911 {
6912 clang::QualType qual_type(GetCanonicalQualType(type));
6913
6914 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6915
6916 switch (type_class)
6917 {
6918 case clang::Type::Record:
6919 if (GetCompleteType(type))
6920 {
6921 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6922 const clang::RecordDecl *record_decl = record_type->getDecl();
6923
6924 assert(record_decl);
6925 uint32_t child_idx = 0;
6926
6927 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6928
6929 if (cxx_record_decl)
6930 {
6931 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6932 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6933 base_class != base_class_end;
6934 ++base_class)
6935 {
6936 // Skip empty base classes
6937 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6938 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
6939 continue;
6940
Greg Claytona1e5dc82015-08-11 22:53:00 +00006941 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006942 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
6943 if (base_class_type_name.compare (name) == 0)
6944 return child_idx;
6945 ++child_idx;
6946 }
6947 }
6948
6949 // Try and find a field that matches NAME
6950 clang::RecordDecl::field_iterator field, field_end;
6951 llvm::StringRef name_sref(name);
6952 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6953 field != field_end;
6954 ++field, ++child_idx)
6955 {
6956 if (field->getName().equals (name_sref))
6957 return child_idx;
6958 }
6959
6960 }
6961 break;
6962
6963 case clang::Type::ObjCObject:
6964 case clang::Type::ObjCInterface:
6965 if (GetCompleteType(type))
6966 {
6967 llvm::StringRef name_sref(name);
6968 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6969 assert (objc_class_type);
6970 if (objc_class_type)
6971 {
6972 uint32_t child_idx = 0;
6973 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6974
6975 if (class_interface_decl)
6976 {
6977 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6978 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6979
6980 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6981 {
6982 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6983
6984 if (ivar_decl->getName().equals (name_sref))
6985 {
6986 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6987 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6988 ++child_idx;
6989
6990 return child_idx;
6991 }
6992 }
6993
6994 if (superclass_interface_decl)
6995 {
6996 if (superclass_interface_decl->getName().equals (name_sref))
6997 return 0;
6998 }
6999 }
7000 }
7001 }
7002 break;
7003
7004 case clang::Type::ObjCObjectPointer:
7005 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007006 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007007 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7008 }
7009 break;
7010
7011 case clang::Type::ConstantArray:
7012 {
7013 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
7014 // const uint64_t element_count = array->getSize().getLimitedValue();
7015 //
7016 // if (idx < element_count)
7017 // {
7018 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
7019 //
7020 // char element_name[32];
7021 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
7022 //
7023 // child_name.assign(element_name);
7024 // assert(field_type_info.first % 8 == 0);
7025 // child_byte_size = field_type_info.first / 8;
7026 // child_byte_offset = idx * child_byte_size;
7027 // return array->getElementType().getAsOpaquePtr();
7028 // }
7029 }
7030 break;
7031
7032 // case clang::Type::MemberPointerType:
7033 // {
7034 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
7035 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
7036 //
7037 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
7038 // {
7039 // return GetIndexOfChildWithName (ast,
7040 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
7041 // name);
7042 // }
7043 // }
7044 // break;
7045 //
7046 case clang::Type::LValueReference:
7047 case clang::Type::RValueReference:
7048 {
7049 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00007050 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007051
7052 if (pointee_type.IsAggregateType ())
7053 {
7054 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7055 }
7056 }
7057 break;
7058
7059 case clang::Type::Pointer:
7060 {
7061 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00007062 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007063
7064 if (pointee_type.IsAggregateType ())
7065 {
7066 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7067 }
7068 else
7069 {
7070 // if (parent_name)
7071 // {
7072 // child_name.assign(1, '*');
7073 // child_name += parent_name;
7074 // }
7075 //
7076 // // We have a pointer to an simple type
7077 // if (idx == 0)
7078 // {
7079 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
7080 // assert(clang_type_info.first % 8 == 0);
7081 // child_byte_size = clang_type_info.first / 8;
7082 // child_byte_offset = 0;
7083 // return pointee_type.getAsOpaquePtr();
7084 // }
7085 }
7086 }
7087 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00007088
7089 case clang::Type::Auto:
7090 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007091
7092 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007093 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007094
7095 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007096 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007097
7098 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007099 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007100
7101 default:
7102 break;
7103 }
7104 }
7105 return UINT32_MAX;
7106}
7107
7108
7109size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007110ClangASTContext::GetNumTemplateArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007111{
7112 if (!type)
7113 return 0;
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007114
7115 clang::QualType qual_type (GetCanonicalQualType(type));
7116 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7117 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007118 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007119 case clang::Type::Record:
7120 if (GetCompleteType(type))
7121 {
7122 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7123 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007124 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007125 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7126 if (template_decl)
7127 return template_decl->getTemplateArgs().size();
Greg Claytond8d4a572015-08-11 21:38:15 +00007128 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007129 }
7130 break;
7131
7132 case clang::Type::Typedef:
7133 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
Enrico Granata36f51e42015-12-18 22:41:25 +00007134
7135 case clang::Type::Auto:
7136 return (CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType())).GetNumTemplateArguments();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007137
7138 case clang::Type::Elaborated:
7139 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
7140
7141 case clang::Type::Paren:
7142 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
7143
7144 default:
7145 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007146 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007147
Greg Claytond8d4a572015-08-11 21:38:15 +00007148 return 0;
7149}
7150
Greg Claytona1e5dc82015-08-11 22:53:00 +00007151CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007152ClangASTContext::GetTemplateArgument (lldb::opaque_compiler_type_t type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00007153{
7154 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007155 return CompilerType();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007156
7157 clang::QualType qual_type (GetCanonicalQualType(type));
7158 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7159 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007160 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007161 case clang::Type::Record:
7162 if (GetCompleteType(type))
7163 {
7164 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7165 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007166 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007167 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7168 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
Greg Claytond8d4a572015-08-11 21:38:15 +00007169 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007170 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
7171 switch (template_arg.getKind())
Greg Claytond8d4a572015-08-11 21:38:15 +00007172 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007173 case clang::TemplateArgument::Null:
7174 kind = eTemplateArgumentKindNull;
7175 return CompilerType();
7176
7177 case clang::TemplateArgument::Type:
7178 kind = eTemplateArgumentKindType;
7179 return CompilerType(getASTContext(), template_arg.getAsType());
7180
7181 case clang::TemplateArgument::Declaration:
7182 kind = eTemplateArgumentKindDeclaration;
7183 return CompilerType();
7184
7185 case clang::TemplateArgument::Integral:
7186 kind = eTemplateArgumentKindIntegral;
7187 return CompilerType(getASTContext(), template_arg.getIntegralType());
7188
7189 case clang::TemplateArgument::Template:
7190 kind = eTemplateArgumentKindTemplate;
7191 return CompilerType();
7192
7193 case clang::TemplateArgument::TemplateExpansion:
7194 kind = eTemplateArgumentKindTemplateExpansion;
7195 return CompilerType();
7196
7197 case clang::TemplateArgument::Expression:
7198 kind = eTemplateArgumentKindExpression;
7199 return CompilerType();
7200
7201 case clang::TemplateArgument::Pack:
7202 kind = eTemplateArgumentKindPack;
7203 return CompilerType();
7204
7205 default:
7206 assert (!"Unhandled clang::TemplateArgument::ArgKind");
7207 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007208 }
7209 }
7210 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007211 }
7212 break;
7213
7214 case clang::Type::Typedef:
7215 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
Enrico Granata36f51e42015-12-18 22:41:25 +00007216
7217 case clang::Type::Auto:
7218 return (CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType())).GetTemplateArgument(arg_idx, kind);
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007219
7220 case clang::Type::Elaborated:
7221 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
7222
7223 case clang::Type::Paren:
7224 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
7225
7226 default:
7227 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007228 }
7229 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00007230 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00007231}
7232
Enrico Granatac6bf2e22015-09-23 01:39:46 +00007233CompilerType
7234ClangASTContext::GetTypeForFormatters (void* type)
7235{
7236 if (type)
7237 return RemoveFastQualifiers(CompilerType(this, type));
7238 return CompilerType();
7239}
7240
Greg Claytond8d4a572015-08-11 21:38:15 +00007241static bool
7242IsOperator (const char *name, clang::OverloadedOperatorKind &op_kind)
7243{
7244 if (name == nullptr || name[0] == '\0')
7245 return false;
7246
7247#define OPERATOR_PREFIX "operator"
7248#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
7249
7250 const char *post_op_name = nullptr;
7251
7252 bool no_space = true;
7253
7254 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
7255 return false;
7256
7257 post_op_name = name + OPERATOR_PREFIX_LENGTH;
7258
7259 if (post_op_name[0] == ' ')
7260 {
7261 post_op_name++;
7262 no_space = false;
7263 }
7264
7265#undef OPERATOR_PREFIX
7266#undef OPERATOR_PREFIX_LENGTH
7267
7268 // This is an operator, set the overloaded operator kind to invalid
7269 // in case this is a conversion operator...
7270 op_kind = clang::NUM_OVERLOADED_OPERATORS;
7271
7272 switch (post_op_name[0])
7273 {
7274 default:
7275 if (no_space)
7276 return false;
7277 break;
7278 case 'n':
7279 if (no_space)
7280 return false;
7281 if (strcmp (post_op_name, "new") == 0)
7282 op_kind = clang::OO_New;
7283 else if (strcmp (post_op_name, "new[]") == 0)
7284 op_kind = clang::OO_Array_New;
7285 break;
7286
7287 case 'd':
7288 if (no_space)
7289 return false;
7290 if (strcmp (post_op_name, "delete") == 0)
7291 op_kind = clang::OO_Delete;
7292 else if (strcmp (post_op_name, "delete[]") == 0)
7293 op_kind = clang::OO_Array_Delete;
7294 break;
7295
7296 case '+':
7297 if (post_op_name[1] == '\0')
7298 op_kind = clang::OO_Plus;
7299 else if (post_op_name[2] == '\0')
7300 {
7301 if (post_op_name[1] == '=')
7302 op_kind = clang::OO_PlusEqual;
7303 else if (post_op_name[1] == '+')
7304 op_kind = clang::OO_PlusPlus;
7305 }
7306 break;
7307
7308 case '-':
7309 if (post_op_name[1] == '\0')
7310 op_kind = clang::OO_Minus;
7311 else if (post_op_name[2] == '\0')
7312 {
7313 switch (post_op_name[1])
7314 {
7315 case '=': op_kind = clang::OO_MinusEqual; break;
7316 case '-': op_kind = clang::OO_MinusMinus; break;
7317 case '>': op_kind = clang::OO_Arrow; break;
7318 }
7319 }
7320 else if (post_op_name[3] == '\0')
7321 {
7322 if (post_op_name[2] == '*')
7323 op_kind = clang::OO_ArrowStar; break;
7324 }
7325 break;
7326
7327 case '*':
7328 if (post_op_name[1] == '\0')
7329 op_kind = clang::OO_Star;
7330 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7331 op_kind = clang::OO_StarEqual;
7332 break;
7333
7334 case '/':
7335 if (post_op_name[1] == '\0')
7336 op_kind = clang::OO_Slash;
7337 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7338 op_kind = clang::OO_SlashEqual;
7339 break;
7340
7341 case '%':
7342 if (post_op_name[1] == '\0')
7343 op_kind = clang::OO_Percent;
7344 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7345 op_kind = clang::OO_PercentEqual;
7346 break;
7347
7348
7349 case '^':
7350 if (post_op_name[1] == '\0')
7351 op_kind = clang::OO_Caret;
7352 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7353 op_kind = clang::OO_CaretEqual;
7354 break;
7355
7356 case '&':
7357 if (post_op_name[1] == '\0')
7358 op_kind = clang::OO_Amp;
7359 else if (post_op_name[2] == '\0')
7360 {
7361 switch (post_op_name[1])
7362 {
7363 case '=': op_kind = clang::OO_AmpEqual; break;
7364 case '&': op_kind = clang::OO_AmpAmp; break;
7365 }
7366 }
7367 break;
7368
7369 case '|':
7370 if (post_op_name[1] == '\0')
7371 op_kind = clang::OO_Pipe;
7372 else if (post_op_name[2] == '\0')
7373 {
7374 switch (post_op_name[1])
7375 {
7376 case '=': op_kind = clang::OO_PipeEqual; break;
7377 case '|': op_kind = clang::OO_PipePipe; break;
7378 }
7379 }
7380 break;
7381
7382 case '~':
7383 if (post_op_name[1] == '\0')
7384 op_kind = clang::OO_Tilde;
7385 break;
7386
7387 case '!':
7388 if (post_op_name[1] == '\0')
7389 op_kind = clang::OO_Exclaim;
7390 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7391 op_kind = clang::OO_ExclaimEqual;
7392 break;
7393
7394 case '=':
7395 if (post_op_name[1] == '\0')
7396 op_kind = clang::OO_Equal;
7397 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7398 op_kind = clang::OO_EqualEqual;
7399 break;
7400
7401 case '<':
7402 if (post_op_name[1] == '\0')
7403 op_kind = clang::OO_Less;
7404 else if (post_op_name[2] == '\0')
7405 {
7406 switch (post_op_name[1])
7407 {
7408 case '<': op_kind = clang::OO_LessLess; break;
7409 case '=': op_kind = clang::OO_LessEqual; break;
7410 }
7411 }
7412 else if (post_op_name[3] == '\0')
7413 {
7414 if (post_op_name[2] == '=')
7415 op_kind = clang::OO_LessLessEqual;
7416 }
7417 break;
7418
7419 case '>':
7420 if (post_op_name[1] == '\0')
7421 op_kind = clang::OO_Greater;
7422 else if (post_op_name[2] == '\0')
7423 {
7424 switch (post_op_name[1])
7425 {
7426 case '>': op_kind = clang::OO_GreaterGreater; break;
7427 case '=': op_kind = clang::OO_GreaterEqual; break;
7428 }
7429 }
7430 else if (post_op_name[1] == '>' &&
7431 post_op_name[2] == '=' &&
7432 post_op_name[3] == '\0')
7433 {
7434 op_kind = clang::OO_GreaterGreaterEqual;
7435 }
7436 break;
7437
7438 case ',':
7439 if (post_op_name[1] == '\0')
7440 op_kind = clang::OO_Comma;
7441 break;
7442
7443 case '(':
7444 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
7445 op_kind = clang::OO_Call;
7446 break;
7447
7448 case '[':
7449 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
7450 op_kind = clang::OO_Subscript;
7451 break;
7452 }
7453
7454 return true;
7455}
7456
7457clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007458ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007459{
7460 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
7461 if (enutype)
7462 return enutype->getDecl();
7463 return NULL;
7464}
7465
7466clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007467ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007468{
7469 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(GetCanonicalQualType(type));
7470 if (record_type)
7471 return record_type->getDecl();
7472 return nullptr;
7473}
7474
Greg Claytone6b36cd2015-12-08 01:02:08 +00007475clang::TagDecl *
7476ClangASTContext::GetAsTagDecl (const CompilerType& type)
7477{
7478 clang::QualType qual_type = GetCanonicalQualType(type);
7479 if (qual_type.isNull())
7480 return nullptr;
7481 else
7482 return qual_type->getAsTagDecl();
7483}
7484
Greg Claytond8d4a572015-08-11 21:38:15 +00007485clang::CXXRecordDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007486ClangASTContext::GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007487{
7488 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
7489}
7490
7491clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007492ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007493{
7494 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(GetCanonicalQualType(type));
7495 if (objc_class_type)
7496 return objc_class_type->getInterface();
7497 return nullptr;
7498}
7499
7500clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007501ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
7502 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007503 AccessType access,
7504 uint32_t bitfield_bit_size)
7505{
7506 if (!type.IsValid() || !field_clang_type.IsValid())
7507 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007508 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007509 if (!ast)
7510 return nullptr;
7511 clang::ASTContext* clang_ast = ast->getASTContext();
7512
7513 clang::FieldDecl *field = nullptr;
7514
7515 clang::Expr *bit_width = nullptr;
7516 if (bitfield_bit_size != 0)
7517 {
7518 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
7519 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
7520 }
7521
7522 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7523 if (record_decl)
7524 {
7525 field = clang::FieldDecl::Create (*clang_ast,
7526 record_decl,
7527 clang::SourceLocation(),
7528 clang::SourceLocation(),
7529 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7530 GetQualType(field_clang_type), // Field type
7531 nullptr, // TInfo *
7532 bit_width, // BitWidth
7533 false, // Mutable
7534 clang::ICIS_NoInit); // HasInit
7535
7536 if (!name)
7537 {
7538 // Determine whether this field corresponds to an anonymous
7539 // struct or union.
7540 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
7541 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
7542 if (!Rec->getDeclName()) {
7543 Rec->setAnonymousStructOrUnion(true);
7544 field->setImplicit();
7545
7546 }
7547 }
7548 }
7549
7550 if (field)
7551 {
7552 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7553
7554 record_decl->addDecl(field);
7555
7556#ifdef LLDB_CONFIGURATION_DEBUG
7557 VerifyDecl(field);
7558#endif
7559 }
7560 }
7561 else
7562 {
7563 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7564
7565 if (class_interface_decl)
7566 {
7567 const bool is_synthesized = false;
7568
7569 field_clang_type.GetCompleteType();
7570
7571 field = clang::ObjCIvarDecl::Create (*clang_ast,
7572 class_interface_decl,
7573 clang::SourceLocation(),
7574 clang::SourceLocation(),
7575 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7576 GetQualType(field_clang_type), // Field type
7577 nullptr, // TypeSourceInfo *
7578 ConvertAccessTypeToObjCIvarAccessControl (access),
7579 bit_width,
7580 is_synthesized);
7581
7582 if (field)
7583 {
7584 class_interface_decl->addDecl(field);
7585
7586#ifdef LLDB_CONFIGURATION_DEBUG
7587 VerifyDecl(field);
7588#endif
7589 }
7590 }
7591 }
7592 return field;
7593}
7594
7595void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007596ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007597{
Greg Claytonf73034f2015-09-08 18:15:05 +00007598 if (!type)
7599 return;
7600
7601 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007602 if (!ast)
7603 return;
7604
7605 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7606
7607 if (!record_decl)
7608 return;
7609
7610 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7611
7612 IndirectFieldVector indirect_fields;
7613 clang::RecordDecl::field_iterator field_pos;
7614 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7615 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7616 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7617 {
7618 if (field_pos->isAnonymousStructOrUnion())
7619 {
7620 clang::QualType field_qual_type = field_pos->getType();
7621
7622 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7623
7624 if (!field_record_type)
7625 continue;
7626
7627 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7628
7629 if (!field_record_decl)
7630 continue;
7631
7632 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7633 di != de;
7634 ++di)
7635 {
7636 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7637 {
7638 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7639 chain[0] = *field_pos;
7640 chain[1] = nested_field_decl;
7641 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7642 record_decl,
7643 clang::SourceLocation(),
7644 nested_field_decl->getIdentifier(),
7645 nested_field_decl->getType(),
7646 chain,
7647 2);
7648
7649 indirect_field->setImplicit();
7650
7651 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7652 nested_field_decl->getAccess()));
7653
7654 indirect_fields.push_back(indirect_field);
7655 }
7656 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7657 {
7658 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
7659 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7660 chain[0] = *field_pos;
7661
7662 int chain_index = 1;
7663 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7664 nce = nested_indirect_field_decl->chain_end();
7665 nci < nce;
7666 ++nci)
7667 {
7668 chain[chain_index] = *nci;
7669 chain_index++;
7670 }
7671
7672 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7673 record_decl,
7674 clang::SourceLocation(),
7675 nested_indirect_field_decl->getIdentifier(),
7676 nested_indirect_field_decl->getType(),
7677 chain,
7678 nested_chain_size + 1);
7679
7680 indirect_field->setImplicit();
7681
7682 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7683 nested_indirect_field_decl->getAccess()));
7684
7685 indirect_fields.push_back(indirect_field);
7686 }
7687 }
7688 }
7689 }
7690
7691 // Check the last field to see if it has an incomplete array type as its
7692 // last member and if it does, the tell the record decl about it
7693 if (last_field_pos != field_end_pos)
7694 {
7695 if (last_field_pos->getType()->isIncompleteArrayType())
7696 record_decl->hasFlexibleArrayMember();
7697 }
7698
7699 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7700 ifi < ife;
7701 ++ifi)
7702 {
7703 record_decl->addDecl(*ifi);
7704 }
7705}
7706
7707void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007708ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007709{
Greg Claytonf73034f2015-09-08 18:15:05 +00007710 if (type)
7711 {
7712 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7713 if (ast)
7714 {
7715 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007716
Greg Claytonf73034f2015-09-08 18:15:05 +00007717 if (!record_decl)
7718 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00007719
Greg Claytonf73034f2015-09-08 18:15:05 +00007720 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*ast->getASTContext()));
7721 }
7722 }
Greg Claytond8d4a572015-08-11 21:38:15 +00007723}
7724
7725clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007726ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7727 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007728 AccessType access)
7729{
7730 clang::VarDecl *var_decl = nullptr;
7731
7732 if (!type.IsValid() || !var_type.IsValid())
7733 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007734 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007735 if (!ast)
7736 return nullptr;
7737
7738 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7739 if (record_decl)
7740 {
7741 var_decl = clang::VarDecl::Create (*ast->getASTContext(), // ASTContext &
7742 record_decl, // DeclContext *
7743 clang::SourceLocation(), // clang::SourceLocation StartLoc
7744 clang::SourceLocation(), // clang::SourceLocation IdLoc
7745 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7746 GetQualType(var_type), // Variable clang::QualType
7747 nullptr, // TypeSourceInfo *
7748 clang::SC_Static); // StorageClass
7749 if (var_decl)
7750 {
7751 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7752 record_decl->addDecl(var_decl);
7753
7754#ifdef LLDB_CONFIGURATION_DEBUG
7755 VerifyDecl(var_decl);
7756#endif
7757 }
7758 }
7759 return var_decl;
7760}
7761
7762
7763clang::CXXMethodDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007764ClangASTContext::AddMethodToCXXRecordType (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007765 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007766 lldb::AccessType access,
7767 bool is_virtual,
7768 bool is_static,
7769 bool is_inline,
7770 bool is_explicit,
7771 bool is_attr_used,
7772 bool is_artificial)
7773{
7774 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7775 return nullptr;
7776
7777 clang::QualType record_qual_type(GetCanonicalQualType(type));
7778
7779 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7780
7781 if (cxx_record_decl == nullptr)
7782 return nullptr;
7783
7784 clang::QualType method_qual_type (GetQualType(method_clang_type));
7785
7786 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7787
7788 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7789
7790 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7791
7792 if (function_type == nullptr)
7793 return nullptr;
7794
7795 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7796
7797 if (!method_function_prototype)
7798 return nullptr;
7799
7800 unsigned int num_params = method_function_prototype->getNumParams();
7801
7802 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7803 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7804
7805 if (is_artificial)
7806 return nullptr; // skip everything artificial
7807
7808 if (name[0] == '~')
7809 {
7810 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7811 cxx_record_decl,
7812 clang::SourceLocation(),
7813 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7814 method_qual_type,
7815 nullptr,
7816 is_inline,
7817 is_artificial);
7818 cxx_method_decl = cxx_dtor_decl;
7819 }
7820 else if (decl_name == cxx_record_decl->getDeclName())
7821 {
7822 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
7823 cxx_record_decl,
7824 clang::SourceLocation(),
7825 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7826 method_qual_type,
7827 nullptr, // TypeSourceInfo *
7828 is_explicit,
7829 is_inline,
7830 is_artificial,
7831 false /*is_constexpr*/);
7832 cxx_method_decl = cxx_ctor_decl;
7833 }
7834 else
7835 {
7836 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7837 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7838
7839 if (IsOperator (name, op_kind))
7840 {
7841 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
7842 {
7843 // Check the number of operator parameters. Sometimes we have
7844 // seen bad DWARF that doesn't correctly describe operators and
7845 // if we try to create a method and add it to the class, clang
7846 // will assert and crash, so we need to make sure things are
7847 // acceptable.
7848 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
7849 return nullptr;
7850 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7851 cxx_record_decl,
7852 clang::SourceLocation(),
7853 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
7854 method_qual_type,
7855 nullptr, // TypeSourceInfo *
7856 SC,
7857 is_inline,
7858 false /*is_constexpr*/,
7859 clang::SourceLocation());
7860 }
7861 else if (num_params == 0)
7862 {
7863 // Conversion operators don't take params...
7864 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
7865 cxx_record_decl,
7866 clang::SourceLocation(),
7867 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
7868 method_qual_type,
7869 nullptr, // TypeSourceInfo *
7870 is_inline,
7871 is_explicit,
7872 false /*is_constexpr*/,
7873 clang::SourceLocation());
7874 }
7875 }
7876
7877 if (cxx_method_decl == nullptr)
7878 {
7879 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7880 cxx_record_decl,
7881 clang::SourceLocation(),
7882 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
7883 method_qual_type,
7884 nullptr, // TypeSourceInfo *
7885 SC,
7886 is_inline,
7887 false /*is_constexpr*/,
7888 clang::SourceLocation());
7889 }
7890 }
7891
7892 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
7893
7894 cxx_method_decl->setAccess (access_specifier);
7895 cxx_method_decl->setVirtualAsWritten (is_virtual);
7896
7897 if (is_attr_used)
7898 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
7899
7900 // Populate the method decl with parameter decls
7901
7902 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7903
7904 for (unsigned param_index = 0;
7905 param_index < num_params;
7906 ++param_index)
7907 {
7908 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
7909 cxx_method_decl,
7910 clang::SourceLocation(),
7911 clang::SourceLocation(),
7912 nullptr, // anonymous
7913 method_function_prototype->getParamType(param_index),
7914 nullptr,
7915 clang::SC_None,
7916 nullptr));
7917 }
7918
7919 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
7920
7921 cxx_record_decl->addDecl (cxx_method_decl);
7922
7923 // Sometimes the debug info will mention a constructor (default/copy/move),
7924 // destructor, or assignment operator (copy/move) but there won't be any
7925 // version of this in the code. So we check if the function was artificially
7926 // generated and if it is trivial and this lets the compiler/backend know
7927 // that it can inline the IR for these when it needs to and we can avoid a
7928 // "missing function" error when running expressions.
7929
7930 if (is_artificial)
7931 {
7932 if (cxx_ctor_decl &&
7933 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
7934 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
7935 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
7936 {
7937 cxx_ctor_decl->setDefaulted();
7938 cxx_ctor_decl->setTrivial(true);
7939 }
7940 else if (cxx_dtor_decl)
7941 {
7942 if (cxx_record_decl->hasTrivialDestructor())
7943 {
7944 cxx_dtor_decl->setDefaulted();
7945 cxx_dtor_decl->setTrivial(true);
7946 }
7947 }
7948 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
7949 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
7950 {
7951 cxx_method_decl->setDefaulted();
7952 cxx_method_decl->setTrivial(true);
7953 }
7954 }
7955
7956#ifdef LLDB_CONFIGURATION_DEBUG
7957 VerifyDecl(cxx_method_decl);
7958#endif
7959
7960 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
7961 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
7962 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
7963 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
7964 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
7965 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
7966 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
7967 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
7968 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
7969 return cxx_method_decl;
7970}
7971
7972
7973#pragma mark C++ Base Classes
7974
7975clang::CXXBaseSpecifier *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007976ClangASTContext::CreateBaseClassSpecifier (lldb::opaque_compiler_type_t type, AccessType access, bool is_virtual, bool base_of_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007977{
7978 if (type)
7979 return new clang::CXXBaseSpecifier (clang::SourceRange(),
7980 is_virtual,
7981 base_of_class,
7982 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
7983 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
7984 clang::SourceLocation());
7985 return nullptr;
7986}
7987
7988void
7989ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
7990{
7991 for (unsigned i=0; i<num_base_classes; ++i)
7992 {
7993 delete base_classes[i];
7994 base_classes[i] = nullptr;
7995 }
7996}
7997
7998bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007999ClangASTContext::SetBaseClassesForClassType (lldb::opaque_compiler_type_t type, clang::CXXBaseSpecifier const * const *base_classes,
Greg Claytond8d4a572015-08-11 21:38:15 +00008000 unsigned num_base_classes)
8001{
8002 if (type)
8003 {
8004 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
8005 if (cxx_record_decl)
8006 {
8007 cxx_record_decl->setBases(base_classes, num_base_classes);
8008 return true;
8009 }
8010 }
8011 return false;
8012}
8013
8014bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008015ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008016{
Greg Claytonf73034f2015-09-08 18:15:05 +00008017 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008018 if (!ast)
8019 return false;
8020 clang::ASTContext* clang_ast = ast->getASTContext();
8021
8022 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
8023 {
8024 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8025 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
8026 if (class_interface_decl && super_interface_decl)
8027 {
8028 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
8029 return true;
8030 }
8031 }
8032 return false;
8033}
8034
8035bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008036ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008037 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00008038 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008039 clang::ObjCIvarDecl *ivar_decl,
8040 const char *property_setter_name,
8041 const char *property_getter_name,
8042 uint32_t property_attributes,
8043 ClangASTMetadata *metadata)
8044{
8045 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
8046 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00008047 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008048 if (!ast)
8049 return false;
8050 clang::ASTContext* clang_ast = ast->getASTContext();
8051
8052 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8053
8054 if (class_interface_decl)
8055 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008056 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00008057
8058 if (property_clang_type.IsValid())
8059 property_clang_type_to_access = property_clang_type;
8060 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008061 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008062
8063 if (class_interface_decl && property_clang_type_to_access.IsValid())
8064 {
8065 clang::TypeSourceInfo *prop_type_source;
8066 if (ivar_decl)
8067 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
8068 else
8069 prop_type_source = clang_ast->getTrivialTypeSourceInfo (GetQualType(property_clang_type));
8070
8071 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create (*clang_ast,
8072 class_interface_decl,
8073 clang::SourceLocation(), // Source Location
8074 &clang_ast->Idents.get(property_name),
8075 clang::SourceLocation(), //Source Location for AT
8076 clang::SourceLocation(), //Source location for (
8077 ivar_decl ? ivar_decl->getType() : ClangASTContext::GetQualType(property_clang_type),
8078 prop_type_source);
8079
8080 if (property_decl)
8081 {
8082 if (metadata)
8083 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
8084
8085 class_interface_decl->addDecl (property_decl);
8086
8087 clang::Selector setter_sel, getter_sel;
8088
8089 if (property_setter_name != nullptr)
8090 {
8091 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
8092 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
8093 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
8094 }
8095 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
8096 {
8097 std::string setter_sel_string("set");
8098 setter_sel_string.push_back(::toupper(property_name[0]));
8099 setter_sel_string.append(&property_name[1]);
8100 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
8101 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
8102 }
8103 property_decl->setSetterName(setter_sel);
8104 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
8105
8106 if (property_getter_name != nullptr)
8107 {
8108 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
8109 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
8110 }
8111 else
8112 {
8113 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
8114 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
8115 }
8116 property_decl->setGetterName(getter_sel);
8117 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
8118
8119 if (ivar_decl)
8120 property_decl->setPropertyIvarDecl (ivar_decl);
8121
8122 if (property_attributes & DW_APPLE_PROPERTY_readonly)
8123 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
8124 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
8125 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
8126 if (property_attributes & DW_APPLE_PROPERTY_assign)
8127 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
8128 if (property_attributes & DW_APPLE_PROPERTY_retain)
8129 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
8130 if (property_attributes & DW_APPLE_PROPERTY_copy)
8131 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
8132 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
8133 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
8134
8135 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
8136 {
8137 const bool isInstance = true;
8138 const bool isVariadic = false;
8139 const bool isSynthesized = false;
8140 const bool isImplicitlyDeclared = true;
8141 const bool isDefined = false;
8142 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8143 const bool HasRelatedResultType = false;
8144
8145 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create (*clang_ast,
8146 clang::SourceLocation(),
8147 clang::SourceLocation(),
8148 getter_sel,
8149 GetQualType(property_clang_type_to_access),
8150 nullptr,
8151 class_interface_decl,
8152 isInstance,
8153 isVariadic,
8154 isSynthesized,
8155 isImplicitlyDeclared,
8156 isDefined,
8157 impControl,
8158 HasRelatedResultType);
8159
8160 if (getter && metadata)
8161 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
8162
8163 if (getter)
8164 {
8165 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
8166
8167 class_interface_decl->addDecl(getter);
8168 }
8169 }
8170
8171 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
8172 {
8173 clang::QualType result_type = clang_ast->VoidTy;
8174
8175 const bool isInstance = true;
8176 const bool isVariadic = false;
8177 const bool isSynthesized = false;
8178 const bool isImplicitlyDeclared = true;
8179 const bool isDefined = false;
8180 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8181 const bool HasRelatedResultType = false;
8182
8183 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
8184 clang::SourceLocation(),
8185 clang::SourceLocation(),
8186 setter_sel,
8187 result_type,
8188 nullptr,
8189 class_interface_decl,
8190 isInstance,
8191 isVariadic,
8192 isSynthesized,
8193 isImplicitlyDeclared,
8194 isDefined,
8195 impControl,
8196 HasRelatedResultType);
8197
8198 if (setter && metadata)
8199 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
8200
8201 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
8202
8203 params.push_back (clang::ParmVarDecl::Create (*clang_ast,
8204 setter,
8205 clang::SourceLocation(),
8206 clang::SourceLocation(),
8207 nullptr, // anonymous
8208 GetQualType(property_clang_type_to_access),
8209 nullptr,
8210 clang::SC_Auto,
8211 nullptr));
8212
8213 if (setter)
8214 {
8215 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8216
8217 class_interface_decl->addDecl(setter);
8218 }
8219 }
8220
8221 return true;
8222 }
8223 }
8224 }
8225 return false;
8226}
8227
8228bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008229ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00008230{
8231 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8232 if (class_interface_decl)
8233 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
8234 return false;
8235}
8236
8237
8238clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00008239ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008240 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 +00008241 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008242 lldb::AccessType access,
8243 bool is_artificial)
8244{
8245 if (!type || !method_clang_type.IsValid())
8246 return nullptr;
8247
8248 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
8249
8250 if (class_interface_decl == nullptr)
8251 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00008252 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8253 if (lldb_ast == nullptr)
8254 return nullptr;
8255 clang::ASTContext *ast = lldb_ast->getASTContext();
8256
Greg Claytond8d4a572015-08-11 21:38:15 +00008257 const char *selector_start = ::strchr (name, ' ');
8258 if (selector_start == nullptr)
8259 return nullptr;
8260
8261 selector_start++;
8262 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
8263
8264 size_t len = 0;
8265 const char *start;
8266 //printf ("name = '%s'\n", name);
8267
8268 unsigned num_selectors_with_args = 0;
8269 for (start = selector_start;
8270 start && *start != '\0' && *start != ']';
8271 start += len)
8272 {
8273 len = ::strcspn(start, ":]");
8274 bool has_arg = (start[len] == ':');
8275 if (has_arg)
8276 ++num_selectors_with_args;
8277 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
8278 if (has_arg)
8279 len += 1;
8280 }
8281
8282
8283 if (selector_idents.size() == 0)
8284 return nullptr;
8285
8286 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
8287 selector_idents.data());
8288
8289 clang::QualType method_qual_type (GetQualType(method_clang_type));
8290
8291 // Populate the method decl with parameter decls
8292 const clang::Type *method_type(method_qual_type.getTypePtr());
8293
8294 if (method_type == nullptr)
8295 return nullptr;
8296
8297 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
8298
8299 if (!method_function_prototype)
8300 return nullptr;
8301
8302
8303 bool is_variadic = false;
8304 bool is_synthesized = false;
8305 bool is_defined = false;
8306 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
8307
8308 const unsigned num_args = method_function_prototype->getNumParams();
8309
8310 if (num_args != num_selectors_with_args)
8311 return nullptr; // some debug information is corrupt. We are not going to deal with it.
8312
8313 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create (*ast,
8314 clang::SourceLocation(), // beginLoc,
8315 clang::SourceLocation(), // endLoc,
8316 method_selector,
8317 method_function_prototype->getReturnType(),
8318 nullptr, // TypeSourceInfo *ResultTInfo,
8319 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(GetQualType(type)),
8320 name[0] == '-',
8321 is_variadic,
8322 is_synthesized,
8323 true, // is_implicitly_declared; we force this to true because we don't have source locations
8324 is_defined,
8325 imp_control,
8326 false /*has_related_result_type*/);
8327
8328
8329 if (objc_method_decl == nullptr)
8330 return nullptr;
8331
8332 if (num_args > 0)
8333 {
8334 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
8335
8336 for (unsigned param_index = 0; param_index < num_args; ++param_index)
8337 {
8338 params.push_back (clang::ParmVarDecl::Create (*ast,
8339 objc_method_decl,
8340 clang::SourceLocation(),
8341 clang::SourceLocation(),
8342 nullptr, // anonymous
8343 method_function_prototype->getParamType(param_index),
8344 nullptr,
8345 clang::SC_Auto,
8346 nullptr));
8347 }
8348
8349 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8350 }
8351
8352 class_interface_decl->addDecl (objc_method_decl);
8353
8354#ifdef LLDB_CONFIGURATION_DEBUG
8355 VerifyDecl(objc_method_decl);
8356#endif
8357
8358 return objc_method_decl;
8359}
8360
8361bool
Greg Claytone6b36cd2015-12-08 01:02:08 +00008362ClangASTContext::GetHasExternalStorage (const CompilerType &type)
8363{
8364 if (IsClangType(type))
8365 return false;
8366
8367 clang::QualType qual_type (GetCanonicalQualType(type));
8368
8369 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8370 switch (type_class)
8371 {
8372 case clang::Type::Record:
8373 {
8374 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8375 if (cxx_record_decl)
8376 return cxx_record_decl->hasExternalLexicalStorage () || cxx_record_decl->hasExternalVisibleStorage();
8377 }
8378 break;
8379
8380 case clang::Type::Enum:
8381 {
8382 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8383 if (enum_decl)
8384 return enum_decl->hasExternalLexicalStorage () || enum_decl->hasExternalVisibleStorage();
8385 }
8386 break;
8387
8388 case clang::Type::ObjCObject:
8389 case clang::Type::ObjCInterface:
8390 {
8391 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8392 assert (objc_class_type);
8393 if (objc_class_type)
8394 {
8395 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8396
8397 if (class_interface_decl)
8398 return class_interface_decl->hasExternalLexicalStorage () || class_interface_decl->hasExternalVisibleStorage ();
8399 }
8400 }
8401 break;
8402
8403 case clang::Type::Typedef:
8404 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()));
8405
Enrico Granata36f51e42015-12-18 22:41:25 +00008406 case clang::Type::Auto:
8407 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()));
8408
Greg Claytone6b36cd2015-12-08 01:02:08 +00008409 case clang::Type::Elaborated:
8410 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
8411
8412 case clang::Type::Paren:
8413 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
8414
8415 default:
8416 break;
8417 }
8418 return false;
8419}
8420
8421
8422bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008423ClangASTContext::SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool has_extern)
Greg Claytond8d4a572015-08-11 21:38:15 +00008424{
8425 if (!type)
8426 return false;
8427
8428 clang::QualType qual_type (GetCanonicalQualType(type));
8429
8430 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8431 switch (type_class)
8432 {
8433 case clang::Type::Record:
8434 {
8435 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8436 if (cxx_record_decl)
8437 {
8438 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
8439 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
8440 return true;
8441 }
8442 }
8443 break;
8444
8445 case clang::Type::Enum:
8446 {
8447 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8448 if (enum_decl)
8449 {
8450 enum_decl->setHasExternalLexicalStorage (has_extern);
8451 enum_decl->setHasExternalVisibleStorage (has_extern);
8452 return true;
8453 }
8454 }
8455 break;
8456
8457 case clang::Type::ObjCObject:
8458 case clang::Type::ObjCInterface:
8459 {
8460 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8461 assert (objc_class_type);
8462 if (objc_class_type)
8463 {
8464 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8465
8466 if (class_interface_decl)
8467 {
8468 class_interface_decl->setHasExternalLexicalStorage (has_extern);
8469 class_interface_decl->setHasExternalVisibleStorage (has_extern);
8470 return true;
8471 }
8472 }
8473 }
8474 break;
8475
8476 case clang::Type::Typedef:
8477 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Enrico Granata36f51e42015-12-18 22:41:25 +00008478
8479 case clang::Type::Auto:
8480 return SetHasExternalStorage (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), has_extern);
Greg Claytond8d4a572015-08-11 21:38:15 +00008481
8482 case clang::Type::Elaborated:
8483 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
8484
8485 case clang::Type::Paren:
8486 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
8487
8488 default:
8489 break;
8490 }
8491 return false;
8492}
8493
8494
Greg Claytone6b36cd2015-12-08 01:02:08 +00008495bool
8496ClangASTContext::CanImport (const CompilerType &type, lldb_private::ClangASTImporter &importer)
8497{
8498 if (IsClangType(type))
8499 {
8500 // TODO: remove external completion BOOL
8501 // CompleteAndFetchChildren should get the Decl out and check for the
8502
8503 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
8504
8505 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8506 switch (type_class)
8507 {
8508 case clang::Type::Record:
8509 {
8510 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8511 if (cxx_record_decl)
8512 {
8513 if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL))
8514 return true;
8515 }
8516 }
8517 break;
8518
8519 case clang::Type::Enum:
8520 {
8521 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8522 if (enum_decl)
8523 {
8524 if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL))
8525 return true;
8526 }
8527 }
8528 break;
8529
8530 case clang::Type::ObjCObject:
8531 case clang::Type::ObjCInterface:
8532 {
8533 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
8534 if (objc_class_type)
8535 {
8536 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8537 // We currently can't complete objective C types through the newly added ASTContext
8538 // because it only supports TagDecl objects right now...
8539 if (class_interface_decl)
8540 {
8541 if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL))
8542 return true;
8543 }
8544 }
8545 }
8546 break;
8547
8548
8549 case clang::Type::Typedef:
8550 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer);
8551
Enrico Granata36f51e42015-12-18 22:41:25 +00008552 case clang::Type::Auto:
8553 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()), importer);
8554
Greg Claytone6b36cd2015-12-08 01:02:08 +00008555 case clang::Type::Elaborated:
8556 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer);
8557
8558 case clang::Type::Paren:
8559 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer);
8560
8561 default:
8562 break;
8563 }
8564 }
8565 return false;
8566}
8567bool
8568ClangASTContext::Import (const CompilerType &type, lldb_private::ClangASTImporter &importer)
8569{
8570 if (IsClangType(type))
8571 {
8572 // TODO: remove external completion BOOL
8573 // CompleteAndFetchChildren should get the Decl out and check for the
8574
8575 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
8576
8577 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8578 switch (type_class)
8579 {
8580 case clang::Type::Record:
8581 {
8582 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8583 if (cxx_record_decl)
8584 {
8585 if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL))
8586 return importer.CompleteAndFetchChildren(qual_type);
8587 }
8588 }
8589 break;
8590
8591 case clang::Type::Enum:
8592 {
8593 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8594 if (enum_decl)
8595 {
8596 if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL))
8597 return importer.CompleteAndFetchChildren(qual_type);
8598 }
8599 }
8600 break;
8601
8602 case clang::Type::ObjCObject:
8603 case clang::Type::ObjCInterface:
8604 {
8605 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
8606 if (objc_class_type)
8607 {
8608 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8609 // We currently can't complete objective C types through the newly added ASTContext
8610 // because it only supports TagDecl objects right now...
8611 if (class_interface_decl)
8612 {
8613 if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL))
8614 return importer.CompleteAndFetchChildren(qual_type);
8615 }
8616 }
8617 }
8618 break;
8619
8620
8621 case clang::Type::Typedef:
8622 return Import (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer);
8623
Enrico Granata36f51e42015-12-18 22:41:25 +00008624 case clang::Type::Auto:
8625 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()), importer);
8626
Greg Claytone6b36cd2015-12-08 01:02:08 +00008627 case clang::Type::Elaborated:
8628 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer);
8629
8630 case clang::Type::Paren:
8631 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer);
8632
8633 default:
8634 break;
8635 }
8636 }
8637 return false;
8638}
8639
8640
Greg Claytond8d4a572015-08-11 21:38:15 +00008641#pragma mark TagDecl
8642
8643bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008644ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008645{
Greg Claytone6b36cd2015-12-08 01:02:08 +00008646 clang::QualType qual_type (ClangASTContext::GetQualType(type));
8647 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008648 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008649 const clang::TagType *tag_type = qual_type->getAs<clang::TagType>();
8650 if (tag_type)
Greg Clayton5dfc4a42015-12-02 00:43:32 +00008651 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008652 clang::TagDecl *tag_decl = tag_type->getDecl();
8653 if (tag_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00008654 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008655 tag_decl->startDefinition();
8656 return true;
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008657 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00008658 }
8659
8660 const clang::ObjCObjectType *object_type = qual_type->getAs<clang::ObjCObjectType>();
8661 if (object_type)
8662 {
8663 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
8664 if (interface_decl)
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008665 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008666 interface_decl->startDefinition();
8667 return true;
Greg Claytond8d4a572015-08-11 21:38:15 +00008668 }
8669 }
8670 }
8671 return false;
8672}
8673
8674bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008675ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008676{
Greg Claytone6b36cd2015-12-08 01:02:08 +00008677 clang::QualType qual_type (ClangASTContext::GetQualType(type));
8678 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008679 {
Greg Claytond8d4a572015-08-11 21:38:15 +00008680 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8681
8682 if (cxx_record_decl)
8683 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008684 if (!cxx_record_decl->isCompleteDefinition())
8685 cxx_record_decl->completeDefinition();
8686 cxx_record_decl->setHasLoadedFieldsFromExternalStorage(true);
8687 cxx_record_decl->setHasExternalLexicalStorage (false);
8688 cxx_record_decl->setHasExternalVisibleStorage (false);
Greg Claytond8d4a572015-08-11 21:38:15 +00008689 return true;
8690 }
8691
Greg Claytone6b36cd2015-12-08 01:02:08 +00008692 const clang::EnumType *enutype = qual_type->getAs<clang::EnumType>();
Greg Claytond8d4a572015-08-11 21:38:15 +00008693
8694 if (enutype)
8695 {
8696 clang::EnumDecl *enum_decl = enutype->getDecl();
8697
8698 if (enum_decl)
8699 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008700 if (!enum_decl->isCompleteDefinition())
Greg Claytond8d4a572015-08-11 21:38:15 +00008701 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008702 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8703 if (lldb_ast == nullptr)
8704 return false;
8705 clang::ASTContext *ast = lldb_ast->getASTContext();
8706
8707 /// TODO This really needs to be fixed.
8708
8709 unsigned NumPositiveBits = 1;
8710 unsigned NumNegativeBits = 0;
8711
8712 clang::QualType promotion_qual_type;
8713 // If the enum integer type is less than an integer in bit width,
8714 // then we must promote it to an integer size.
8715 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
8716 {
8717 if (enum_decl->getIntegerType()->isSignedIntegerType())
8718 promotion_qual_type = ast->IntTy;
8719 else
8720 promotion_qual_type = ast->UnsignedIntTy;
8721 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008722 else
Greg Claytone6b36cd2015-12-08 01:02:08 +00008723 promotion_qual_type = enum_decl->getIntegerType();
8724
8725 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Claytond8d4a572015-08-11 21:38:15 +00008726 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008727 return true;
8728 }
8729 }
8730 }
8731 return false;
8732}
8733
Greg Claytond8d4a572015-08-11 21:38:15 +00008734bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008735ClangASTContext::AddEnumerationValueToEnumerationType (lldb::opaque_compiler_type_t type,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008736 const CompilerType &enumerator_clang_type,
8737 const Declaration &decl,
8738 const char *name,
8739 int64_t enum_value,
8740 uint32_t enum_value_bit_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008741{
8742 if (type && enumerator_clang_type.IsValid() && name && name[0])
8743 {
8744 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8745
8746 bool is_signed = false;
8747 enumerator_clang_type.IsIntegerType (is_signed);
8748 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8749 if (clang_type)
8750 {
8751 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8752
8753 if (enutype)
8754 {
8755 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
8756 enum_llvm_apsint = enum_value;
8757 clang::EnumConstantDecl *enumerator_decl =
8758 clang::EnumConstantDecl::Create (*getASTContext(),
8759 enutype->getDecl(),
8760 clang::SourceLocation(),
8761 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
8762 GetQualType(enumerator_clang_type),
8763 nullptr,
8764 enum_llvm_apsint);
8765
8766 if (enumerator_decl)
8767 {
8768 enutype->getDecl()->addDecl(enumerator_decl);
8769
8770#ifdef LLDB_CONFIGURATION_DEBUG
8771 VerifyDecl(enumerator_decl);
8772#endif
8773
8774 return true;
8775 }
8776 }
8777 }
8778 }
8779 return false;
8780}
8781
Greg Claytona1e5dc82015-08-11 22:53:00 +00008782CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008783ClangASTContext::GetEnumerationIntegerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008784{
8785 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8786 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8787 if (clang_type)
8788 {
8789 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8790 if (enutype)
8791 {
8792 clang::EnumDecl *enum_decl = enutype->getDecl();
8793 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008794 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008795 }
8796 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008797 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008798}
8799
Greg Claytona1e5dc82015-08-11 22:53:00 +00008800CompilerType
8801ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008802{
8803 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8804 {
Greg Claytonf73034f2015-09-08 18:15:05 +00008805 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008806 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008807 return CompilerType();
8808 return CompilerType (ast->getASTContext(),
Greg Claytond8d4a572015-08-11 21:38:15 +00008809 ast->getASTContext()->getMemberPointerType (GetQualType(pointee_type),
8810 GetQualType(type).getTypePtr()));
8811 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008812 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008813}
8814
8815
8816size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008817ClangASTContext::ConvertStringToFloatValue (lldb::opaque_compiler_type_t type, const char *s, uint8_t *dst, size_t dst_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008818{
8819 if (type)
8820 {
8821 clang::QualType qual_type (GetCanonicalQualType(type));
8822 uint32_t count = 0;
8823 bool is_complex = false;
8824 if (IsFloatingPointType (type, count, is_complex))
8825 {
8826 // TODO: handle complex and vector types
8827 if (count != 1)
8828 return false;
8829
8830 llvm::StringRef s_sref(s);
8831 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8832
8833 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8834 const uint64_t byte_size = bit_size / 8;
8835 if (dst_size >= byte_size)
8836 {
8837 if (bit_size == sizeof(float)*8)
8838 {
8839 float float32 = ap_float.convertToFloat();
8840 ::memcpy (dst, &float32, byte_size);
8841 return byte_size;
8842 }
8843 else if (bit_size >= 64)
8844 {
8845 llvm::APInt ap_int(ap_float.bitcastToAPInt());
8846 ::memcpy (dst, ap_int.getRawData(), byte_size);
8847 return byte_size;
8848 }
8849 }
8850 }
8851 }
8852 return 0;
8853}
8854
8855
8856
8857//----------------------------------------------------------------------
8858// Dumping types
8859//----------------------------------------------------------------------
8860#define DEPTH_INCREMENT 2
8861
8862void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008863ClangASTContext::DumpValue (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00008864 Stream *s,
8865 lldb::Format format,
8866 const lldb_private::DataExtractor &data,
8867 lldb::offset_t data_byte_offset,
8868 size_t data_byte_size,
8869 uint32_t bitfield_bit_size,
8870 uint32_t bitfield_bit_offset,
8871 bool show_types,
8872 bool show_summary,
8873 bool verbose,
8874 uint32_t depth)
8875{
8876 if (!type)
8877 return;
8878
8879 clang::QualType qual_type(GetQualType(type));
8880 switch (qual_type->getTypeClass())
8881 {
8882 case clang::Type::Record:
8883 if (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 assert(record_decl);
8888 uint32_t field_bit_offset = 0;
8889 uint32_t field_byte_offset = 0;
8890 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8891 uint32_t child_idx = 0;
8892
8893 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8894 if (cxx_record_decl)
8895 {
8896 // We might have base classes to print out first
8897 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8898 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8899 base_class != base_class_end;
8900 ++base_class)
8901 {
8902 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8903
8904 // Skip empty base classes
8905 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8906 continue;
8907
8908 if (base_class->isVirtual())
8909 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8910 else
8911 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8912 field_byte_offset = field_bit_offset / 8;
8913 assert (field_bit_offset % 8 == 0);
8914 if (child_idx == 0)
8915 s->PutChar('{');
8916 else
8917 s->PutChar(',');
8918
8919 clang::QualType base_class_qual_type = base_class->getType();
8920 std::string base_class_type_name(base_class_qual_type.getAsString());
8921
8922 // Indent and print the base class type name
8923 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8924
8925 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8926
8927 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008928 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008929 base_clang_type.DumpValue (exe_ctx,
8930 s, // Stream to dump to
8931 base_clang_type.GetFormat(), // The format with which to display the member
8932 data, // Data buffer containing all bytes for this type
8933 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8934 base_class_type_info.Width / 8, // Size of this type in bytes
8935 0, // Bitfield bit size
8936 0, // Bitfield bit offset
8937 show_types, // Boolean indicating if we should show the variable types
8938 show_summary, // Boolean indicating if we should show a summary for the current type
8939 verbose, // Verbose output?
8940 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8941
8942 ++child_idx;
8943 }
8944 }
8945 uint32_t field_idx = 0;
8946 clang::RecordDecl::field_iterator field, field_end;
8947 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8948 {
8949 // Print the starting squiggly bracket (if this is the
8950 // first member) or comma (for member 2 and beyond) for
8951 // the struct/union/class member.
8952 if (child_idx == 0)
8953 s->PutChar('{');
8954 else
8955 s->PutChar(',');
8956
8957 // Indent
8958 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8959
8960 clang::QualType field_type = field->getType();
8961 // Print the member type if requested
8962 // Figure out the type byte size (field_type_info.first) and
8963 // alignment (field_type_info.second) from the AST context.
8964 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8965 assert(field_idx < record_layout.getFieldCount());
8966 // Figure out the field offset within the current struct/union/class type
8967 field_bit_offset = record_layout.getFieldOffset (field_idx);
8968 field_byte_offset = field_bit_offset / 8;
8969 uint32_t field_bitfield_bit_size = 0;
8970 uint32_t field_bitfield_bit_offset = 0;
8971 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8972 field_bitfield_bit_offset = field_bit_offset % 8;
8973
8974 if (show_types)
8975 {
8976 std::string field_type_name(field_type.getAsString());
8977 if (field_bitfield_bit_size > 0)
8978 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
8979 else
8980 s->Printf("(%s) ", field_type_name.c_str());
8981 }
8982 // Print the member name and equal sign
8983 s->Printf("%s = ", field->getNameAsString().c_str());
8984
8985
8986 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008987 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008988 field_clang_type.DumpValue (exe_ctx,
8989 s, // Stream to dump to
8990 field_clang_type.GetFormat(), // The format with which to display the member
8991 data, // Data buffer containing all bytes for this type
8992 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8993 field_type_info.Width / 8, // Size of this type in bytes
8994 field_bitfield_bit_size, // Bitfield bit size
8995 field_bitfield_bit_offset, // Bitfield bit offset
8996 show_types, // Boolean indicating if we should show the variable types
8997 show_summary, // Boolean indicating if we should show a summary for the current type
8998 verbose, // Verbose output?
8999 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
9000 }
9001
9002 // Indent the trailing squiggly bracket
9003 if (child_idx > 0)
9004 s->Printf("\n%*s}", depth, "");
9005 }
9006 return;
9007
9008 case clang::Type::Enum:
9009 if (GetCompleteType(type))
9010 {
9011 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
9012 const clang::EnumDecl *enum_decl = enutype->getDecl();
9013 assert(enum_decl);
9014 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
9015 lldb::offset_t offset = data_byte_offset;
9016 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
9017 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9018 {
9019 if (enum_pos->getInitVal() == enum_value)
9020 {
9021 s->Printf("%s", enum_pos->getNameAsString().c_str());
9022 return;
9023 }
9024 }
9025 // If we have gotten here we didn't get find the enumerator in the
9026 // enum decl, so just print the integer.
9027 s->Printf("%" PRIi64, enum_value);
9028 }
9029 return;
9030
9031 case clang::Type::ConstantArray:
9032 {
9033 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
9034 bool is_array_of_characters = false;
9035 clang::QualType element_qual_type = array->getElementType();
9036
9037 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
9038 if (canonical_type)
9039 is_array_of_characters = canonical_type->isCharType();
9040
9041 const uint64_t element_count = array->getSize().getLimitedValue();
9042
9043 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
9044
9045 uint32_t element_idx = 0;
9046 uint32_t element_offset = 0;
9047 uint64_t element_byte_size = field_type_info.Width / 8;
9048 uint32_t element_stride = element_byte_size;
9049
9050 if (is_array_of_characters)
9051 {
9052 s->PutChar('"');
9053 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
9054 s->PutChar('"');
9055 return;
9056 }
9057 else
9058 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00009059 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009060 lldb::Format element_format = element_clang_type.GetFormat();
9061
9062 for (element_idx = 0; element_idx < element_count; ++element_idx)
9063 {
9064 // Print the starting squiggly bracket (if this is the
9065 // first member) or comman (for member 2 and beyong) for
9066 // the struct/union/class member.
9067 if (element_idx == 0)
9068 s->PutChar('{');
9069 else
9070 s->PutChar(',');
9071
9072 // Indent and print the index
9073 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
9074
9075 // Figure out the field offset within the current struct/union/class type
9076 element_offset = element_idx * element_stride;
9077
9078 // Dump the value of the member
9079 element_clang_type.DumpValue (exe_ctx,
9080 s, // Stream to dump to
9081 element_format, // The format with which to display the element
9082 data, // Data buffer containing all bytes for this type
9083 data_byte_offset + element_offset,// Offset into "data" where to grab value from
9084 element_byte_size, // Size of this type in bytes
9085 0, // Bitfield bit size
9086 0, // Bitfield bit offset
9087 show_types, // Boolean indicating if we should show the variable types
9088 show_summary, // Boolean indicating if we should show a summary for the current type
9089 verbose, // Verbose output?
9090 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
9091 }
9092
9093 // Indent the trailing squiggly bracket
9094 if (element_idx > 0)
9095 s->Printf("\n%*s}", depth, "");
9096 }
9097 }
9098 return;
9099
9100 case clang::Type::Typedef:
9101 {
9102 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
9103
Greg Claytona1e5dc82015-08-11 22:53:00 +00009104 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009105 lldb::Format typedef_format = typedef_clang_type.GetFormat();
9106 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
9107 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
9108
9109 return typedef_clang_type.DumpValue (exe_ctx,
9110 s, // Stream to dump to
9111 typedef_format, // The format with which to display the element
9112 data, // Data buffer containing all bytes for this type
9113 data_byte_offset, // Offset into "data" where to grab value from
9114 typedef_byte_size, // Size of this type in bytes
9115 bitfield_bit_size, // Bitfield bit size
9116 bitfield_bit_offset,// Bitfield bit offset
9117 show_types, // Boolean indicating if we should show the variable types
9118 show_summary, // Boolean indicating if we should show a summary for the current type
9119 verbose, // Verbose output?
9120 depth); // Scope depth for any types that have children
9121 }
9122 break;
9123
Enrico Granata36f51e42015-12-18 22:41:25 +00009124 case clang::Type::Auto:
9125 {
9126 clang::QualType elaborated_qual_type = llvm::cast<clang::AutoType>(qual_type)->getDeducedType();
9127 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
9128 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
9129 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
9130 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
9131
9132 return elaborated_clang_type.DumpValue (exe_ctx,
9133 s, // Stream to dump to
9134 elaborated_format, // The format with which to display the element
9135 data, // Data buffer containing all bytes for this type
9136 data_byte_offset, // Offset into "data" where to grab value from
9137 elaborated_byte_size, // Size of this type in bytes
9138 bitfield_bit_size, // Bitfield bit size
9139 bitfield_bit_offset,// Bitfield bit offset
9140 show_types, // Boolean indicating if we should show the variable types
9141 show_summary, // Boolean indicating if we should show a summary for the current type
9142 verbose, // Verbose output?
9143 depth); // Scope depth for any types that have children
9144 }
9145 break;
9146
Greg Claytond8d4a572015-08-11 21:38:15 +00009147 case clang::Type::Elaborated:
9148 {
9149 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009150 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009151 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
9152 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
9153 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
9154
9155 return elaborated_clang_type.DumpValue (exe_ctx,
9156 s, // Stream to dump to
9157 elaborated_format, // The format with which to display the element
9158 data, // Data buffer containing all bytes for this type
9159 data_byte_offset, // Offset into "data" where to grab value from
9160 elaborated_byte_size, // Size of this type in bytes
9161 bitfield_bit_size, // Bitfield bit size
9162 bitfield_bit_offset,// Bitfield bit offset
9163 show_types, // Boolean indicating if we should show the variable types
9164 show_summary, // Boolean indicating if we should show a summary for the current type
9165 verbose, // Verbose output?
9166 depth); // Scope depth for any types that have children
9167 }
9168 break;
9169
9170 case clang::Type::Paren:
9171 {
9172 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009173 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009174
9175 lldb::Format desugar_format = desugar_clang_type.GetFormat();
9176 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
9177 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
9178
9179 return desugar_clang_type.DumpValue (exe_ctx,
9180 s, // Stream to dump to
9181 desugar_format, // The format with which to display the element
9182 data, // Data buffer containing all bytes for this type
9183 data_byte_offset, // Offset into "data" where to grab value from
9184 desugar_byte_size, // Size of this type in bytes
9185 bitfield_bit_size, // Bitfield bit size
9186 bitfield_bit_offset,// Bitfield bit offset
9187 show_types, // Boolean indicating if we should show the variable types
9188 show_summary, // Boolean indicating if we should show a summary for the current type
9189 verbose, // Verbose output?
9190 depth); // Scope depth for any types that have children
9191 }
9192 break;
9193
9194 default:
9195 // We are down to a scalar type that we just need to display.
9196 data.Dump(s,
9197 data_byte_offset,
9198 format,
9199 data_byte_size,
9200 1,
9201 UINT32_MAX,
9202 LLDB_INVALID_ADDRESS,
9203 bitfield_bit_size,
9204 bitfield_bit_offset);
9205
9206 if (show_summary)
9207 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
9208 break;
9209 }
9210}
9211
9212
9213
9214
9215bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009216ClangASTContext::DumpTypeValue (lldb::opaque_compiler_type_t type, Stream *s,
Greg Claytond8d4a572015-08-11 21:38:15 +00009217 lldb::Format format,
9218 const lldb_private::DataExtractor &data,
9219 lldb::offset_t byte_offset,
9220 size_t byte_size,
9221 uint32_t bitfield_bit_size,
9222 uint32_t bitfield_bit_offset,
9223 ExecutionContextScope *exe_scope)
9224{
9225 if (!type)
9226 return false;
9227 if (IsAggregateType(type))
9228 {
9229 return false;
9230 }
9231 else
9232 {
9233 clang::QualType qual_type(GetQualType(type));
9234
9235 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9236 switch (type_class)
9237 {
9238 case clang::Type::Typedef:
9239 {
9240 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009241 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009242 if (format == eFormatDefault)
9243 format = typedef_clang_type.GetFormat();
9244 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
9245 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
9246
9247 return typedef_clang_type.DumpTypeValue (s,
9248 format, // The format with which to display the element
9249 data, // Data buffer containing all bytes for this type
9250 byte_offset, // Offset into "data" where to grab value from
9251 typedef_byte_size, // Size of this type in bytes
9252 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
9253 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
9254 exe_scope);
9255 }
9256 break;
9257
9258 case clang::Type::Enum:
9259 // If our format is enum or default, show the enumeration value as
9260 // its enumeration string value, else just display it as requested.
9261 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
9262 {
9263 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
9264 const clang::EnumDecl *enum_decl = enutype->getDecl();
9265 assert(enum_decl);
9266 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
9267 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
9268 lldb::offset_t offset = byte_offset;
9269 if (is_signed)
9270 {
9271 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
9272 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9273 {
9274 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
9275 {
9276 s->PutCString (enum_pos->getNameAsString().c_str());
9277 return true;
9278 }
9279 }
9280 // If we have gotten here we didn't get find the enumerator in the
9281 // enum decl, so just print the integer.
9282 s->Printf("%" PRIi64, enum_svalue);
9283 }
9284 else
9285 {
9286 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
9287 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9288 {
9289 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
9290 {
9291 s->PutCString (enum_pos->getNameAsString().c_str());
9292 return true;
9293 }
9294 }
9295 // If we have gotten here we didn't get find the enumerator in the
9296 // enum decl, so just print the integer.
9297 s->Printf("%" PRIu64, enum_uvalue);
9298 }
9299 return true;
9300 }
9301 // format was not enum, just fall through and dump the value as requested....
9302
9303 default:
9304 // We are down to a scalar type that we just need to display.
9305 {
9306 uint32_t item_count = 1;
9307 // A few formats, we might need to modify our size and count for depending
9308 // on how we are trying to display the value...
9309 switch (format)
9310 {
9311 default:
9312 case eFormatBoolean:
9313 case eFormatBinary:
9314 case eFormatComplex:
9315 case eFormatCString: // NULL terminated C strings
9316 case eFormatDecimal:
9317 case eFormatEnum:
9318 case eFormatHex:
9319 case eFormatHexUppercase:
9320 case eFormatFloat:
9321 case eFormatOctal:
9322 case eFormatOSType:
9323 case eFormatUnsigned:
9324 case eFormatPointer:
9325 case eFormatVectorOfChar:
9326 case eFormatVectorOfSInt8:
9327 case eFormatVectorOfUInt8:
9328 case eFormatVectorOfSInt16:
9329 case eFormatVectorOfUInt16:
9330 case eFormatVectorOfSInt32:
9331 case eFormatVectorOfUInt32:
9332 case eFormatVectorOfSInt64:
9333 case eFormatVectorOfUInt64:
9334 case eFormatVectorOfFloat32:
9335 case eFormatVectorOfFloat64:
9336 case eFormatVectorOfUInt128:
9337 break;
9338
9339 case eFormatChar:
9340 case eFormatCharPrintable:
9341 case eFormatCharArray:
9342 case eFormatBytes:
9343 case eFormatBytesWithASCII:
9344 item_count = byte_size;
9345 byte_size = 1;
9346 break;
9347
9348 case eFormatUnicode16:
9349 item_count = byte_size / 2;
9350 byte_size = 2;
9351 break;
9352
9353 case eFormatUnicode32:
9354 item_count = byte_size / 4;
9355 byte_size = 4;
9356 break;
9357 }
9358 return data.Dump (s,
9359 byte_offset,
9360 format,
9361 byte_size,
9362 item_count,
9363 UINT32_MAX,
9364 LLDB_INVALID_ADDRESS,
9365 bitfield_bit_size,
9366 bitfield_bit_offset,
9367 exe_scope);
9368 }
9369 break;
9370 }
9371 }
9372 return 0;
9373}
9374
9375
9376
9377void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009378ClangASTContext::DumpSummary (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00009379 Stream *s,
9380 const lldb_private::DataExtractor &data,
9381 lldb::offset_t data_byte_offset,
9382 size_t data_byte_size)
9383{
9384 uint32_t length = 0;
9385 if (IsCStringType (type, length))
9386 {
9387 if (exe_ctx)
9388 {
9389 Process *process = exe_ctx->GetProcessPtr();
9390 if (process)
9391 {
9392 lldb::offset_t offset = data_byte_offset;
9393 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
9394 std::vector<uint8_t> buf;
9395 if (length > 0)
9396 buf.resize (length);
9397 else
9398 buf.resize (256);
9399
9400 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
9401 buf.back() = '\0';
9402 size_t bytes_read;
9403 size_t total_cstr_len = 0;
9404 Error error;
9405 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
9406 {
9407 const size_t len = strlen((const char *)&buf.front());
9408 if (len == 0)
9409 break;
9410 if (total_cstr_len == 0)
9411 s->PutCString (" \"");
9412 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
9413 total_cstr_len += len;
9414 if (len < buf.size())
9415 break;
9416 pointer_address += total_cstr_len;
9417 }
9418 if (total_cstr_len > 0)
9419 s->PutChar ('"');
9420 }
9421 }
9422 }
9423}
9424
9425void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009426ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00009427{
9428 StreamFile s (stdout, false);
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00009429 DumpTypeDescription (type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009430 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
9431 if (metadata)
9432 {
9433 metadata->Dump (&s);
9434 }
9435}
9436
9437void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009438ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type, Stream *s)
Greg Claytond8d4a572015-08-11 21:38:15 +00009439{
9440 if (type)
9441 {
9442 clang::QualType qual_type(GetQualType(type));
9443
9444 llvm::SmallVector<char, 1024> buf;
9445 llvm::raw_svector_ostream llvm_ostrm (buf);
9446
9447 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9448 switch (type_class)
9449 {
9450 case clang::Type::ObjCObject:
9451 case clang::Type::ObjCInterface:
9452 {
9453 GetCompleteType(type);
9454
9455 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
9456 assert (objc_class_type);
9457 if (objc_class_type)
9458 {
9459 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9460 if (class_interface_decl)
9461 {
9462 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
9463 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
9464 }
9465 }
9466 }
9467 break;
9468
9469 case clang::Type::Typedef:
9470 {
9471 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
9472 if (typedef_type)
9473 {
9474 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
9475 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
9476 if (!clang_typedef_name.empty())
9477 {
9478 s->PutCString ("typedef ");
9479 s->PutCString (clang_typedef_name.c_str());
9480 }
9481 }
9482 }
9483 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00009484
9485 case clang::Type::Auto:
9486 CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).DumpTypeDescription(s);
9487 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00009488
9489 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009490 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009491 return;
9492
9493 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009494 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009495 return;
9496
9497 case clang::Type::Record:
9498 {
9499 GetCompleteType(type);
9500
9501 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
9502 const clang::RecordDecl *record_decl = record_type->getDecl();
9503 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
9504
9505 if (cxx_record_decl)
9506 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9507 else
9508 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9509 }
9510 break;
9511
9512 default:
9513 {
9514 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
9515 if (tag_type)
9516 {
9517 clang::TagDecl *tag_decl = tag_type->getDecl();
9518 if (tag_decl)
9519 tag_decl->print(llvm_ostrm, 0);
9520 }
9521 else
9522 {
9523 std::string clang_type_name(qual_type.getAsString());
9524 if (!clang_type_name.empty())
9525 s->PutCString (clang_type_name.c_str());
9526 }
9527 }
9528 }
9529
Greg Claytond8d4a572015-08-11 21:38:15 +00009530 if (buf.size() > 0)
9531 {
9532 s->Write (buf.data(), buf.size());
9533 }
9534 }
9535}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009536
Greg Claytone6b36cd2015-12-08 01:02:08 +00009537void
9538ClangASTContext::DumpTypeName (const CompilerType &type)
9539{
9540 if (IsClangType(type))
9541 {
9542 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
9543
9544 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9545 switch (type_class)
9546 {
9547 case clang::Type::Record:
9548 {
9549 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
9550 if (cxx_record_decl)
9551 printf("class %s", cxx_record_decl->getName().str().c_str());
9552 }
9553 break;
9554
9555 case clang::Type::Enum:
9556 {
9557 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
9558 if (enum_decl)
9559 {
9560 printf("enum %s", enum_decl->getName().str().c_str());
9561 }
9562 }
9563 break;
9564
9565 case clang::Type::ObjCObject:
9566 case clang::Type::ObjCInterface:
9567 {
9568 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
9569 if (objc_class_type)
9570 {
9571 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9572 // We currently can't complete objective C types through the newly added ASTContext
9573 // because it only supports TagDecl objects right now...
9574 if (class_interface_decl)
9575 printf("@class %s", class_interface_decl->getName().str().c_str());
9576 }
9577 }
9578 break;
9579
9580
9581 case clang::Type::Typedef:
9582 printf("typedef %s", llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getName().str().c_str());
9583 break;
9584
Enrico Granata36f51e42015-12-18 22:41:25 +00009585 case clang::Type::Auto:
9586 printf("auto ");
9587 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()));
9588
Greg Claytone6b36cd2015-12-08 01:02:08 +00009589 case clang::Type::Elaborated:
9590 printf("elaborated ");
9591 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
9592
9593 case clang::Type::Paren:
9594 printf("paren ");
9595 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
9596
9597 default:
9598 printf("ClangASTContext::DumpTypeName() type_class = %u", type_class);
9599 break;
9600 }
9601 }
9602
9603}
9604
9605
9606
Greg Clayton8b4edba2015-08-14 20:02:05 +00009607clang::ClassTemplateDecl *
Greg Clayton6071e6f2015-08-26 22:57:51 +00009608ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009609 lldb::AccessType access_type,
9610 const char *parent_name,
9611 int tag_decl_kind,
9612 const ClangASTContext::TemplateParameterInfos &template_param_infos)
9613{
9614 if (template_param_infos.IsValid())
9615 {
9616 std::string template_basename(parent_name);
9617 template_basename.erase (template_basename.find('<'));
9618
9619 return CreateClassTemplateDecl (decl_ctx,
9620 access_type,
9621 template_basename.c_str(),
9622 tag_decl_kind,
9623 template_param_infos);
9624 }
9625 return NULL;
9626}
9627
Greg Clayton6dc8d582015-08-18 22:32:36 +00009628void
9629ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl)
9630{
9631 ClangASTContext *ast = (ClangASTContext *)baton;
9632 SymbolFile *sym_file = ast->GetSymbolFile();
9633 if (sym_file)
9634 {
9635 CompilerType clang_type = GetTypeForDecl (decl);
9636 if (clang_type)
9637 sym_file->CompleteType (clang_type);
9638 }
9639}
9640
9641void
9642ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
9643{
9644 ClangASTContext *ast = (ClangASTContext *)baton;
9645 SymbolFile *sym_file = ast->GetSymbolFile();
9646 if (sym_file)
9647 {
9648 CompilerType clang_type = GetTypeForDecl (decl);
9649 if (clang_type)
9650 sym_file->CompleteType (clang_type);
9651 }
9652}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009653
Greg Clayton261ac3f2015-08-28 01:01:03 +00009654
9655DWARFASTParser *
9656ClangASTContext::GetDWARFParser ()
9657{
9658 if (!m_dwarf_ast_parser_ap)
9659 m_dwarf_ast_parser_ap.reset(new DWARFASTParserClang(*this));
9660 return m_dwarf_ast_parser_ap.get();
9661}
9662
9663
Greg Clayton8b4edba2015-08-14 20:02:05 +00009664bool
Greg Clayton6dc8d582015-08-18 22:32:36 +00009665ClangASTContext::LayoutRecordType(void *baton,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009666 const clang::RecordDecl *record_decl,
9667 uint64_t &bit_size,
9668 uint64_t &alignment,
9669 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
9670 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
9671 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
9672{
Greg Clayton6dc8d582015-08-18 22:32:36 +00009673 ClangASTContext *ast = (ClangASTContext *)baton;
Greg Clayton261ac3f2015-08-28 01:01:03 +00009674 DWARFASTParserClang *dwarf_ast_parser = (DWARFASTParserClang *)ast->GetDWARFParser();
9675 return dwarf_ast_parser->LayoutRecordType(record_decl, bit_size, alignment, field_offsets, base_offsets, vbase_offsets);
Greg Clayton8b4edba2015-08-14 20:02:05 +00009676}
9677
Greg Clayton99558cc42015-08-24 23:46:31 +00009678//----------------------------------------------------------------------
Paul Hermand628cbb2015-09-15 23:44:17 +00009679// CompilerDecl override functions
9680//----------------------------------------------------------------------
9681lldb::VariableSP
9682ClangASTContext::DeclGetVariable (void *opaque_decl)
9683{
9684 if (llvm::dyn_cast<clang::VarDecl>((clang::Decl *)opaque_decl))
9685 {
9686 auto decl_search_it = m_decl_objects.find(opaque_decl);
9687 if (decl_search_it != m_decl_objects.end())
9688 return std::static_pointer_cast<Variable>(decl_search_it->second);
9689 }
9690 return VariableSP();
9691}
9692
9693void
9694ClangASTContext::DeclLinkToObject (void *opaque_decl, std::shared_ptr<void> object)
9695{
9696 if (m_decl_objects.find(opaque_decl) == m_decl_objects.end())
9697 m_decl_objects.insert(std::make_pair(opaque_decl, object));
9698}
9699
9700ConstString
9701ClangASTContext::DeclGetName (void *opaque_decl)
9702{
9703 if (opaque_decl)
9704 {
9705 clang::NamedDecl *nd = llvm::dyn_cast<NamedDecl>((clang::Decl*)opaque_decl);
9706 if (nd != nullptr)
Greg Claytonfe689042015-11-10 17:47:04 +00009707 return ConstString(nd->getDeclName().getAsString());
Paul Hermand628cbb2015-09-15 23:44:17 +00009708 }
9709 return ConstString();
9710}
9711
Greg Claytonfe689042015-11-10 17:47:04 +00009712ConstString
9713ClangASTContext::DeclGetMangledName (void *opaque_decl)
9714{
9715 if (opaque_decl)
9716 {
9717 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>((clang::Decl*)opaque_decl);
9718 if (nd != nullptr && !llvm::isa<clang::ObjCMethodDecl>(nd))
9719 {
9720 clang::MangleContext *mc = getMangleContext();
9721 if (mc && mc->shouldMangleCXXName(nd))
9722 {
9723 llvm::SmallVector<char, 1024> buf;
9724 llvm::raw_svector_ostream llvm_ostrm (buf);
9725 if (llvm::isa<clang::CXXConstructorDecl>(nd))
9726 {
9727 mc->mangleCXXCtor(llvm::dyn_cast<clang::CXXConstructorDecl>(nd), Ctor_Complete, llvm_ostrm);
9728 }
9729 else if (llvm::isa<clang::CXXDestructorDecl>(nd))
9730 {
9731 mc->mangleCXXDtor(llvm::dyn_cast<clang::CXXDestructorDecl>(nd), Dtor_Complete, llvm_ostrm);
9732 }
9733 else
9734 {
9735 mc->mangleName(nd, llvm_ostrm);
9736 }
9737 if (buf.size() > 0)
9738 return ConstString(buf.data(), buf.size());
9739 }
9740 }
9741 }
9742 return ConstString();
9743}
9744
9745CompilerDeclContext
9746ClangASTContext::DeclGetDeclContext (void *opaque_decl)
9747{
9748 if (opaque_decl)
9749 return CompilerDeclContext(this, ((clang::Decl*)opaque_decl)->getDeclContext());
9750 else
9751 return CompilerDeclContext();
9752}
9753
9754CompilerType
9755ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl)
9756{
9757 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9758 return CompilerType(this, func_decl->getReturnType().getAsOpaquePtr());
9759 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9760 return CompilerType(this, objc_method->getReturnType().getAsOpaquePtr());
9761 else
9762 return CompilerType();
9763}
9764
9765size_t
9766ClangASTContext::DeclGetFunctionNumArguments(void *opaque_decl)
9767{
9768 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9769 return func_decl->param_size();
9770 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9771 return objc_method->param_size();
9772 else
9773 return 0;
9774}
9775
9776CompilerType
9777ClangASTContext::DeclGetFunctionArgumentType (void *opaque_decl, size_t idx)
9778{
9779 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9780 {
9781 if (idx < func_decl->param_size())
9782 {
9783 ParmVarDecl *var_decl = func_decl->getParamDecl(idx);
9784 if (var_decl)
9785 return CompilerType(this, var_decl->getOriginalType().getAsOpaquePtr());
9786 }
9787 }
9788 else if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9789 {
9790 if (idx < objc_method->param_size())
9791 return CompilerType(this, objc_method->parameters()[idx]->getOriginalType().getAsOpaquePtr());
9792 }
9793 return CompilerType();
9794}
9795
Paul Hermand628cbb2015-09-15 23:44:17 +00009796//----------------------------------------------------------------------
Greg Clayton99558cc42015-08-24 23:46:31 +00009797// CompilerDeclContext functions
9798//----------------------------------------------------------------------
9799
Greg Claytondfc09622015-12-08 18:39:50 +00009800std::vector<CompilerDecl>
Siva Chandra03ff5c82016-02-05 19:10:04 +00009801ClangASTContext::DeclContextFindDeclByName(void *opaque_decl_ctx,
9802 ConstString name,
9803 const bool ignore_using_decls)
Paul Hermand628cbb2015-09-15 23:44:17 +00009804{
Greg Claytondfc09622015-12-08 18:39:50 +00009805 std::vector<CompilerDecl> found_decls;
Paul Hermand628cbb2015-09-15 23:44:17 +00009806 if (opaque_decl_ctx)
9807 {
9808 DeclContext *root_decl_ctx = (DeclContext *)opaque_decl_ctx;
9809 std::set<DeclContext *> searched;
9810 std::multimap<DeclContext *, DeclContext *> search_queue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009811 SymbolFile *symbol_file = GetSymbolFile();
Paul Hermand628cbb2015-09-15 23:44:17 +00009812
9813 for (clang::DeclContext *decl_context = root_decl_ctx; decl_context != nullptr && found_decls.empty(); decl_context = decl_context->getParent())
9814 {
9815 search_queue.insert(std::make_pair(decl_context, decl_context));
9816
9817 for (auto it = search_queue.find(decl_context); it != search_queue.end(); it++)
9818 {
Eugene Leviantc1ba9fc2015-11-13 11:00:10 +00009819 if (!searched.insert(it->second).second)
9820 continue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009821 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9822
Paul Hermand628cbb2015-09-15 23:44:17 +00009823 for (clang::Decl *child : it->second->decls())
9824 {
Paul Hermanea188fc2015-09-16 18:48:30 +00009825 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
Paul Hermand628cbb2015-09-15 23:44:17 +00009826 {
Siva Chandra03ff5c82016-02-05 19:10:04 +00009827 if (ignore_using_decls)
9828 continue;
Paul Hermand628cbb2015-09-15 23:44:17 +00009829 clang::DeclContext *from = ud->getCommonAncestor();
9830 if (searched.find(ud->getNominatedNamespace()) == searched.end())
9831 search_queue.insert(std::make_pair(from, ud->getNominatedNamespace()));
9832 }
9833 else if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9834 {
Siva Chandra03ff5c82016-02-05 19:10:04 +00009835 if (ignore_using_decls)
9836 continue;
Paul Hermand628cbb2015-09-15 23:44:17 +00009837 for (clang::UsingShadowDecl *usd : ud->shadows())
9838 {
9839 clang::Decl *target = usd->getTargetDecl();
9840 if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target))
9841 {
9842 IdentifierInfo *ii = nd->getIdentifier();
9843 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009844 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermand628cbb2015-09-15 23:44:17 +00009845 }
9846 }
9847 }
Paul Hermanea188fc2015-09-16 18:48:30 +00009848 else if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(child))
9849 {
9850 IdentifierInfo *ii = nd->getIdentifier();
9851 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009852 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermanea188fc2015-09-16 18:48:30 +00009853 }
Paul Hermand628cbb2015-09-15 23:44:17 +00009854 }
9855 }
9856 }
9857 }
9858 return found_decls;
9859}
9860
Dawn Perchikb5925782015-12-12 19:31:41 +00009861// Look for child_decl_ctx's lookup scope in frame_decl_ctx and its parents,
9862// and return the number of levels it took to find it, or LLDB_INVALID_DECL_LEVEL
9863// if not found. If the decl was imported via a using declaration, its name and/or
9864// type, if set, will be used to check that the decl found in the scope is a match.
9865//
9866// The optional name is required by languages (like C++) to handle using declarations
9867// like:
9868//
9869// void poo();
9870// namespace ns {
9871// void foo();
9872// void goo();
9873// }
9874// void bar() {
9875// using ns::foo;
9876// // CountDeclLevels returns 0 for 'foo', 1 for 'poo', and
9877// // LLDB_INVALID_DECL_LEVEL for 'goo'.
9878// }
9879//
9880// The optional type is useful in the case that there's a specific overload
9881// that we're looking for that might otherwise be shadowed, like:
9882//
9883// void foo(int);
9884// namespace ns {
9885// void foo();
9886// }
9887// void bar() {
9888// using ns::foo;
9889// // CountDeclLevels returns 0 for { 'foo', void() },
9890// // 1 for { 'foo', void(int) }, and
9891// // LLDB_INVALID_DECL_LEVEL for { 'foo', void(int, int) }.
9892// }
9893//
9894// NOTE: Because file statics are at the TranslationUnit along with globals, a
9895// function at file scope will return the same level as a function at global scope.
9896// Ideally we'd like to treat the file scope as an additional scope just below the
9897// global scope. More work needs to be done to recognise that, if the decl we're
9898// trying to look up is static, we should compare its source file with that of the
9899// current scope and return a lower number for it.
9900uint32_t
9901ClangASTContext::CountDeclLevels (clang::DeclContext *frame_decl_ctx,
9902 clang::DeclContext *child_decl_ctx,
9903 ConstString *child_name,
9904 CompilerType *child_type)
9905{
9906 if (frame_decl_ctx)
9907 {
9908 std::set<DeclContext *> searched;
9909 std::multimap<DeclContext *, DeclContext *> search_queue;
9910 SymbolFile *symbol_file = GetSymbolFile();
9911
9912 // Get the lookup scope for the decl we're trying to find.
9913 clang::DeclContext *parent_decl_ctx = child_decl_ctx->getParent();
9914
9915 // Look for it in our scope's decl context and its parents.
9916 uint32_t level = 0;
9917 for (clang::DeclContext *decl_ctx = frame_decl_ctx; decl_ctx != nullptr; decl_ctx = decl_ctx->getParent())
9918 {
9919 if (!decl_ctx->isLookupContext())
9920 continue;
9921 if (decl_ctx == parent_decl_ctx)
9922 // Found it!
9923 return level;
9924 search_queue.insert(std::make_pair(decl_ctx, decl_ctx));
9925 for (auto it = search_queue.find(decl_ctx); it != search_queue.end(); it++)
9926 {
9927 if (searched.find(it->second) != searched.end())
9928 continue;
9929 searched.insert(it->second);
9930 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9931
9932 for (clang::Decl *child : it->second->decls())
9933 {
9934 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
9935 {
9936 clang::DeclContext *ns = ud->getNominatedNamespace();
9937 if (ns == parent_decl_ctx)
9938 // Found it!
9939 return level;
9940 clang::DeclContext *from = ud->getCommonAncestor();
9941 if (searched.find(ns) == searched.end())
9942 search_queue.insert(std::make_pair(from, ns));
9943 }
9944 else if (child_name)
9945 {
9946 if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9947 {
9948 for (clang::UsingShadowDecl *usd : ud->shadows())
9949 {
9950 clang::Decl *target = usd->getTargetDecl();
9951 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target);
9952 if (!nd)
9953 continue;
9954 // Check names.
9955 IdentifierInfo *ii = nd->getIdentifier();
9956 if (ii == nullptr || !ii->getName().equals(child_name->AsCString(nullptr)))
9957 continue;
9958 // Check types, if one was provided.
9959 if (child_type)
9960 {
9961 CompilerType clang_type = ClangASTContext::GetTypeForDecl(nd);
9962 if (!AreTypesSame(clang_type, *child_type, /*ignore_qualifiers=*/true))
9963 continue;
9964 }
9965 // Found it!
9966 return level;
9967 }
9968 }
9969 }
9970 }
9971 }
9972 ++level;
9973 }
9974 }
9975 return LLDB_INVALID_DECL_LEVEL;
9976}
9977
Greg Clayton99558cc42015-08-24 23:46:31 +00009978bool
9979ClangASTContext::DeclContextIsStructUnionOrClass (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00009980{
Greg Clayton99558cc42015-08-24 23:46:31 +00009981 if (opaque_decl_ctx)
9982 return ((clang::DeclContext *)opaque_decl_ctx)->isRecord();
9983 else
9984 return false;
Greg Clayton8b4edba2015-08-14 20:02:05 +00009985}
9986
Greg Clayton99558cc42015-08-24 23:46:31 +00009987ConstString
9988ClangASTContext::DeclContextGetName (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00009989{
Greg Clayton99558cc42015-08-24 23:46:31 +00009990 if (opaque_decl_ctx)
9991 {
9992 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
9993 if (named_decl)
9994 return ConstString(named_decl->getName());
9995 }
9996 return ConstString();
9997}
9998
Siva Chandra9293fc42016-01-07 23:32:34 +00009999ConstString
10000ClangASTContext::DeclContextGetScopeQualifiedName (void *opaque_decl_ctx)
10001{
10002 if (opaque_decl_ctx)
10003 {
10004 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
10005 if (named_decl)
10006 return ConstString(llvm::StringRef(named_decl->getQualifiedNameAsString()));
10007 }
10008 return ConstString();
10009}
10010
Greg Clayton99558cc42015-08-24 23:46:31 +000010011bool
10012ClangASTContext::DeclContextIsClassMethod (void *opaque_decl_ctx,
10013 lldb::LanguageType *language_ptr,
10014 bool *is_instance_method_ptr,
10015 ConstString *language_object_name_ptr)
10016{
10017 if (opaque_decl_ctx)
10018 {
10019 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
10020 if (ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
10021 {
10022 if (is_instance_method_ptr)
10023 *is_instance_method_ptr = objc_method->isInstanceMethod();
10024 if (language_ptr)
10025 *language_ptr = eLanguageTypeObjC;
10026 if (language_object_name_ptr)
10027 language_object_name_ptr->SetCString("self");
10028 return true;
10029 }
10030 else if (CXXMethodDecl *cxx_method = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
10031 {
10032 if (is_instance_method_ptr)
10033 *is_instance_method_ptr = cxx_method->isInstance();
10034 if (language_ptr)
10035 *language_ptr = eLanguageTypeC_plus_plus;
10036 if (language_object_name_ptr)
10037 language_object_name_ptr->SetCString("this");
10038 return true;
10039 }
10040 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
10041 {
10042 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
10043 if (metadata && metadata->HasObjectPtr())
10044 {
10045 if (is_instance_method_ptr)
10046 *is_instance_method_ptr = true;
10047 if (language_ptr)
10048 *language_ptr = eLanguageTypeObjC;
10049 if (language_object_name_ptr)
10050 language_object_name_ptr->SetCString (metadata->GetObjectPtrName());
10051 return true;
10052 }
10053 }
10054 }
10055 return false;
10056}
10057
10058clang::DeclContext *
10059ClangASTContext::DeclContextGetAsDeclContext (const CompilerDeclContext &dc)
10060{
10061 if (dc.IsClang())
10062 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
10063 return nullptr;
10064}
10065
10066
10067ObjCMethodDecl *
10068ClangASTContext::DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc)
10069{
10070 if (dc.IsClang())
10071 return llvm::dyn_cast<clang::ObjCMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10072 return nullptr;
10073}
10074
10075CXXMethodDecl *
10076ClangASTContext::DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc)
10077{
10078 if (dc.IsClang())
10079 return llvm::dyn_cast<clang::CXXMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10080 return nullptr;
10081}
10082
10083clang::FunctionDecl *
10084ClangASTContext::DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc)
10085{
10086 if (dc.IsClang())
10087 return llvm::dyn_cast<clang::FunctionDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10088 return nullptr;
10089}
10090
10091clang::NamespaceDecl *
10092ClangASTContext::DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc)
10093{
10094 if (dc.IsClang())
10095 return llvm::dyn_cast<clang::NamespaceDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10096 return nullptr;
10097}
10098
10099ClangASTMetadata *
10100ClangASTContext::DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object)
10101{
10102 clang::ASTContext *ast = DeclContextGetClangASTContext (dc);
10103 if (ast)
10104 return ClangASTContext::GetMetadata (ast, object);
10105 return nullptr;
10106}
10107
10108clang::ASTContext *
10109ClangASTContext::DeclContextGetClangASTContext (const CompilerDeclContext &dc)
10110{
Greg Claytonf73034f2015-09-08 18:15:05 +000010111 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
10112 if (ast)
10113 return ast->getASTContext();
Greg Clayton99558cc42015-08-24 23:46:31 +000010114 return nullptr;
Greg Clayton8b4edba2015-08-14 20:02:05 +000010115}
10116
Jim Ingham151c0322015-09-15 21:13:50 +000010117ClangASTContextForExpressions::ClangASTContextForExpressions (Target &target) :
10118 ClangASTContext (target.GetArchitecture().GetTriple().getTriple().c_str()),
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010119 m_target_wp(target.shared_from_this()),
10120 m_persistent_variables (new ClangPersistentVariables)
Jim Ingham151c0322015-09-15 21:13:50 +000010121{
10122}
10123
10124UserExpression *
10125ClangASTContextForExpressions::GetUserExpression (const char *expr,
10126 const char *expr_prefix,
10127 lldb::LanguageType language,
Jim Ingham19a63fc2015-11-03 02:11:24 +000010128 Expression::ResultType desired_type,
10129 const EvaluateExpressionOptions &options)
Jim Ingham151c0322015-09-15 21:13:50 +000010130{
10131 TargetSP target_sp = m_target_wp.lock();
10132 if (!target_sp)
10133 return nullptr;
10134
Jim Ingham19a63fc2015-11-03 02:11:24 +000010135 return new ClangUserExpression(*target_sp.get(), expr, expr_prefix, language, desired_type, options);
Jim Ingham151c0322015-09-15 21:13:50 +000010136}
10137
10138FunctionCaller *
10139ClangASTContextForExpressions::GetFunctionCaller (const CompilerType &return_type,
10140 const Address& function_address,
10141 const ValueList &arg_value_list,
10142 const char *name)
10143{
10144 TargetSP target_sp = m_target_wp.lock();
10145 if (!target_sp)
10146 return nullptr;
10147
10148 Process *process = target_sp->GetProcessSP().get();
10149 if (!process)
10150 return nullptr;
10151
10152 return new ClangFunctionCaller (*process, return_type, function_address, arg_value_list, name);
10153}
10154
10155UtilityFunction *
10156ClangASTContextForExpressions::GetUtilityFunction (const char *text,
10157 const char *name)
10158{
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010159 TargetSP target_sp = m_target_wp.lock();
Jim Ingham151c0322015-09-15 21:13:50 +000010160 if (!target_sp)
10161 return nullptr;
10162
10163 return new ClangUtilityFunction(*target_sp.get(), text, name);
10164}
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010165
10166PersistentExpressionState *
10167ClangASTContextForExpressions::GetPersistentExpressionState ()
10168{
10169 return m_persistent_variables.get();
10170}