blob: a5c119b8398db933abe595cb9e6bb3b509de2a88 [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;
Omair Javaid92a8ded2016-02-24 12:17:43 +00003103 uint64_t base_bitwidth = 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00003104 for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos)
3105 {
3106 clang::QualType field_qual_type = field_pos->getType();
Omair Javaid92a8ded2016-02-24 12:17:43 +00003107 uint64_t field_bitwidth = getASTContext()->getTypeSize (qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003108 if (field_qual_type->isFloatingType())
3109 {
3110 if (field_qual_type->isComplexType())
3111 return 0;
3112 else
3113 {
3114 if (num_fields == 0)
3115 base_qual_type = field_qual_type;
3116 else
3117 {
3118 if (is_hva)
3119 return 0;
3120 is_hfa = true;
3121 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
3122 return 0;
3123 }
3124 }
3125 }
3126 else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType())
3127 {
Omair Javaid92a8ded2016-02-24 12:17:43 +00003128 if (num_fields == 0)
Greg Claytond8d4a572015-08-11 21:38:15 +00003129 {
Omair Javaid92a8ded2016-02-24 12:17:43 +00003130 base_qual_type = field_qual_type;
3131 base_bitwidth = field_bitwidth;
Greg Claytond8d4a572015-08-11 21:38:15 +00003132 }
3133 else
Omair Javaid92a8ded2016-02-24 12:17:43 +00003134 {
3135 if (is_hfa)
3136 return 0;
3137 is_hva = true;
3138 if (base_bitwidth != field_bitwidth)
3139 return 0;
3140 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
3141 return 0;
3142 }
Greg Claytond8d4a572015-08-11 21:38:15 +00003143 }
3144 else
3145 return 0;
3146 ++num_fields;
3147 }
3148 if (base_type_ptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003149 *base_type_ptr = CompilerType (getASTContext(), base_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003150 return num_fields;
3151 }
3152 }
3153 }
3154 break;
3155
3156 case clang::Type::Typedef:
3157 return IsHomogeneousAggregate(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), base_type_ptr);
Enrico Granata36f51e42015-12-18 22:41:25 +00003158
3159 case clang::Type::Auto:
3160 return IsHomogeneousAggregate(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), base_type_ptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00003161
3162 case clang::Type::Elaborated:
3163 return IsHomogeneousAggregate(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), base_type_ptr);
3164 default:
3165 break;
3166 }
3167 return 0;
3168}
3169
3170size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003171ClangASTContext::GetNumberOfFunctionArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003172{
3173 if (type)
3174 {
3175 clang::QualType qual_type (GetCanonicalQualType(type));
3176 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3177 if (func)
3178 return func->getNumParams();
3179 }
3180 return 0;
3181}
3182
Greg Claytona1e5dc82015-08-11 22:53:00 +00003183CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003184ClangASTContext::GetFunctionArgumentAtIndex (lldb::opaque_compiler_type_t type, const size_t index)
Greg Claytond8d4a572015-08-11 21:38:15 +00003185{
3186 if (type)
3187 {
Greg Clayton0a5f8052016-03-15 22:43:26 +00003188 clang::QualType qual_type (GetQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00003189 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3190 if (func)
3191 {
3192 if (index < func->getNumParams())
Greg Claytona1e5dc82015-08-11 22:53:00 +00003193 return CompilerType(getASTContext(), func->getParamType(index));
Greg Claytond8d4a572015-08-11 21:38:15 +00003194 }
3195 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003196 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003197}
3198
3199bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003200ClangASTContext::IsFunctionPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003201{
3202 if (type)
3203 {
3204 clang::QualType qual_type (GetCanonicalQualType(type));
3205
3206 if (qual_type->isFunctionPointerType())
3207 return true;
3208
3209 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3210 switch (type_class)
3211 {
3212 default:
3213 break;
3214 case clang::Type::Typedef:
3215 return IsFunctionPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Enrico Granata36f51e42015-12-18 22:41:25 +00003216 case clang::Type::Auto:
3217 return IsFunctionPointerType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003218 case clang::Type::Elaborated:
3219 return IsFunctionPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3220 case clang::Type::Paren:
3221 return IsFunctionPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
3222
3223 case clang::Type::LValueReference:
3224 case clang::Type::RValueReference:
3225 {
3226 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3227 if (reference_type)
3228 return IsFunctionPointerType(reference_type->getPointeeType().getAsOpaquePtr());
3229 }
3230 break;
3231 }
3232 }
3233 return false;
3234
3235}
3236
3237bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003238ClangASTContext::IsIntegerType (lldb::opaque_compiler_type_t type, bool &is_signed)
Greg Claytond8d4a572015-08-11 21:38:15 +00003239{
3240 if (!type)
3241 return false;
3242
3243 clang::QualType qual_type (GetCanonicalQualType(type));
3244 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3245
3246 if (builtin_type)
3247 {
3248 if (builtin_type->isInteger())
3249 {
3250 is_signed = builtin_type->isSignedInteger();
3251 return true;
3252 }
3253 }
3254
3255 return false;
3256}
3257
3258bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003259ClangASTContext::IsPointerType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003260{
3261 if (type)
3262 {
3263 clang::QualType qual_type (GetCanonicalQualType(type));
3264 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3265 switch (type_class)
3266 {
3267 case clang::Type::Builtin:
3268 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3269 {
3270 default:
3271 break;
3272 case clang::BuiltinType::ObjCId:
3273 case clang::BuiltinType::ObjCClass:
3274 return true;
3275 }
3276 return false;
3277 case clang::Type::ObjCObjectPointer:
3278 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003279 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003280 return true;
3281 case clang::Type::BlockPointer:
3282 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003283 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003284 return true;
3285 case clang::Type::Pointer:
3286 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003287 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003288 return true;
3289 case clang::Type::MemberPointer:
3290 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003291 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003292 return true;
3293 case clang::Type::Typedef:
3294 return IsPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
Enrico Granata36f51e42015-12-18 22:41:25 +00003295 case clang::Type::Auto:
3296 return IsPointerType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003297 case clang::Type::Elaborated:
3298 return IsPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3299 case clang::Type::Paren:
3300 return IsPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3301 default:
3302 break;
3303 }
3304 }
3305 if (pointee_type)
3306 pointee_type->Clear();
3307 return false;
3308}
3309
3310
3311bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003312ClangASTContext::IsPointerOrReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003313{
3314 if (type)
3315 {
3316 clang::QualType qual_type (GetCanonicalQualType(type));
3317 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3318 switch (type_class)
3319 {
3320 case clang::Type::Builtin:
3321 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3322 {
3323 default:
3324 break;
3325 case clang::BuiltinType::ObjCId:
3326 case clang::BuiltinType::ObjCClass:
3327 return true;
3328 }
3329 return false;
3330 case clang::Type::ObjCObjectPointer:
3331 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003332 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003333 return true;
3334 case clang::Type::BlockPointer:
3335 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003336 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003337 return true;
3338 case clang::Type::Pointer:
3339 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003340 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003341 return true;
3342 case clang::Type::MemberPointer:
3343 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003344 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003345 return true;
3346 case clang::Type::LValueReference:
3347 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003348 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003349 return true;
3350 case clang::Type::RValueReference:
3351 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003352 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003353 return true;
3354 case clang::Type::Typedef:
3355 return IsPointerOrReferenceType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
Enrico Granata36f51e42015-12-18 22:41:25 +00003356 case clang::Type::Auto:
3357 return IsPointerOrReferenceType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003358 case clang::Type::Elaborated:
3359 return IsPointerOrReferenceType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3360 case clang::Type::Paren:
3361 return IsPointerOrReferenceType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3362 default:
3363 break;
3364 }
3365 }
3366 if (pointee_type)
3367 pointee_type->Clear();
3368 return false;
3369}
3370
3371
3372bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003373ClangASTContext::IsReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool* is_rvalue)
Greg Claytond8d4a572015-08-11 21:38:15 +00003374{
3375 if (type)
3376 {
3377 clang::QualType qual_type (GetCanonicalQualType(type));
3378 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3379
3380 switch (type_class)
3381 {
3382 case clang::Type::LValueReference:
3383 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003384 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003385 if (is_rvalue)
3386 *is_rvalue = false;
3387 return true;
3388 case clang::Type::RValueReference:
3389 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003390 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003391 if (is_rvalue)
3392 *is_rvalue = true;
3393 return true;
3394 case clang::Type::Typedef:
3395 return IsReferenceType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type, is_rvalue);
Enrico Granata36f51e42015-12-18 22:41:25 +00003396 case clang::Type::Auto:
3397 return IsReferenceType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), pointee_type, is_rvalue);
Greg Claytond8d4a572015-08-11 21:38:15 +00003398 case clang::Type::Elaborated:
3399 return IsReferenceType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type, is_rvalue);
3400 case clang::Type::Paren:
3401 return IsReferenceType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type, is_rvalue);
3402
3403 default:
3404 break;
3405 }
3406 }
3407 if (pointee_type)
3408 pointee_type->Clear();
3409 return false;
3410}
3411
3412bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003413ClangASTContext::IsFloatingPointType (lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex)
Greg Claytond8d4a572015-08-11 21:38:15 +00003414{
3415 if (type)
3416 {
3417 clang::QualType qual_type (GetCanonicalQualType(type));
3418
3419 if (const clang::BuiltinType *BT = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal()))
3420 {
3421 clang::BuiltinType::Kind kind = BT->getKind();
3422 if (kind >= clang::BuiltinType::Float && kind <= clang::BuiltinType::LongDouble)
3423 {
3424 count = 1;
3425 is_complex = false;
3426 return true;
3427 }
3428 }
3429 else if (const clang::ComplexType *CT = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal()))
3430 {
3431 if (IsFloatingPointType (CT->getElementType().getAsOpaquePtr(), count, is_complex))
3432 {
3433 count = 2;
3434 is_complex = true;
3435 return true;
3436 }
3437 }
3438 else if (const clang::VectorType *VT = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal()))
3439 {
3440 if (IsFloatingPointType (VT->getElementType().getAsOpaquePtr(), count, is_complex))
3441 {
3442 count = VT->getNumElements();
3443 is_complex = false;
3444 return true;
3445 }
3446 }
3447 }
3448 count = 0;
3449 is_complex = false;
3450 return false;
3451}
3452
3453
3454bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003455ClangASTContext::IsDefined(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003456{
3457 if (!type)
3458 return false;
3459
3460 clang::QualType qual_type(GetQualType(type));
3461 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
3462 if (tag_type)
3463 {
3464 clang::TagDecl *tag_decl = tag_type->getDecl();
3465 if (tag_decl)
3466 return tag_decl->isCompleteDefinition();
3467 return false;
3468 }
3469 else
3470 {
3471 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3472 if (objc_class_type)
3473 {
3474 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3475 if (class_interface_decl)
3476 return class_interface_decl->getDefinition() != nullptr;
3477 return false;
3478 }
3479 }
3480 return true;
3481}
3482
3483bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003484ClangASTContext::IsObjCClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003485{
3486 if (type)
3487 {
3488 clang::QualType qual_type (GetCanonicalQualType(type));
3489
3490 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3491
3492 if (obj_pointer_type)
3493 return obj_pointer_type->isObjCClassType();
3494 }
3495 return false;
3496}
3497
3498bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003499ClangASTContext::IsObjCObjectOrInterfaceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003500{
Ryan Brown57bee1e2015-09-14 22:45:11 +00003501 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00003502 return GetCanonicalQualType(type)->isObjCObjectOrInterfaceType();
3503 return false;
3504}
3505
3506bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003507ClangASTContext::IsPolymorphicClass (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003508{
3509 if (type)
3510 {
3511 clang::QualType qual_type(GetCanonicalQualType(type));
3512 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3513 switch (type_class)
3514 {
3515 case clang::Type::Record:
3516 if (GetCompleteType(type))
3517 {
3518 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3519 const clang::RecordDecl *record_decl = record_type->getDecl();
3520 if (record_decl)
3521 {
3522 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3523 if (cxx_record_decl)
3524 return cxx_record_decl->isPolymorphic();
3525 }
3526 }
3527 break;
3528
3529 default:
3530 break;
3531 }
3532 }
3533 return false;
3534}
3535
3536bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003537ClangASTContext::IsPossibleDynamicType (lldb::opaque_compiler_type_t type, CompilerType *dynamic_pointee_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00003538 bool check_cplusplus,
3539 bool check_objc)
3540{
3541 clang::QualType pointee_qual_type;
3542 if (type)
3543 {
3544 clang::QualType qual_type (GetCanonicalQualType(type));
3545 bool success = false;
3546 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3547 switch (type_class)
3548 {
3549 case clang::Type::Builtin:
3550 if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
3551 {
3552 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003553 dynamic_pointee_type->SetCompilerType(this, type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003554 return true;
3555 }
3556 break;
3557
3558 case clang::Type::ObjCObjectPointer:
3559 if (check_objc)
3560 {
3561 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003562 dynamic_pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003563 return true;
3564 }
3565 break;
3566
3567 case clang::Type::Pointer:
3568 pointee_qual_type = llvm::cast<clang::PointerType>(qual_type)->getPointeeType();
3569 success = true;
3570 break;
3571
3572 case clang::Type::LValueReference:
3573 case clang::Type::RValueReference:
3574 pointee_qual_type = llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType();
3575 success = true;
3576 break;
3577
3578 case clang::Type::Typedef:
3579 return IsPossibleDynamicType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3580 dynamic_pointee_type,
3581 check_cplusplus,
3582 check_objc);
Enrico Granata36f51e42015-12-18 22:41:25 +00003583
3584 case clang::Type::Auto:
3585 return IsPossibleDynamicType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(),
3586 dynamic_pointee_type,
3587 check_cplusplus,
3588 check_objc);
Greg Claytond8d4a572015-08-11 21:38:15 +00003589
3590 case clang::Type::Elaborated:
3591 return IsPossibleDynamicType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3592 dynamic_pointee_type,
3593 check_cplusplus,
3594 check_objc);
3595
3596 case clang::Type::Paren:
3597 return IsPossibleDynamicType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
3598 dynamic_pointee_type,
3599 check_cplusplus,
3600 check_objc);
3601 default:
3602 break;
3603 }
3604
3605 if (success)
3606 {
3607 // Check to make sure what we are pointing too is a possible dynamic C++ type
3608 // We currently accept any "void *" (in case we have a class that has been
3609 // watered down to an opaque pointer) and virtual C++ classes.
3610 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
3611 switch (pointee_type_class)
3612 {
3613 case clang::Type::Builtin:
3614 switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind())
3615 {
3616 case clang::BuiltinType::UnknownAny:
3617 case clang::BuiltinType::Void:
3618 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003619 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003620 return true;
Zachary Turnerdd07e002015-09-16 18:08:45 +00003621 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00003622 break;
3623 }
3624 break;
3625
3626 case clang::Type::Record:
3627 if (check_cplusplus)
3628 {
3629 clang::CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
3630 if (cxx_record_decl)
3631 {
3632 bool is_complete = cxx_record_decl->isCompleteDefinition();
3633
3634 if (is_complete)
3635 success = cxx_record_decl->isDynamicClass();
3636 else
3637 {
3638 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), cxx_record_decl);
3639 if (metadata)
3640 success = metadata->GetIsDynamicCXXType();
3641 else
3642 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00003643 is_complete = CompilerType(getASTContext(), pointee_qual_type).GetCompleteType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003644 if (is_complete)
3645 success = cxx_record_decl->isDynamicClass();
3646 else
3647 success = false;
3648 }
3649 }
3650
3651 if (success)
3652 {
3653 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003654 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003655 return true;
3656 }
3657 }
3658 }
3659 break;
3660
3661 case clang::Type::ObjCObject:
3662 case clang::Type::ObjCInterface:
3663 if (check_objc)
3664 {
3665 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003666 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003667 return true;
3668 }
3669 break;
3670
3671 default:
3672 break;
3673 }
3674 }
3675 }
3676 if (dynamic_pointee_type)
3677 dynamic_pointee_type->Clear();
3678 return false;
3679}
3680
3681
3682bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003683ClangASTContext::IsScalarType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003684{
3685 if (!type)
3686 return false;
3687
3688 return (GetTypeInfo (type, nullptr) & eTypeIsScalar) != 0;
3689}
3690
3691bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003692ClangASTContext::IsTypedefType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003693{
3694 if (!type)
3695 return false;
3696 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
3697}
3698
3699bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003700ClangASTContext::IsVoidType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003701{
3702 if (!type)
3703 return false;
3704 return GetCanonicalQualType(type)->isVoidType();
3705}
3706
3707bool
Greg Clayton56939cb2015-09-17 22:23:34 +00003708ClangASTContext::SupportsLanguage (lldb::LanguageType language)
3709{
3710 return ClangASTContextSupportsLanguage(language);
3711}
3712
3713bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003714ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003715{
3716 if (type)
3717 {
3718 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003719 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00003720 {
Ryan Brown57bee1e2015-09-14 22:45:11 +00003721 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3722 if (cxx_record_decl)
3723 {
3724 class_name.assign(cxx_record_decl->getIdentifier()->getNameStart());
3725 return true;
3726 }
Greg Claytond8d4a572015-08-11 21:38:15 +00003727 }
3728 }
3729 class_name.clear();
3730 return false;
3731}
3732
3733
3734bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003735ClangASTContext::IsCXXClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003736{
3737 if (!type)
3738 return false;
3739
3740 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003741 if (!qual_type.isNull() && qual_type->getAsCXXRecordDecl() != nullptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003742 return true;
3743 return false;
3744}
3745
3746bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003747ClangASTContext::IsBeingDefined (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003748{
3749 if (!type)
3750 return false;
3751 clang::QualType qual_type (GetCanonicalQualType(type));
3752 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
3753 if (tag_type)
3754 return tag_type->isBeingDefined();
3755 return false;
3756}
3757
3758bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003759ClangASTContext::IsObjCObjectPointerType (const CompilerType& type, CompilerType *class_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003760{
3761 if (!type)
3762 return false;
3763
3764 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003765
3766 if (!qual_type.isNull() && qual_type->isObjCObjectPointerType())
Greg Claytond8d4a572015-08-11 21:38:15 +00003767 {
3768 if (class_type_ptr)
3769 {
3770 if (!qual_type->isObjCClassType() &&
3771 !qual_type->isObjCIdType())
3772 {
3773 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3774 if (obj_pointer_type == nullptr)
3775 class_type_ptr->Clear();
3776 else
Greg Clayton99558cc42015-08-24 23:46:31 +00003777 class_type_ptr->SetCompilerType (type.GetTypeSystem(), clang::QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003778 }
3779 }
3780 return true;
3781 }
3782 if (class_type_ptr)
3783 class_type_ptr->Clear();
3784 return false;
3785}
3786
3787bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003788ClangASTContext::GetObjCClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003789{
3790 if (!type)
3791 return false;
3792
3793 clang::QualType qual_type (GetCanonicalQualType(type));
3794
3795 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3796 if (object_type)
3797 {
3798 const clang::ObjCInterfaceDecl *interface = object_type->getInterface();
3799 if (interface)
3800 {
3801 class_name = interface->getNameAsString();
3802 return true;
3803 }
3804 }
3805 return false;
3806}
3807
3808
3809//----------------------------------------------------------------------
3810// Type Completion
3811//----------------------------------------------------------------------
3812
3813bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003814ClangASTContext::GetCompleteType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003815{
3816 if (!type)
3817 return false;
3818 const bool allow_completion = true;
3819 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
3820}
3821
3822ConstString
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003823ClangASTContext::GetTypeName (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003824{
3825 std::string type_name;
3826 if (type)
3827 {
3828 clang::PrintingPolicy printing_policy (getASTContext()->getPrintingPolicy());
3829 clang::QualType qual_type(GetQualType(type));
3830 printing_policy.SuppressTagKeyword = true;
3831 printing_policy.LangOpts.WChar = true;
3832 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
3833 if (typedef_type)
3834 {
3835 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
3836 type_name = typedef_decl->getQualifiedNameAsString();
3837 }
3838 else
3839 {
3840 type_name = qual_type.getAsString(printing_policy);
3841 }
3842 }
3843 return ConstString(type_name);
3844}
3845
3846uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003847ClangASTContext::GetTypeInfo (lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003848{
3849 if (!type)
3850 return 0;
3851
3852 if (pointee_or_element_clang_type)
3853 pointee_or_element_clang_type->Clear();
3854
3855 clang::QualType qual_type (GetQualType(type));
3856
3857 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3858 switch (type_class)
3859 {
3860 case clang::Type::Builtin:
3861 {
3862 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3863
3864 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
3865 switch (builtin_type->getKind())
3866 {
3867 case clang::BuiltinType::ObjCId:
3868 case clang::BuiltinType::ObjCClass:
3869 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003870 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003871 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3872 break;
3873
3874 case clang::BuiltinType::ObjCSel:
3875 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003876 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->CharTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003877 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3878 break;
3879
3880 case clang::BuiltinType::Bool:
3881 case clang::BuiltinType::Char_U:
3882 case clang::BuiltinType::UChar:
3883 case clang::BuiltinType::WChar_U:
3884 case clang::BuiltinType::Char16:
3885 case clang::BuiltinType::Char32:
3886 case clang::BuiltinType::UShort:
3887 case clang::BuiltinType::UInt:
3888 case clang::BuiltinType::ULong:
3889 case clang::BuiltinType::ULongLong:
3890 case clang::BuiltinType::UInt128:
3891 case clang::BuiltinType::Char_S:
3892 case clang::BuiltinType::SChar:
3893 case clang::BuiltinType::WChar_S:
3894 case clang::BuiltinType::Short:
3895 case clang::BuiltinType::Int:
3896 case clang::BuiltinType::Long:
3897 case clang::BuiltinType::LongLong:
3898 case clang::BuiltinType::Int128:
3899 case clang::BuiltinType::Float:
3900 case clang::BuiltinType::Double:
3901 case clang::BuiltinType::LongDouble:
3902 builtin_type_flags |= eTypeIsScalar;
3903 if (builtin_type->isInteger())
3904 {
3905 builtin_type_flags |= eTypeIsInteger;
3906 if (builtin_type->isSignedInteger())
3907 builtin_type_flags |= eTypeIsSigned;
3908 }
3909 else if (builtin_type->isFloatingPoint())
3910 builtin_type_flags |= eTypeIsFloat;
3911 break;
3912 default:
3913 break;
3914 }
3915 return builtin_type_flags;
3916 }
3917
3918 case clang::Type::BlockPointer:
3919 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003920 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003921 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3922
3923 case clang::Type::Complex:
3924 {
3925 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3926 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal());
3927 if (complex_type)
3928 {
3929 clang::QualType complex_element_type (complex_type->getElementType());
3930 if (complex_element_type->isIntegerType())
3931 complex_type_flags |= eTypeIsFloat;
3932 else if (complex_element_type->isFloatingType())
3933 complex_type_flags |= eTypeIsInteger;
3934 }
3935 return complex_type_flags;
3936 }
3937 break;
3938
3939 case clang::Type::ConstantArray:
3940 case clang::Type::DependentSizedArray:
3941 case clang::Type::IncompleteArray:
3942 case clang::Type::VariableArray:
3943 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003944 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ArrayType>(qual_type.getTypePtr())->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003945 return eTypeHasChildren | eTypeIsArray;
3946
3947 case clang::Type::DependentName: return 0;
3948 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
3949 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
3950 case clang::Type::Decltype: return 0;
3951
3952 case clang::Type::Enum:
3953 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003954 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::EnumType>(qual_type)->getDecl()->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003955 return eTypeIsEnumeration | eTypeHasValue;
Enrico Granata36f51e42015-12-18 22:41:25 +00003956
3957 case clang::Type::Auto:
3958 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003959 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003960 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003961 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003962 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003963
3964 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
3965 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
3966 case clang::Type::InjectedClassName: return 0;
3967
3968 case clang::Type::LValueReference:
3969 case clang::Type::RValueReference:
3970 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003971 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003972 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3973
3974 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
3975
3976 case clang::Type::ObjCObjectPointer:
3977 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003978 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003979 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
3980
3981 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3982 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3983
3984 case clang::Type::Pointer:
3985 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003986 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003987 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3988
3989 case clang::Type::Record:
3990 if (qual_type->getAsCXXRecordDecl())
3991 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3992 else
3993 return eTypeHasChildren | eTypeIsStructUnion;
3994 break;
3995 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
3996 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
3997 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
3998
3999 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004000 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 +00004001 case clang::Type::TypeOfExpr: return 0;
4002 case clang::Type::TypeOf: return 0;
4003 case clang::Type::UnresolvedUsing: return 0;
4004
4005 case clang::Type::ExtVector:
4006 case clang::Type::Vector:
4007 {
4008 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
4009 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal());
4010 if (vector_type)
4011 {
4012 if (vector_type->isIntegerType())
4013 vector_type_flags |= eTypeIsFloat;
4014 else if (vector_type->isFloatingType())
4015 vector_type_flags |= eTypeIsInteger;
4016 }
4017 return vector_type_flags;
4018 }
4019 default: return 0;
4020 }
4021 return 0;
4022}
4023
4024
4025
4026lldb::LanguageType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004027ClangASTContext::GetMinimumLanguage (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004028{
4029 if (!type)
4030 return lldb::eLanguageTypeC;
4031
4032 // If the type is a reference, then resolve it to what it refers to first:
4033 clang::QualType qual_type (GetCanonicalQualType(type).getNonReferenceType());
4034 if (qual_type->isAnyPointerType())
4035 {
4036 if (qual_type->isObjCObjectPointerType())
4037 return lldb::eLanguageTypeObjC;
4038
4039 clang::QualType pointee_type (qual_type->getPointeeType());
4040 if (pointee_type->getPointeeCXXRecordDecl() != nullptr)
4041 return lldb::eLanguageTypeC_plus_plus;
4042 if (pointee_type->isObjCObjectOrInterfaceType())
4043 return lldb::eLanguageTypeObjC;
4044 if (pointee_type->isObjCClassType())
4045 return lldb::eLanguageTypeObjC;
4046 if (pointee_type.getTypePtr() == getASTContext()->ObjCBuiltinIdTy.getTypePtr())
4047 return lldb::eLanguageTypeObjC;
4048 }
4049 else
4050 {
4051 if (qual_type->isObjCObjectOrInterfaceType())
4052 return lldb::eLanguageTypeObjC;
4053 if (qual_type->getAsCXXRecordDecl())
4054 return lldb::eLanguageTypeC_plus_plus;
4055 switch (qual_type->getTypeClass())
4056 {
4057 default:
4058 break;
4059 case clang::Type::Builtin:
4060 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4061 {
4062 default:
4063 case clang::BuiltinType::Void:
4064 case clang::BuiltinType::Bool:
4065 case clang::BuiltinType::Char_U:
4066 case clang::BuiltinType::UChar:
4067 case clang::BuiltinType::WChar_U:
4068 case clang::BuiltinType::Char16:
4069 case clang::BuiltinType::Char32:
4070 case clang::BuiltinType::UShort:
4071 case clang::BuiltinType::UInt:
4072 case clang::BuiltinType::ULong:
4073 case clang::BuiltinType::ULongLong:
4074 case clang::BuiltinType::UInt128:
4075 case clang::BuiltinType::Char_S:
4076 case clang::BuiltinType::SChar:
4077 case clang::BuiltinType::WChar_S:
4078 case clang::BuiltinType::Short:
4079 case clang::BuiltinType::Int:
4080 case clang::BuiltinType::Long:
4081 case clang::BuiltinType::LongLong:
4082 case clang::BuiltinType::Int128:
4083 case clang::BuiltinType::Float:
4084 case clang::BuiltinType::Double:
4085 case clang::BuiltinType::LongDouble:
4086 break;
4087
4088 case clang::BuiltinType::NullPtr:
4089 return eLanguageTypeC_plus_plus;
4090
4091 case clang::BuiltinType::ObjCId:
4092 case clang::BuiltinType::ObjCClass:
4093 case clang::BuiltinType::ObjCSel:
4094 return eLanguageTypeObjC;
4095
4096 case clang::BuiltinType::Dependent:
4097 case clang::BuiltinType::Overload:
4098 case clang::BuiltinType::BoundMember:
4099 case clang::BuiltinType::UnknownAny:
4100 break;
4101 }
4102 break;
4103 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004104 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
Greg Claytond8d4a572015-08-11 21:38:15 +00004105 }
4106 }
4107 return lldb::eLanguageTypeC;
4108}
4109
4110lldb::TypeClass
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004111ClangASTContext::GetTypeClass (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004112{
4113 if (!type)
4114 return lldb::eTypeClassInvalid;
4115
4116 clang::QualType qual_type(GetQualType(type));
4117
4118 switch (qual_type->getTypeClass())
4119 {
4120 case clang::Type::UnaryTransform: break;
4121 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
4122 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
4123 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
4124 case clang::Type::VariableArray: return lldb::eTypeClassArray;
4125 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
4126 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
4127 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
4128 case clang::Type::ExtVector: return lldb::eTypeClassVector;
4129 case clang::Type::Vector: return lldb::eTypeClassVector;
4130 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
4131 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
4132 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
4133 case clang::Type::Pointer: return lldb::eTypeClassPointer;
4134 case clang::Type::LValueReference: return lldb::eTypeClassReference;
4135 case clang::Type::RValueReference: return lldb::eTypeClassReference;
4136 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
4137 case clang::Type::Complex:
4138 if (qual_type->isComplexType())
4139 return lldb::eTypeClassComplexFloat;
4140 else
4141 return lldb::eTypeClassComplexInteger;
4142 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
4143 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
4144 case clang::Type::Record:
4145 {
4146 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4147 const clang::RecordDecl *record_decl = record_type->getDecl();
4148 if (record_decl->isUnion())
4149 return lldb::eTypeClassUnion;
4150 else if (record_decl->isStruct())
4151 return lldb::eTypeClassStruct;
4152 else
4153 return lldb::eTypeClassClass;
4154 }
4155 break;
4156 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
4157 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
4158 case clang::Type::UnresolvedUsing: break;
4159 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004160 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeClass();
Enrico Granata36f51e42015-12-18 22:41:25 +00004161 case clang::Type::Auto:
4162 return CompilerType(getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00004163 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004164 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00004165
4166 case clang::Type::Attributed: break;
4167 case clang::Type::TemplateTypeParm: break;
4168 case clang::Type::SubstTemplateTypeParm: break;
4169 case clang::Type::SubstTemplateTypeParmPack:break;
Greg Claytond8d4a572015-08-11 21:38:15 +00004170 case clang::Type::InjectedClassName: break;
4171 case clang::Type::DependentName: break;
4172 case clang::Type::DependentTemplateSpecialization: break;
4173 case clang::Type::PackExpansion: break;
4174
4175 case clang::Type::TypeOfExpr: break;
4176 case clang::Type::TypeOf: break;
4177 case clang::Type::Decltype: break;
4178 case clang::Type::TemplateSpecialization: break;
4179 case clang::Type::Atomic: break;
Pavel Labath484f0a32016-01-12 08:51:28 +00004180 case clang::Type::Pipe: break;
Greg Claytond8d4a572015-08-11 21:38:15 +00004181
4182 // pointer type decayed from an array or function type.
4183 case clang::Type::Decayed: break;
4184 case clang::Type::Adjusted: break;
4185 }
4186 // We don't know hot to display this type...
4187 return lldb::eTypeClassOther;
4188
4189}
4190
4191unsigned
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004192ClangASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004193{
4194 if (type)
4195 return GetQualType(type).getQualifiers().getCVRQualifiers();
4196 return 0;
4197}
4198
4199//----------------------------------------------------------------------
4200// Creating related types
4201//----------------------------------------------------------------------
4202
Greg Claytona1e5dc82015-08-11 22:53:00 +00004203CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004204ClangASTContext::GetArrayElementType (lldb::opaque_compiler_type_t type, uint64_t *stride)
Greg Claytond8d4a572015-08-11 21:38:15 +00004205{
4206 if (type)
4207 {
4208 clang::QualType qual_type(GetCanonicalQualType(type));
4209
4210 const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
4211
4212 if (!array_eletype)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004213 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004214
Greg Claytona1e5dc82015-08-11 22:53:00 +00004215 CompilerType element_type (getASTContext(), array_eletype->getCanonicalTypeUnqualified());
Greg Claytond8d4a572015-08-11 21:38:15 +00004216
4217 // TODO: the real stride will be >= this value.. find the real one!
4218 if (stride)
4219 *stride = element_type.GetByteSize(nullptr);
4220
4221 return element_type;
4222
4223 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004224 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004225}
4226
Greg Claytona1e5dc82015-08-11 22:53:00 +00004227CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004228ClangASTContext::GetCanonicalType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004229{
4230 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004231 return CompilerType (getASTContext(), GetCanonicalQualType(type));
4232 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004233}
4234
4235static clang::QualType
4236GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
4237{
4238 if (qual_type->isPointerType())
4239 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
4240 else
4241 qual_type = qual_type.getUnqualifiedType();
4242 qual_type.removeLocalConst();
4243 qual_type.removeLocalRestrict();
4244 qual_type.removeLocalVolatile();
4245 return qual_type;
4246}
4247
Greg Claytona1e5dc82015-08-11 22:53:00 +00004248CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004249ClangASTContext::GetFullyUnqualifiedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004250{
4251 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004252 return CompilerType(getASTContext(), GetFullyUnqualifiedType_Impl(getASTContext(), GetQualType(type)));
4253 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004254}
4255
4256
4257int
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004258ClangASTContext::GetFunctionArgumentCount (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004259{
4260 if (type)
4261 {
4262 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
4263 if (func)
4264 return func->getNumParams();
4265 }
4266 return -1;
4267}
4268
Greg Claytona1e5dc82015-08-11 22:53:00 +00004269CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004270ClangASTContext::GetFunctionArgumentTypeAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004271{
4272 if (type)
4273 {
Greg Clayton8b8874e2015-12-17 00:58:41 +00004274 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004275 if (func)
4276 {
4277 const uint32_t num_args = func->getNumParams();
4278 if (idx < num_args)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004279 return CompilerType(getASTContext(), func->getParamType(idx));
Greg Claytond8d4a572015-08-11 21:38:15 +00004280 }
4281 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004282 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004283}
4284
Greg Claytona1e5dc82015-08-11 22:53:00 +00004285CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004286ClangASTContext::GetFunctionReturnType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004287{
4288 if (type)
4289 {
Greg Clayton8b8874e2015-12-17 00:58:41 +00004290 clang::QualType qual_type(GetQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004291 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
4292 if (func)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004293 return CompilerType(getASTContext(), func->getReturnType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004294 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004295 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004296}
4297
4298size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004299ClangASTContext::GetNumMemberFunctions (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004300{
4301 size_t num_functions = 0;
4302 if (type)
4303 {
4304 clang::QualType qual_type(GetCanonicalQualType(type));
4305 switch (qual_type->getTypeClass()) {
4306 case clang::Type::Record:
4307 if (GetCompleteQualType (getASTContext(), qual_type))
4308 {
4309 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4310 const clang::RecordDecl *record_decl = record_type->getDecl();
4311 assert(record_decl);
4312 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4313 if (cxx_record_decl)
4314 num_functions = std::distance(cxx_record_decl->method_begin(), cxx_record_decl->method_end());
4315 }
4316 break;
4317
4318 case clang::Type::ObjCObjectPointer:
4319 if (GetCompleteType(type))
4320 {
4321 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4322 if (objc_class_type)
4323 {
4324 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4325 if (class_interface_decl)
4326 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4327 }
4328 }
4329 break;
4330
4331 case clang::Type::ObjCObject:
4332 case clang::Type::ObjCInterface:
4333 if (GetCompleteType(type))
4334 {
4335 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4336 if (objc_class_type)
4337 {
4338 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4339 if (class_interface_decl)
4340 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4341 }
4342 }
4343 break;
4344
4345
4346 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004347 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumMemberFunctions();
Enrico Granata36f51e42015-12-18 22:41:25 +00004348
4349 case clang::Type::Auto:
4350 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004351
4352 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004353 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004354
4355 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004356 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004357
4358 default:
4359 break;
4360 }
4361 }
4362 return num_functions;
4363}
4364
4365TypeMemberFunctionImpl
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004366ClangASTContext::GetMemberFunctionAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004367{
Greg Claytonfe689042015-11-10 17:47:04 +00004368 std::string name;
Greg Claytond8d4a572015-08-11 21:38:15 +00004369 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
Greg Claytonfe689042015-11-10 17:47:04 +00004370 CompilerType clang_type;
4371 CompilerDecl clang_decl;
Greg Claytond8d4a572015-08-11 21:38:15 +00004372 if (type)
4373 {
4374 clang::QualType qual_type(GetCanonicalQualType(type));
4375 switch (qual_type->getTypeClass()) {
4376 case clang::Type::Record:
4377 if (GetCompleteQualType (getASTContext(), qual_type))
4378 {
4379 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4380 const clang::RecordDecl *record_decl = record_type->getDecl();
4381 assert(record_decl);
4382 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4383 if (cxx_record_decl)
4384 {
4385 auto method_iter = cxx_record_decl->method_begin();
4386 auto method_end = cxx_record_decl->method_end();
4387 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4388 {
4389 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004390 clang::CXXMethodDecl *cxx_method_decl = method_iter->getCanonicalDecl();
4391 if (cxx_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004392 {
Greg Claytonfe689042015-11-10 17:47:04 +00004393 name = cxx_method_decl->getDeclName().getAsString();
4394 if (cxx_method_decl->isStatic())
Greg Claytond8d4a572015-08-11 21:38:15 +00004395 kind = lldb::eMemberFunctionKindStaticMethod;
Greg Claytonfe689042015-11-10 17:47:04 +00004396 else if (llvm::isa<clang::CXXConstructorDecl>(cxx_method_decl))
Greg Claytond8d4a572015-08-11 21:38:15 +00004397 kind = lldb::eMemberFunctionKindConstructor;
Greg Claytonfe689042015-11-10 17:47:04 +00004398 else if (llvm::isa<clang::CXXDestructorDecl>(cxx_method_decl))
Greg Claytond8d4a572015-08-11 21:38:15 +00004399 kind = lldb::eMemberFunctionKindDestructor;
4400 else
4401 kind = lldb::eMemberFunctionKindInstanceMethod;
Greg Claytonfe689042015-11-10 17:47:04 +00004402 clang_type = CompilerType(this, cxx_method_decl->getType().getAsOpaquePtr());
4403 clang_decl = CompilerDecl(this, cxx_method_decl);
Greg Claytond8d4a572015-08-11 21:38:15 +00004404 }
4405 }
4406 }
4407 }
4408 break;
4409
4410 case clang::Type::ObjCObjectPointer:
4411 if (GetCompleteType(type))
4412 {
4413 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4414 if (objc_class_type)
4415 {
4416 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4417 if (class_interface_decl)
4418 {
4419 auto method_iter = class_interface_decl->meth_begin();
4420 auto method_end = class_interface_decl->meth_end();
4421 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4422 {
4423 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004424 clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
4425 if (objc_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004426 {
Greg Claytonfe689042015-11-10 17:47:04 +00004427 clang_decl = CompilerDecl(this, objc_method_decl);
4428 name = objc_method_decl->getSelector().getAsString();
4429 if (objc_method_decl->isClassMethod())
Greg Claytond8d4a572015-08-11 21:38:15 +00004430 kind = lldb::eMemberFunctionKindStaticMethod;
4431 else
4432 kind = lldb::eMemberFunctionKindInstanceMethod;
4433 }
4434 }
4435 }
4436 }
4437 }
4438 break;
4439
4440 case clang::Type::ObjCObject:
4441 case clang::Type::ObjCInterface:
4442 if (GetCompleteType(type))
4443 {
4444 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4445 if (objc_class_type)
4446 {
4447 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4448 if (class_interface_decl)
4449 {
4450 auto method_iter = class_interface_decl->meth_begin();
4451 auto method_end = class_interface_decl->meth_end();
4452 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4453 {
4454 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004455 clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
4456 if (objc_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004457 {
Greg Claytonfe689042015-11-10 17:47:04 +00004458 clang_decl = CompilerDecl(this, objc_method_decl);
4459 name = objc_method_decl->getSelector().getAsString();
4460 if (objc_method_decl->isClassMethod())
Greg Claytond8d4a572015-08-11 21:38:15 +00004461 kind = lldb::eMemberFunctionKindStaticMethod;
4462 else
4463 kind = lldb::eMemberFunctionKindInstanceMethod;
4464 }
4465 }
4466 }
4467 }
4468 }
4469 break;
4470
4471 case clang::Type::Typedef:
4472 return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx);
Enrico Granata36f51e42015-12-18 22:41:25 +00004473
4474 case clang::Type::Auto:
4475 return GetMemberFunctionAtIndex(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004476
4477 case clang::Type::Elaborated:
4478 return GetMemberFunctionAtIndex(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx);
4479
4480 case clang::Type::Paren:
4481 return GetMemberFunctionAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx);
4482
4483 default:
4484 break;
4485 }
4486 }
4487
4488 if (kind == eMemberFunctionKindUnknown)
4489 return TypeMemberFunctionImpl();
Greg Claytonfe689042015-11-10 17:47:04 +00004490 else
4491 return TypeMemberFunctionImpl(clang_type, clang_decl, name, kind);
Greg Claytond8d4a572015-08-11 21:38:15 +00004492}
4493
Greg Claytona1e5dc82015-08-11 22:53:00 +00004494CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004495ClangASTContext::GetNonReferenceType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004496{
4497 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004498 return CompilerType(getASTContext(), GetQualType(type).getNonReferenceType());
4499 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004500}
4501
Greg Claytona1e5dc82015-08-11 22:53:00 +00004502CompilerType
4503ClangASTContext::CreateTypedefType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00004504 const char *typedef_name,
Greg Clayton99558cc42015-08-24 23:46:31 +00004505 const CompilerDeclContext &compiler_decl_ctx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004506{
4507 if (type && typedef_name && typedef_name[0])
4508 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004509 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004510 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004511 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004512 clang::ASTContext* clang_ast = ast->getASTContext();
4513 clang::QualType qual_type (GetQualType(type));
Greg Clayton99558cc42015-08-24 23:46:31 +00004514
4515 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004516 if (decl_ctx == nullptr)
4517 decl_ctx = ast->getASTContext()->getTranslationUnitDecl();
Greg Clayton99558cc42015-08-24 23:46:31 +00004518
Greg Claytond8d4a572015-08-11 21:38:15 +00004519 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4520 decl_ctx,
4521 clang::SourceLocation(),
4522 clang::SourceLocation(),
4523 &clang_ast->Idents.get(typedef_name),
4524 clang_ast->getTrivialTypeSourceInfo(qual_type));
4525
4526 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4527
4528 // Get a uniqued clang::QualType for the typedef decl type
Greg Claytona1e5dc82015-08-11 22:53:00 +00004529 return CompilerType (clang_ast, clang_ast->getTypedefType (decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00004530 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004531 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004532
4533}
4534
Greg Claytona1e5dc82015-08-11 22:53:00 +00004535CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004536ClangASTContext::GetPointeeType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004537{
4538 if (type)
4539 {
4540 clang::QualType qual_type(GetQualType(type));
Greg Claytona1e5dc82015-08-11 22:53:00 +00004541 return CompilerType (getASTContext(), qual_type.getTypePtr()->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004542 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004543 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004544}
4545
Greg Claytona1e5dc82015-08-11 22:53:00 +00004546CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004547ClangASTContext::GetPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004548{
4549 if (type)
4550 {
4551 clang::QualType qual_type (GetQualType(type));
4552
4553 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4554 switch (type_class)
4555 {
4556 case clang::Type::ObjCObject:
4557 case clang::Type::ObjCInterface:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004558 return CompilerType(getASTContext(), getASTContext()->getObjCObjectPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004559
4560 default:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004561 return CompilerType(getASTContext(), getASTContext()->getPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004562 }
4563 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004564 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004565}
4566
Greg Clayton56939cb2015-09-17 22:23:34 +00004567
4568CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004569ClangASTContext::GetLValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004570{
4571 if (type)
4572 return CompilerType(this, getASTContext()->getLValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4573 else
4574 return CompilerType();
4575}
4576
4577CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004578ClangASTContext::GetRValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004579{
4580 if (type)
4581 return CompilerType(this, getASTContext()->getRValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4582 else
4583 return CompilerType();
4584}
4585
4586CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004587ClangASTContext::AddConstModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004588{
4589 if (type)
4590 {
4591 clang::QualType result(GetQualType(type));
4592 result.addConst();
4593 return CompilerType (this, result.getAsOpaquePtr());
4594 }
4595 return CompilerType();
4596}
4597
4598CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004599ClangASTContext::AddVolatileModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004600{
4601 if (type)
4602 {
4603 clang::QualType result(GetQualType(type));
4604 result.addVolatile();
4605 return CompilerType (this, result.getAsOpaquePtr());
4606 }
4607 return CompilerType();
4608
4609}
4610
4611CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004612ClangASTContext::AddRestrictModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004613{
4614 if (type)
4615 {
4616 clang::QualType result(GetQualType(type));
4617 result.addRestrict();
4618 return CompilerType (this, result.getAsOpaquePtr());
4619 }
4620 return CompilerType();
4621
4622}
4623
4624CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004625ClangASTContext::CreateTypedef (lldb::opaque_compiler_type_t type, const char *typedef_name, const CompilerDeclContext &compiler_decl_ctx)
Greg Clayton56939cb2015-09-17 22:23:34 +00004626{
4627 if (type)
4628 {
4629 clang::ASTContext* clang_ast = getASTContext();
4630 clang::QualType qual_type (GetQualType(type));
4631
4632 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
4633 if (decl_ctx == nullptr)
4634 decl_ctx = getASTContext()->getTranslationUnitDecl();
4635
4636 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4637 decl_ctx,
4638 clang::SourceLocation(),
4639 clang::SourceLocation(),
4640 &clang_ast->Idents.get(typedef_name),
4641 clang_ast->getTrivialTypeSourceInfo(qual_type));
4642
Ewan Crawford27fc7a72016-03-15 09:50:16 +00004643 clang::TagDecl *tdecl = nullptr;
4644 if (!qual_type.isNull())
4645 {
4646 if (const clang::RecordType *rt = qual_type->getAs<clang::RecordType>())
4647 tdecl = rt->getDecl();
4648 if (const clang::EnumType *et = qual_type->getAs<clang::EnumType>())
4649 tdecl = et->getDecl();
4650 }
4651
4652 // Check whether this declaration is an anonymous struct, union, or enum, hidden behind a typedef. If so, we
4653 // try to check whether we have a typedef tag to attach to the original record declaration
4654 if (tdecl && !tdecl->getIdentifier() && !tdecl->getTypedefNameForAnonDecl())
4655 tdecl->setTypedefNameForAnonDecl(decl);
4656
Greg Clayton56939cb2015-09-17 22:23:34 +00004657 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4658
4659 // Get a uniqued clang::QualType for the typedef decl type
4660 return CompilerType (this, clang_ast->getTypedefType (decl).getAsOpaquePtr());
4661
4662 }
4663 return CompilerType();
4664
4665}
4666
Greg Claytona1e5dc82015-08-11 22:53:00 +00004667CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004668ClangASTContext::GetTypedefedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004669{
4670 if (type)
4671 {
4672 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4673 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004674 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004675 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004676 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004677}
4678
Greg Claytona1e5dc82015-08-11 22:53:00 +00004679CompilerType
4680ClangASTContext::RemoveFastQualifiers (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004681{
Ryan Brown57bee1e2015-09-14 22:45:11 +00004682 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00004683 {
4684 clang::QualType qual_type(GetQualType(type));
4685 qual_type.getQualifiers().removeFastQualifiers();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004686 return CompilerType (type.GetTypeSystem(), qual_type.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004687 }
4688 return type;
4689}
4690
4691
4692//----------------------------------------------------------------------
4693// Create related types using the current type's AST
4694//----------------------------------------------------------------------
4695
Greg Claytona1e5dc82015-08-11 22:53:00 +00004696CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00004697ClangASTContext::GetBasicTypeFromAST (lldb::BasicType basic_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004698{
Greg Clayton99558cc42015-08-24 23:46:31 +00004699 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004700}
4701//----------------------------------------------------------------------
4702// Exploring the type
4703//----------------------------------------------------------------------
4704
4705uint64_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004706ClangASTContext::GetBitSize (lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope)
Greg Claytond8d4a572015-08-11 21:38:15 +00004707{
4708 if (GetCompleteType (type))
4709 {
4710 clang::QualType qual_type(GetCanonicalQualType(type));
4711 switch (qual_type->getTypeClass())
4712 {
4713 case clang::Type::ObjCInterface:
4714 case clang::Type::ObjCObject:
4715 {
4716 ExecutionContext exe_ctx (exe_scope);
4717 Process *process = exe_ctx.GetProcessPtr();
4718 if (process)
4719 {
4720 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4721 if (objc_runtime)
4722 {
4723 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004724 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00004725 return bit_size;
4726 }
4727 }
4728 else
4729 {
4730 static bool g_printed = false;
4731 if (!g_printed)
4732 {
4733 StreamString s;
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00004734 DumpTypeDescription(type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00004735
4736 llvm::outs() << "warning: trying to determine the size of type ";
4737 llvm::outs() << s.GetString() << "\n";
4738 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
4739 llvm::outs() << "backtrace:\n";
4740 llvm::sys::PrintStackTrace(llvm::outs());
4741 llvm::outs() << "\n";
4742 g_printed = true;
4743 }
4744 }
4745 }
Jason Molenda62e06812016-02-16 04:14:33 +00004746 LLVM_FALLTHROUGH;
Greg Claytond8d4a572015-08-11 21:38:15 +00004747 default:
4748 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
4749 if (bit_size == 0)
4750 {
4751 if (qual_type->isIncompleteArrayType())
4752 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
4753 }
4754 if (qual_type->isObjCObjectOrInterfaceType())
4755 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
4756 return bit_size;
4757 }
4758 }
4759 return 0;
4760}
4761
4762size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004763ClangASTContext::GetTypeBitAlign (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004764{
4765 if (GetCompleteType(type))
4766 return getASTContext()->getTypeAlign(GetQualType(type));
4767 return 0;
4768}
4769
4770
4771lldb::Encoding
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004772ClangASTContext::GetEncoding (lldb::opaque_compiler_type_t type, uint64_t &count)
Greg Claytond8d4a572015-08-11 21:38:15 +00004773{
4774 if (!type)
4775 return lldb::eEncodingInvalid;
4776
4777 count = 1;
4778 clang::QualType qual_type(GetCanonicalQualType(type));
4779
4780 switch (qual_type->getTypeClass())
4781 {
4782 case clang::Type::UnaryTransform:
4783 break;
4784
4785 case clang::Type::FunctionNoProto:
4786 case clang::Type::FunctionProto:
4787 break;
4788
4789 case clang::Type::IncompleteArray:
4790 case clang::Type::VariableArray:
4791 break;
4792
4793 case clang::Type::ConstantArray:
4794 break;
4795
4796 case clang::Type::ExtVector:
4797 case clang::Type::Vector:
4798 // TODO: Set this to more than one???
4799 break;
4800
4801 case clang::Type::Builtin:
4802 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4803 {
Greg Claytond8d4a572015-08-11 21:38:15 +00004804 case clang::BuiltinType::Void:
4805 break;
4806
4807 case clang::BuiltinType::Bool:
4808 case clang::BuiltinType::Char_S:
4809 case clang::BuiltinType::SChar:
4810 case clang::BuiltinType::WChar_S:
4811 case clang::BuiltinType::Char16:
4812 case clang::BuiltinType::Char32:
4813 case clang::BuiltinType::Short:
4814 case clang::BuiltinType::Int:
4815 case clang::BuiltinType::Long:
4816 case clang::BuiltinType::LongLong:
4817 case clang::BuiltinType::Int128: return lldb::eEncodingSint;
4818
4819 case clang::BuiltinType::Char_U:
4820 case clang::BuiltinType::UChar:
4821 case clang::BuiltinType::WChar_U:
4822 case clang::BuiltinType::UShort:
4823 case clang::BuiltinType::UInt:
4824 case clang::BuiltinType::ULong:
4825 case clang::BuiltinType::ULongLong:
4826 case clang::BuiltinType::UInt128: return lldb::eEncodingUint;
4827
Greg Claytondee40e72015-11-03 23:23:22 +00004828 case clang::BuiltinType::Half:
Greg Claytond8d4a572015-08-11 21:38:15 +00004829 case clang::BuiltinType::Float:
4830 case clang::BuiltinType::Double:
4831 case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
4832
4833 case clang::BuiltinType::ObjCClass:
4834 case clang::BuiltinType::ObjCId:
4835 case clang::BuiltinType::ObjCSel: return lldb::eEncodingUint;
4836
4837 case clang::BuiltinType::NullPtr: return lldb::eEncodingUint;
4838
4839 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4840 case clang::BuiltinType::Kind::BoundMember:
4841 case clang::BuiltinType::Kind::BuiltinFn:
4842 case clang::BuiltinType::Kind::Dependent:
Ed Mastec6dd6512015-09-23 18:32:34 +00004843 case clang::BuiltinType::Kind::OCLClkEvent:
Greg Claytond8d4a572015-08-11 21:38:15 +00004844 case clang::BuiltinType::Kind::OCLEvent:
4845 case clang::BuiltinType::Kind::OCLImage1d:
4846 case clang::BuiltinType::Kind::OCLImage1dArray:
4847 case clang::BuiltinType::Kind::OCLImage1dBuffer:
4848 case clang::BuiltinType::Kind::OCLImage2d:
4849 case clang::BuiltinType::Kind::OCLImage2dArray:
Ed Mastec6dd6512015-09-23 18:32:34 +00004850 case clang::BuiltinType::Kind::OCLImage2dArrayDepth:
4851 case clang::BuiltinType::Kind::OCLImage2dArrayMSAA:
4852 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepth:
4853 case clang::BuiltinType::Kind::OCLImage2dDepth:
4854 case clang::BuiltinType::Kind::OCLImage2dMSAA:
4855 case clang::BuiltinType::Kind::OCLImage2dMSAADepth:
Greg Claytond8d4a572015-08-11 21:38:15 +00004856 case clang::BuiltinType::Kind::OCLImage3d:
Ed Mastec6dd6512015-09-23 18:32:34 +00004857 case clang::BuiltinType::Kind::OCLQueue:
4858 case clang::BuiltinType::Kind::OCLNDRange:
4859 case clang::BuiltinType::Kind::OCLReserveID:
Greg Claytond8d4a572015-08-11 21:38:15 +00004860 case clang::BuiltinType::Kind::OCLSampler:
Ed Mastec6dd6512015-09-23 18:32:34 +00004861 case clang::BuiltinType::Kind::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00004862 case clang::BuiltinType::Kind::Overload:
4863 case clang::BuiltinType::Kind::PseudoObject:
4864 case clang::BuiltinType::Kind::UnknownAny:
4865 break;
4866 }
4867 break;
4868 // All pointer types are represented as unsigned integer encodings.
4869 // We may nee to add a eEncodingPointer if we ever need to know the
4870 // difference
4871 case clang::Type::ObjCObjectPointer:
4872 case clang::Type::BlockPointer:
4873 case clang::Type::Pointer:
4874 case clang::Type::LValueReference:
4875 case clang::Type::RValueReference:
4876 case clang::Type::MemberPointer: return lldb::eEncodingUint;
4877 case clang::Type::Complex:
4878 {
4879 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4880 if (qual_type->isComplexType())
4881 encoding = lldb::eEncodingIEEE754;
4882 else
4883 {
4884 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
4885 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004886 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004887 else
4888 encoding = lldb::eEncodingSint;
4889 }
4890 count = 2;
4891 return encoding;
4892 }
4893
4894 case clang::Type::ObjCInterface: break;
4895 case clang::Type::Record: break;
4896 case clang::Type::Enum: return lldb::eEncodingSint;
4897 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004898 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Enrico Granata36f51e42015-12-18 22:41:25 +00004899
4900 case clang::Type::Auto:
4901 return CompilerType(getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004902
4903 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004904 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004905
4906 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004907 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004908
4909 case clang::Type::DependentSizedArray:
4910 case clang::Type::DependentSizedExtVector:
4911 case clang::Type::UnresolvedUsing:
4912 case clang::Type::Attributed:
4913 case clang::Type::TemplateTypeParm:
4914 case clang::Type::SubstTemplateTypeParm:
4915 case clang::Type::SubstTemplateTypeParmPack:
Greg Claytond8d4a572015-08-11 21:38:15 +00004916 case clang::Type::InjectedClassName:
4917 case clang::Type::DependentName:
4918 case clang::Type::DependentTemplateSpecialization:
4919 case clang::Type::PackExpansion:
4920 case clang::Type::ObjCObject:
4921
4922 case clang::Type::TypeOfExpr:
4923 case clang::Type::TypeOf:
4924 case clang::Type::Decltype:
4925 case clang::Type::TemplateSpecialization:
4926 case clang::Type::Atomic:
4927 case clang::Type::Adjusted:
Pavel Labath484f0a32016-01-12 08:51:28 +00004928 case clang::Type::Pipe:
Greg Claytond8d4a572015-08-11 21:38:15 +00004929 break;
4930
4931 // pointer type decayed from an array or function type.
4932 case clang::Type::Decayed:
4933 break;
4934 }
4935 count = 0;
4936 return lldb::eEncodingInvalid;
4937}
4938
4939lldb::Format
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004940ClangASTContext::GetFormat (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004941{
4942 if (!type)
4943 return lldb::eFormatDefault;
4944
4945 clang::QualType qual_type(GetCanonicalQualType(type));
4946
4947 switch (qual_type->getTypeClass())
4948 {
4949 case clang::Type::UnaryTransform:
4950 break;
4951
4952 case clang::Type::FunctionNoProto:
4953 case clang::Type::FunctionProto:
4954 break;
4955
4956 case clang::Type::IncompleteArray:
4957 case clang::Type::VariableArray:
4958 break;
4959
4960 case clang::Type::ConstantArray:
4961 return lldb::eFormatVoid; // no value
4962
4963 case clang::Type::ExtVector:
4964 case clang::Type::Vector:
4965 break;
4966
4967 case clang::Type::Builtin:
4968 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4969 {
4970 //default: assert(0 && "Unknown builtin type!");
4971 case clang::BuiltinType::UnknownAny:
4972 case clang::BuiltinType::Void:
4973 case clang::BuiltinType::BoundMember:
4974 break;
4975
4976 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
4977 case clang::BuiltinType::Char_S:
4978 case clang::BuiltinType::SChar:
4979 case clang::BuiltinType::WChar_S:
4980 case clang::BuiltinType::Char_U:
4981 case clang::BuiltinType::UChar:
4982 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
4983 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
4984 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
4985 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
4986 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
4987 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
4988 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
4989 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
4990 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
4991 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
4992 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
4993 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
4994 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
Greg Claytondee40e72015-11-03 23:23:22 +00004995 case clang::BuiltinType::Half:
4996 case clang::BuiltinType::Float:
4997 case clang::BuiltinType::Double:
Greg Claytond8d4a572015-08-11 21:38:15 +00004998 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
Zachary Turnerdd07e002015-09-16 18:08:45 +00004999 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00005000 return lldb::eFormatHex;
5001 }
5002 break;
5003 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
5004 case clang::Type::BlockPointer: return lldb::eFormatHex;
5005 case clang::Type::Pointer: return lldb::eFormatHex;
5006 case clang::Type::LValueReference:
5007 case clang::Type::RValueReference: return lldb::eFormatHex;
5008 case clang::Type::MemberPointer: break;
5009 case clang::Type::Complex:
5010 {
5011 if (qual_type->isComplexType())
5012 return lldb::eFormatComplex;
5013 else
5014 return lldb::eFormatComplexInteger;
5015 }
5016 case clang::Type::ObjCInterface: break;
5017 case clang::Type::Record: break;
5018 case clang::Type::Enum: return lldb::eFormatEnum;
5019 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005020 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005021 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005022 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005023 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005024 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005025 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005026 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005027 case clang::Type::DependentSizedArray:
5028 case clang::Type::DependentSizedExtVector:
5029 case clang::Type::UnresolvedUsing:
5030 case clang::Type::Attributed:
5031 case clang::Type::TemplateTypeParm:
5032 case clang::Type::SubstTemplateTypeParm:
5033 case clang::Type::SubstTemplateTypeParmPack:
5034 case clang::Type::InjectedClassName:
5035 case clang::Type::DependentName:
5036 case clang::Type::DependentTemplateSpecialization:
5037 case clang::Type::PackExpansion:
5038 case clang::Type::ObjCObject:
5039
5040 case clang::Type::TypeOfExpr:
5041 case clang::Type::TypeOf:
5042 case clang::Type::Decltype:
5043 case clang::Type::TemplateSpecialization:
5044 case clang::Type::Atomic:
5045 case clang::Type::Adjusted:
Pavel Labath484f0a32016-01-12 08:51:28 +00005046 case clang::Type::Pipe:
Greg Claytond8d4a572015-08-11 21:38:15 +00005047 break;
5048
5049 // pointer type decayed from an array or function type.
5050 case clang::Type::Decayed:
5051 break;
5052 }
5053 // We don't know hot to display this type...
5054 return lldb::eFormatBytes;
5055}
5056
5057static bool
5058ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
5059{
5060 while (class_interface_decl)
5061 {
5062 if (class_interface_decl->ivar_size() > 0)
5063 return true;
5064
5065 if (check_superclass)
5066 class_interface_decl = class_interface_decl->getSuperClass();
5067 else
5068 break;
5069 }
5070 return false;
5071}
5072
5073uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005074ClangASTContext::GetNumChildren (lldb::opaque_compiler_type_t type, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00005075{
5076 if (!type)
5077 return 0;
5078
5079 uint32_t num_children = 0;
5080 clang::QualType qual_type(GetQualType(type));
5081 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5082 switch (type_class)
5083 {
5084 case clang::Type::Builtin:
5085 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5086 {
5087 case clang::BuiltinType::ObjCId: // child is Class
5088 case clang::BuiltinType::ObjCClass: // child is Class
5089 num_children = 1;
5090 break;
5091
5092 default:
5093 break;
5094 }
5095 break;
5096
5097 case clang::Type::Complex: return 0;
5098
5099 case clang::Type::Record:
5100 if (GetCompleteQualType (getASTContext(), qual_type))
5101 {
5102 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5103 const clang::RecordDecl *record_decl = record_type->getDecl();
5104 assert(record_decl);
5105 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5106 if (cxx_record_decl)
5107 {
5108 if (omit_empty_base_classes)
5109 {
5110 // Check each base classes to see if it or any of its
5111 // base classes contain any fields. This can help
5112 // limit the noise in variable views by not having to
5113 // show base classes that contain no members.
5114 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5115 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5116 base_class != base_class_end;
5117 ++base_class)
5118 {
5119 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5120
5121 // Skip empty base classes
5122 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5123 continue;
5124
5125 num_children++;
5126 }
5127 }
5128 else
5129 {
5130 // Include all base classes
5131 num_children += cxx_record_decl->getNumBases();
5132 }
5133
5134 }
5135 clang::RecordDecl::field_iterator field, field_end;
5136 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5137 ++num_children;
5138 }
5139 break;
5140
5141 case clang::Type::ObjCObject:
5142 case clang::Type::ObjCInterface:
5143 if (GetCompleteQualType (getASTContext(), qual_type))
5144 {
5145 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5146 assert (objc_class_type);
5147 if (objc_class_type)
5148 {
5149 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5150
5151 if (class_interface_decl)
5152 {
5153
5154 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5155 if (superclass_interface_decl)
5156 {
5157 if (omit_empty_base_classes)
5158 {
5159 if (ObjCDeclHasIVars (superclass_interface_decl, true))
5160 ++num_children;
5161 }
5162 else
5163 ++num_children;
5164 }
5165
5166 num_children += class_interface_decl->ivar_size();
5167 }
5168 }
5169 }
5170 break;
5171
5172 case clang::Type::ObjCObjectPointer:
5173 {
5174 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
5175 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005176 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005177 // If this type points to a simple type, then it has 1 child
5178 if (num_pointee_children == 0)
5179 num_children = 1;
5180 else
5181 num_children = num_pointee_children;
5182 }
5183 break;
5184
5185 case clang::Type::Vector:
5186 case clang::Type::ExtVector:
5187 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
5188 break;
5189
5190 case clang::Type::ConstantArray:
5191 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
5192 break;
5193
5194 case clang::Type::Pointer:
5195 {
5196 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
5197 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00005198 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005199 if (num_pointee_children == 0)
5200 {
5201 // We have a pointer to a pointee type that claims it has no children.
5202 // We will want to look at
5203 num_children = GetNumPointeeChildren (pointee_type);
5204 }
5205 else
5206 num_children = num_pointee_children;
5207 }
5208 break;
5209
5210 case clang::Type::LValueReference:
5211 case clang::Type::RValueReference:
5212 {
5213 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
5214 clang::QualType pointee_type = reference_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005215 uint32_t num_pointee_children = CompilerType (getASTContext(), pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005216 // If this type points to a simple type, then it has 1 child
5217 if (num_pointee_children == 0)
5218 num_children = 1;
5219 else
5220 num_children = num_pointee_children;
5221 }
5222 break;
5223
5224
5225 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005226 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005227 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00005228
5229 case clang::Type::Auto:
5230 num_children = CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumChildren (omit_empty_base_classes);
5231 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00005232
5233 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005234 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005235 break;
5236
5237 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005238 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005239 break;
5240 default:
5241 break;
5242 }
5243 return num_children;
5244}
5245
Greg Clayton56939cb2015-09-17 22:23:34 +00005246CompilerType
5247ClangASTContext::GetBuiltinTypeByName (const ConstString &name)
5248{
5249 return GetBasicType (GetBasicTypeEnumeration (name));
5250}
5251
Greg Claytond8d4a572015-08-11 21:38:15 +00005252lldb::BasicType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005253ClangASTContext::GetBasicTypeEnumeration (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005254{
5255 if (type)
5256 {
5257 clang::QualType qual_type(GetQualType(type));
5258 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5259 if (type_class == clang::Type::Builtin)
5260 {
5261 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5262 {
5263 case clang::BuiltinType::Void: return eBasicTypeVoid;
5264 case clang::BuiltinType::Bool: return eBasicTypeBool;
5265 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
5266 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
5267 case clang::BuiltinType::Char16: return eBasicTypeChar16;
5268 case clang::BuiltinType::Char32: return eBasicTypeChar32;
5269 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
5270 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
5271 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
5272 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
5273 case clang::BuiltinType::Short: return eBasicTypeShort;
5274 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
5275 case clang::BuiltinType::Int: return eBasicTypeInt;
5276 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
5277 case clang::BuiltinType::Long: return eBasicTypeLong;
5278 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
5279 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
5280 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
5281 case clang::BuiltinType::Int128: return eBasicTypeInt128;
5282 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
5283
5284 case clang::BuiltinType::Half: return eBasicTypeHalf;
5285 case clang::BuiltinType::Float: return eBasicTypeFloat;
5286 case clang::BuiltinType::Double: return eBasicTypeDouble;
5287 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
5288
5289 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
5290 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
5291 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
5292 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005293 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00005294 return eBasicTypeOther;
5295 }
5296 }
5297 }
5298 return eBasicTypeInvalid;
5299}
5300
Greg Clayton99558cc42015-08-24 23:46:31 +00005301void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005302ClangASTContext::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 +00005303{
5304 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
5305 if (enum_type)
5306 {
5307 const clang::EnumDecl *enum_decl = enum_type->getDecl();
5308 if (enum_decl)
5309 {
5310 CompilerType integer_type(this, enum_decl->getIntegerType().getAsOpaquePtr());
5311
5312 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
5313 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
5314 {
5315 ConstString name(enum_pos->getNameAsString().c_str());
5316 if (!callback (integer_type, name, enum_pos->getInitVal()))
5317 break;
5318 }
5319 }
5320 }
5321}
5322
Greg Claytond8d4a572015-08-11 21:38:15 +00005323
5324#pragma mark Aggregate Types
5325
5326uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005327ClangASTContext::GetNumFields (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005328{
5329 if (!type)
5330 return 0;
5331
5332 uint32_t count = 0;
5333 clang::QualType qual_type(GetCanonicalQualType(type));
5334 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5335 switch (type_class)
5336 {
5337 case clang::Type::Record:
5338 if (GetCompleteType(type))
5339 {
5340 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
5341 if (record_type)
5342 {
5343 clang::RecordDecl *record_decl = record_type->getDecl();
5344 if (record_decl)
5345 {
5346 uint32_t field_idx = 0;
5347 clang::RecordDecl::field_iterator field, field_end;
5348 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5349 ++field_idx;
5350 count = field_idx;
5351 }
5352 }
5353 }
5354 break;
5355
5356 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005357 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005358 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00005359
5360 case clang::Type::Auto:
5361 count = CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumFields();
5362 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00005363
5364 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005365 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005366 break;
5367
5368 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005369 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005370 break;
5371
5372 case clang::Type::ObjCObjectPointer:
5373 if (GetCompleteType(type))
5374 {
5375 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5376 if (objc_class_type)
5377 {
5378 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
5379
5380 if (class_interface_decl)
5381 count = class_interface_decl->ivar_size();
5382 }
5383 }
5384 break;
5385
5386 case clang::Type::ObjCObject:
5387 case clang::Type::ObjCInterface:
5388 if (GetCompleteType(type))
5389 {
5390 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5391 if (objc_class_type)
5392 {
5393 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5394
5395 if (class_interface_decl)
5396 count = class_interface_decl->ivar_size();
5397 }
5398 }
5399 break;
5400
5401 default:
5402 break;
5403 }
5404 return count;
5405}
5406
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005407static lldb::opaque_compiler_type_t
Greg Claytond8d4a572015-08-11 21:38:15 +00005408GetObjCFieldAtIndex (clang::ASTContext *ast,
5409 clang::ObjCInterfaceDecl *class_interface_decl,
5410 size_t idx,
5411 std::string& name,
5412 uint64_t *bit_offset_ptr,
5413 uint32_t *bitfield_bit_size_ptr,
5414 bool *is_bitfield_ptr)
5415{
5416 if (class_interface_decl)
5417 {
5418 if (idx < (class_interface_decl->ivar_size()))
5419 {
5420 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5421 uint32_t ivar_idx = 0;
5422
5423 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
5424 {
5425 if (ivar_idx == idx)
5426 {
5427 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5428
5429 clang::QualType ivar_qual_type(ivar_decl->getType());
5430
5431 name.assign(ivar_decl->getNameAsString());
5432
5433 if (bit_offset_ptr)
5434 {
5435 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
5436 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
5437 }
5438
5439 const bool is_bitfield = ivar_pos->isBitField();
5440
5441 if (bitfield_bit_size_ptr)
5442 {
5443 *bitfield_bit_size_ptr = 0;
5444
5445 if (is_bitfield && ast)
5446 {
5447 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
5448 llvm::APSInt bitfield_apsint;
5449 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
5450 {
5451 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5452 }
5453 }
5454 }
5455 if (is_bitfield_ptr)
5456 *is_bitfield_ptr = is_bitfield;
5457
5458 return ivar_qual_type.getAsOpaquePtr();
5459 }
5460 }
5461 }
5462 }
5463 return nullptr;
5464}
5465
Greg Claytona1e5dc82015-08-11 22:53:00 +00005466CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005467ClangASTContext::GetFieldAtIndex (lldb::opaque_compiler_type_t type, size_t idx,
Greg Claytond8d4a572015-08-11 21:38:15 +00005468 std::string& name,
5469 uint64_t *bit_offset_ptr,
5470 uint32_t *bitfield_bit_size_ptr,
5471 bool *is_bitfield_ptr)
5472{
5473 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005474 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005475
5476 clang::QualType qual_type(GetCanonicalQualType(type));
5477 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5478 switch (type_class)
5479 {
5480 case clang::Type::Record:
5481 if (GetCompleteType(type))
5482 {
5483 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5484 const clang::RecordDecl *record_decl = record_type->getDecl();
5485 uint32_t field_idx = 0;
5486 clang::RecordDecl::field_iterator field, field_end;
5487 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
5488 {
5489 if (idx == field_idx)
5490 {
5491 // Print the member type if requested
5492 // Print the member name and equal sign
5493 name.assign(field->getNameAsString());
5494
5495 // Figure out the type byte size (field_type_info.first) and
5496 // alignment (field_type_info.second) from the AST context.
5497 if (bit_offset_ptr)
5498 {
5499 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5500 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5501 }
5502
5503 const bool is_bitfield = field->isBitField();
5504
5505 if (bitfield_bit_size_ptr)
5506 {
5507 *bitfield_bit_size_ptr = 0;
5508
5509 if (is_bitfield)
5510 {
5511 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5512 llvm::APSInt bitfield_apsint;
5513 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5514 {
5515 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5516 }
5517 }
5518 }
5519 if (is_bitfield_ptr)
5520 *is_bitfield_ptr = is_bitfield;
5521
Greg Claytona1e5dc82015-08-11 22:53:00 +00005522 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005523 }
5524 }
5525 }
5526 break;
5527
5528 case clang::Type::ObjCObjectPointer:
5529 if (GetCompleteType(type))
5530 {
5531 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5532 if (objc_class_type)
5533 {
5534 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005535 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 +00005536 }
5537 }
5538 break;
5539
5540 case clang::Type::ObjCObject:
5541 case clang::Type::ObjCInterface:
5542 if (GetCompleteType(type))
5543 {
5544 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5545 assert (objc_class_type);
5546 if (objc_class_type)
5547 {
5548 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005549 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 +00005550 }
5551 }
5552 break;
5553
5554
5555 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005556 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005557 GetFieldAtIndex (idx,
5558 name,
5559 bit_offset_ptr,
5560 bitfield_bit_size_ptr,
5561 is_bitfield_ptr);
5562
Enrico Granata36f51e42015-12-18 22:41:25 +00005563 case clang::Type::Auto:
5564 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).
5565 GetFieldAtIndex (idx,
5566 name,
5567 bit_offset_ptr,
5568 bitfield_bit_size_ptr,
5569 is_bitfield_ptr);
5570
Greg Claytond8d4a572015-08-11 21:38:15 +00005571 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005572 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005573 GetFieldAtIndex (idx,
5574 name,
5575 bit_offset_ptr,
5576 bitfield_bit_size_ptr,
5577 is_bitfield_ptr);
5578
5579 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005580 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005581 GetFieldAtIndex (idx,
5582 name,
5583 bit_offset_ptr,
5584 bitfield_bit_size_ptr,
5585 is_bitfield_ptr);
5586
5587 default:
5588 break;
5589 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005590 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005591}
5592
Greg Clayton99558cc42015-08-24 23:46:31 +00005593uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005594ClangASTContext::GetNumDirectBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005595{
5596 uint32_t count = 0;
5597 clang::QualType qual_type(GetCanonicalQualType(type));
5598 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5599 switch (type_class)
5600 {
5601 case clang::Type::Record:
5602 if (GetCompleteType(type))
5603 {
5604 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5605 if (cxx_record_decl)
5606 count = cxx_record_decl->getNumBases();
5607 }
5608 break;
5609
5610 case clang::Type::ObjCObjectPointer:
5611 count = GetPointeeType(type).GetNumDirectBaseClasses();
5612 break;
5613
5614 case clang::Type::ObjCObject:
5615 if (GetCompleteType(type))
5616 {
5617 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5618 if (objc_class_type)
5619 {
5620 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5621
5622 if (class_interface_decl && class_interface_decl->getSuperClass())
5623 count = 1;
5624 }
5625 }
5626 break;
5627 case clang::Type::ObjCInterface:
5628 if (GetCompleteType(type))
5629 {
5630 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5631 if (objc_interface_type)
5632 {
5633 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5634
5635 if (class_interface_decl && class_interface_decl->getSuperClass())
5636 count = 1;
5637 }
5638 }
5639 break;
5640
5641
5642 case clang::Type::Typedef:
5643 count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5644 break;
5645
Enrico Granata36f51e42015-12-18 22:41:25 +00005646 case clang::Type::Auto:
5647 count = GetNumDirectBaseClasses(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
5648 break;
5649
Greg Clayton99558cc42015-08-24 23:46:31 +00005650 case clang::Type::Elaborated:
5651 count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5652 break;
5653
5654 case clang::Type::Paren:
5655 return GetNumDirectBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5656
5657 default:
5658 break;
5659 }
5660 return count;
5661
5662}
5663
5664uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005665ClangASTContext::GetNumVirtualBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005666{
5667 uint32_t count = 0;
5668 clang::QualType qual_type(GetCanonicalQualType(type));
5669 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5670 switch (type_class)
5671 {
5672 case clang::Type::Record:
5673 if (GetCompleteType(type))
5674 {
5675 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5676 if (cxx_record_decl)
5677 count = cxx_record_decl->getNumVBases();
5678 }
5679 break;
5680
5681 case clang::Type::Typedef:
5682 count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5683 break;
5684
Enrico Granata36f51e42015-12-18 22:41:25 +00005685 case clang::Type::Auto:
5686 count = GetNumVirtualBaseClasses(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
5687 break;
5688
Greg Clayton99558cc42015-08-24 23:46:31 +00005689 case clang::Type::Elaborated:
5690 count = GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5691 break;
5692
5693 case clang::Type::Paren:
5694 count = GetNumVirtualBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5695 break;
5696
5697 default:
5698 break;
5699 }
5700 return count;
5701
5702}
5703
5704CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005705ClangASTContext::GetDirectBaseClassAtIndex (lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00005706{
5707 clang::QualType qual_type(GetCanonicalQualType(type));
5708 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5709 switch (type_class)
5710 {
5711 case clang::Type::Record:
5712 if (GetCompleteType(type))
5713 {
5714 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5715 if (cxx_record_decl)
5716 {
5717 uint32_t curr_idx = 0;
5718 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5719 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5720 base_class != base_class_end;
5721 ++base_class, ++curr_idx)
5722 {
5723 if (curr_idx == idx)
5724 {
5725 if (bit_offset_ptr)
5726 {
5727 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5728 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5729 if (base_class->isVirtual())
5730 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5731 else
5732 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5733 }
5734 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5735 }
5736 }
5737 }
5738 }
5739 break;
5740
5741 case clang::Type::ObjCObjectPointer:
5742 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
5743
5744 case clang::Type::ObjCObject:
5745 if (idx == 0 && GetCompleteType(type))
5746 {
5747 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5748 if (objc_class_type)
5749 {
5750 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5751
5752 if (class_interface_decl)
5753 {
5754 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5755 if (superclass_interface_decl)
5756 {
5757 if (bit_offset_ptr)
5758 *bit_offset_ptr = 0;
5759 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5760 }
5761 }
5762 }
5763 }
5764 break;
5765 case clang::Type::ObjCInterface:
5766 if (idx == 0 && GetCompleteType(type))
5767 {
5768 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5769 if (objc_interface_type)
5770 {
5771 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5772
5773 if (class_interface_decl)
5774 {
5775 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5776 if (superclass_interface_decl)
5777 {
5778 if (bit_offset_ptr)
5779 *bit_offset_ptr = 0;
5780 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5781 }
5782 }
5783 }
5784 }
5785 break;
5786
5787
5788 case clang::Type::Typedef:
5789 return GetDirectBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5790
Enrico Granata36f51e42015-12-18 22:41:25 +00005791 case clang::Type::Auto:
5792 return GetDirectBaseClassAtIndex (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5793
Greg Clayton99558cc42015-08-24 23:46:31 +00005794 case clang::Type::Elaborated:
5795 return GetDirectBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5796
5797 case clang::Type::Paren:
5798 return GetDirectBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5799
5800 default:
5801 break;
5802 }
5803 return CompilerType();
5804}
5805
5806CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005807ClangASTContext::GetVirtualBaseClassAtIndex (lldb::opaque_compiler_type_t type,
Greg Clayton99558cc42015-08-24 23:46:31 +00005808 size_t idx,
5809 uint32_t *bit_offset_ptr)
5810{
5811 clang::QualType qual_type(GetCanonicalQualType(type));
5812 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5813 switch (type_class)
5814 {
5815 case clang::Type::Record:
5816 if (GetCompleteType(type))
5817 {
5818 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5819 if (cxx_record_decl)
5820 {
5821 uint32_t curr_idx = 0;
5822 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5823 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
5824 base_class != base_class_end;
5825 ++base_class, ++curr_idx)
5826 {
5827 if (curr_idx == idx)
5828 {
5829 if (bit_offset_ptr)
5830 {
5831 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5832 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5833 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5834
5835 }
5836 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5837 }
5838 }
5839 }
5840 }
5841 break;
5842
5843 case clang::Type::Typedef:
5844 return GetVirtualBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
Enrico Granata36f51e42015-12-18 22:41:25 +00005845
5846 case clang::Type::Auto:
5847 return GetVirtualBaseClassAtIndex (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5848
Greg Clayton99558cc42015-08-24 23:46:31 +00005849 case clang::Type::Elaborated:
5850 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5851
5852 case clang::Type::Paren:
5853 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5854
5855 default:
5856 break;
5857 }
5858 return CompilerType();
5859
5860}
5861
Greg Claytond8d4a572015-08-11 21:38:15 +00005862// If a pointer to a pointee type (the clang_type arg) says that it has no
5863// children, then we either need to trust it, or override it and return a
5864// different result. For example, an "int *" has one child that is an integer,
5865// but a function pointer doesn't have any children. Likewise if a Record type
5866// claims it has no children, then there really is nothing to show.
5867uint32_t
5868ClangASTContext::GetNumPointeeChildren (clang::QualType type)
5869{
5870 if (type.isNull())
5871 return 0;
5872
5873 clang::QualType qual_type(type.getCanonicalType());
5874 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5875 switch (type_class)
5876 {
5877 case clang::Type::Builtin:
5878 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5879 {
5880 case clang::BuiltinType::UnknownAny:
5881 case clang::BuiltinType::Void:
5882 case clang::BuiltinType::NullPtr:
5883 case clang::BuiltinType::OCLEvent:
5884 case clang::BuiltinType::OCLImage1d:
5885 case clang::BuiltinType::OCLImage1dArray:
5886 case clang::BuiltinType::OCLImage1dBuffer:
5887 case clang::BuiltinType::OCLImage2d:
5888 case clang::BuiltinType::OCLImage2dArray:
5889 case clang::BuiltinType::OCLImage3d:
5890 case clang::BuiltinType::OCLSampler:
5891 return 0;
5892 case clang::BuiltinType::Bool:
5893 case clang::BuiltinType::Char_U:
5894 case clang::BuiltinType::UChar:
5895 case clang::BuiltinType::WChar_U:
5896 case clang::BuiltinType::Char16:
5897 case clang::BuiltinType::Char32:
5898 case clang::BuiltinType::UShort:
5899 case clang::BuiltinType::UInt:
5900 case clang::BuiltinType::ULong:
5901 case clang::BuiltinType::ULongLong:
5902 case clang::BuiltinType::UInt128:
5903 case clang::BuiltinType::Char_S:
5904 case clang::BuiltinType::SChar:
5905 case clang::BuiltinType::WChar_S:
5906 case clang::BuiltinType::Short:
5907 case clang::BuiltinType::Int:
5908 case clang::BuiltinType::Long:
5909 case clang::BuiltinType::LongLong:
5910 case clang::BuiltinType::Int128:
5911 case clang::BuiltinType::Float:
5912 case clang::BuiltinType::Double:
5913 case clang::BuiltinType::LongDouble:
5914 case clang::BuiltinType::Dependent:
5915 case clang::BuiltinType::Overload:
5916 case clang::BuiltinType::ObjCId:
5917 case clang::BuiltinType::ObjCClass:
5918 case clang::BuiltinType::ObjCSel:
5919 case clang::BuiltinType::BoundMember:
5920 case clang::BuiltinType::Half:
5921 case clang::BuiltinType::ARCUnbridgedCast:
5922 case clang::BuiltinType::PseudoObject:
5923 case clang::BuiltinType::BuiltinFn:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00005924 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00005925 return 1;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005926 default:
5927 return 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00005928 }
5929 break;
5930
5931 case clang::Type::Complex: return 1;
5932 case clang::Type::Pointer: return 1;
5933 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
5934 case clang::Type::LValueReference: return 1;
5935 case clang::Type::RValueReference: return 1;
5936 case clang::Type::MemberPointer: return 0;
5937 case clang::Type::ConstantArray: return 0;
5938 case clang::Type::IncompleteArray: return 0;
5939 case clang::Type::VariableArray: return 0;
5940 case clang::Type::DependentSizedArray: return 0;
5941 case clang::Type::DependentSizedExtVector: return 0;
5942 case clang::Type::Vector: return 0;
5943 case clang::Type::ExtVector: return 0;
5944 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
5945 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
5946 case clang::Type::UnresolvedUsing: return 0;
5947 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
5948 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Enrico Granata36f51e42015-12-18 22:41:25 +00005949 case clang::Type::Auto: return GetNumPointeeChildren (llvm::cast<clang::AutoType>(qual_type)->getDeducedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005950 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
5951 case clang::Type::TypeOfExpr: return 0;
5952 case clang::Type::TypeOf: return 0;
5953 case clang::Type::Decltype: return 0;
5954 case clang::Type::Record: return 0;
5955 case clang::Type::Enum: return 1;
5956 case clang::Type::TemplateTypeParm: return 1;
5957 case clang::Type::SubstTemplateTypeParm: return 1;
5958 case clang::Type::TemplateSpecialization: return 1;
5959 case clang::Type::InjectedClassName: return 0;
5960 case clang::Type::DependentName: return 1;
5961 case clang::Type::DependentTemplateSpecialization: return 1;
5962 case clang::Type::ObjCObject: return 0;
5963 case clang::Type::ObjCInterface: return 0;
5964 case clang::Type::ObjCObjectPointer: return 1;
5965 default:
5966 break;
5967 }
5968 return 0;
5969}
5970
5971
Greg Claytona1e5dc82015-08-11 22:53:00 +00005972CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005973ClangASTContext::GetChildCompilerTypeAtIndex (lldb::opaque_compiler_type_t type,
Bruce Mitchener4ad83342015-09-21 16:48:48 +00005974 ExecutionContext *exe_ctx,
5975 size_t idx,
5976 bool transparent_pointers,
5977 bool omit_empty_base_classes,
5978 bool ignore_array_bounds,
5979 std::string& child_name,
5980 uint32_t &child_byte_size,
5981 int32_t &child_byte_offset,
5982 uint32_t &child_bitfield_bit_size,
5983 uint32_t &child_bitfield_bit_offset,
5984 bool &child_is_base_class,
5985 bool &child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00005986 ValueObject *valobj,
5987 uint64_t &language_flags)
Greg Claytond8d4a572015-08-11 21:38:15 +00005988{
5989 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005990 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005991
5992 clang::QualType parent_qual_type(GetCanonicalQualType(type));
5993 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
5994 child_bitfield_bit_size = 0;
5995 child_bitfield_bit_offset = 0;
5996 child_is_base_class = false;
Enrico Granatadc62ffd2015-11-09 19:27:34 +00005997 language_flags = 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00005998
5999 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
6000 uint32_t bit_offset;
6001 switch (parent_type_class)
6002 {
6003 case clang::Type::Builtin:
6004 if (idx_is_valid)
6005 {
6006 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
6007 {
6008 case clang::BuiltinType::ObjCId:
6009 case clang::BuiltinType::ObjCClass:
6010 child_name = "isa";
6011 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006012 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00006013
6014 default:
6015 break;
6016 }
6017 }
6018 break;
6019
6020 case clang::Type::Record:
6021 if (idx_is_valid && GetCompleteType(type))
6022 {
6023 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
6024 const clang::RecordDecl *record_decl = record_type->getDecl();
6025 assert(record_decl);
6026 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
6027 uint32_t child_idx = 0;
6028
6029 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6030 if (cxx_record_decl)
6031 {
6032 // We might have base classes to print out first
6033 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6034 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6035 base_class != base_class_end;
6036 ++base_class)
6037 {
6038 const clang::CXXRecordDecl *base_class_decl = nullptr;
6039
6040 // Skip empty base classes
6041 if (omit_empty_base_classes)
6042 {
6043 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6044 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
6045 continue;
6046 }
6047
6048 if (idx == child_idx)
6049 {
6050 if (base_class_decl == nullptr)
6051 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6052
6053
6054 if (base_class->isVirtual())
6055 {
6056 bool handled = false;
6057 if (valobj)
6058 {
6059 Error err;
6060 AddressType addr_type = eAddressTypeInvalid;
6061 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
6062
6063 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
6064 {
6065
6066 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
6067 Process *process = exe_ctx.GetProcessPtr();
6068 if (process)
6069 {
6070 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
6071 if (vtable_ctx)
6072 {
6073 if (vtable_ctx->isMicrosoft())
6074 {
6075 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
6076
6077 if (vtable_ptr_addr)
6078 {
6079 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
6080
6081 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
6082 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
6083 {
6084 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
6085 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
6086 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
6087 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
6088 if (base_offset != UINT32_MAX)
6089 {
6090 handled = true;
6091 bit_offset = base_offset * 8;
6092 }
6093 }
6094 }
6095 }
6096 else
6097 {
6098 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
6099 if (vtable_ptr_addr)
6100 {
6101 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
6102 if (vtable_ptr != LLDB_INVALID_ADDRESS)
6103 {
6104 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
6105 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
6106 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
6107 if (base_offset != UINT32_MAX)
6108 {
6109 handled = true;
6110 bit_offset = base_offset * 8;
6111 }
6112 }
6113 }
6114 }
6115 }
6116 }
6117 }
6118
6119 }
6120 if (!handled)
6121 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
6122 }
6123 else
6124 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
6125
6126 // Base classes should be a multiple of 8 bits in size
6127 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006128 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006129 child_name = base_class_clang_type.GetTypeName().AsCString("");
6130 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6131
6132 // Base classes bit sizes should be a multiple of 8 bits in size
6133 assert (base_class_clang_type_bit_size % 8 == 0);
6134 child_byte_size = base_class_clang_type_bit_size / 8;
6135 child_is_base_class = true;
6136 return base_class_clang_type;
6137 }
6138 // We don't increment the child index in the for loop since we might
6139 // be skipping empty base classes
6140 ++child_idx;
6141 }
6142 }
6143 // Make sure index is in range...
6144 uint32_t field_idx = 0;
6145 clang::RecordDecl::field_iterator field, field_end;
6146 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
6147 {
6148 if (idx == child_idx)
6149 {
6150 // Print the member type if requested
6151 // Print the member name and equal sign
6152 child_name.assign(field->getNameAsString().c_str());
6153
6154 // Figure out the type byte size (field_type_info.first) and
6155 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00006156 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006157 assert(field_idx < record_layout.getFieldCount());
6158 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6159
6160 // Figure out the field offset within the current struct/union/class type
6161 bit_offset = record_layout.getFieldOffset (field_idx);
6162 child_byte_offset = bit_offset / 8;
6163 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
6164 child_bitfield_bit_offset = bit_offset % 8;
6165
6166 return field_clang_type;
6167 }
6168 }
6169 }
6170 break;
6171
6172 case clang::Type::ObjCObject:
6173 case clang::Type::ObjCInterface:
6174 if (idx_is_valid && GetCompleteType(type))
6175 {
6176 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
6177 assert (objc_class_type);
6178 if (objc_class_type)
6179 {
6180 uint32_t child_idx = 0;
6181 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6182
6183 if (class_interface_decl)
6184 {
6185
6186 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
6187 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6188 if (superclass_interface_decl)
6189 {
6190 if (omit_empty_base_classes)
6191 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006192 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006193 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
6194 {
6195 if (idx == 0)
6196 {
6197 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
6198
6199
6200 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
6201
6202 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6203
6204 child_byte_size = ivar_type_info.Width / 8;
6205 child_byte_offset = 0;
6206 child_is_base_class = true;
6207
Greg Claytona1e5dc82015-08-11 22:53:00 +00006208 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006209 }
6210
6211 ++child_idx;
6212 }
6213 }
6214 else
6215 ++child_idx;
6216 }
6217
6218 const uint32_t superclass_idx = child_idx;
6219
6220 if (idx < (child_idx + class_interface_decl->ivar_size()))
6221 {
6222 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6223
6224 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
6225 {
6226 if (child_idx == idx)
6227 {
6228 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6229
6230 clang::QualType ivar_qual_type(ivar_decl->getType());
6231
6232 child_name.assign(ivar_decl->getNameAsString().c_str());
6233
6234 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6235
6236 child_byte_size = ivar_type_info.Width / 8;
6237
6238 // Figure out the field offset within the current struct/union/class type
6239 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
6240 // that doesn't account for the space taken up by unbacked properties, or from
6241 // the changing size of base classes that are newer than this class.
6242 // So if we have a process around that we can ask about this object, do so.
6243 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
6244 Process *process = nullptr;
6245 if (exe_ctx)
6246 process = exe_ctx->GetProcessPtr();
6247 if (process)
6248 {
6249 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
6250 if (objc_runtime != nullptr)
6251 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006252 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006253 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
6254 }
6255 }
6256
6257 // Setting this to UINT32_MAX to make sure we don't compute it twice...
6258 bit_offset = UINT32_MAX;
6259
6260 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
6261 {
6262 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6263 child_byte_offset = bit_offset / 8;
6264 }
6265
6266 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
6267 // of a bitfield within its containing object. So regardless of where we get the byte
6268 // offset from, we still need to get the bit offset for bitfields from the layout.
6269
6270 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
6271 {
6272 if (bit_offset == UINT32_MAX)
6273 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6274
6275 child_bitfield_bit_offset = bit_offset % 8;
6276 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006277 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006278 }
6279 ++child_idx;
6280 }
6281 }
6282 }
6283 }
6284 }
6285 break;
6286
6287 case clang::Type::ObjCObjectPointer:
6288 if (idx_is_valid)
6289 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006290 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006291
6292 if (transparent_pointers && pointee_clang_type.IsAggregateType())
6293 {
6294 child_is_deref_of_parent = false;
6295 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006296 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6297 idx,
6298 transparent_pointers,
6299 omit_empty_base_classes,
6300 ignore_array_bounds,
6301 child_name,
6302 child_byte_size,
6303 child_byte_offset,
6304 child_bitfield_bit_size,
6305 child_bitfield_bit_offset,
6306 child_is_base_class,
6307 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006308 valobj,
6309 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006310 }
6311 else
6312 {
6313 child_is_deref_of_parent = true;
6314 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6315 if (parent_name)
6316 {
6317 child_name.assign(1, '*');
6318 child_name += parent_name;
6319 }
6320
6321 // We have a pointer to an simple type
6322 if (idx == 0 && pointee_clang_type.GetCompleteType())
6323 {
6324 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6325 child_byte_offset = 0;
6326 return pointee_clang_type;
6327 }
6328 }
6329 }
6330 break;
6331
6332 case clang::Type::Vector:
6333 case clang::Type::ExtVector:
6334 if (idx_is_valid)
6335 {
6336 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
6337 if (array)
6338 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006339 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006340 if (element_type.GetCompleteType())
6341 {
6342 char element_name[64];
6343 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6344 child_name.assign(element_name);
6345 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6346 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6347 return element_type;
6348 }
6349 }
6350 }
6351 break;
6352
6353 case clang::Type::ConstantArray:
6354 case clang::Type::IncompleteArray:
6355 if (ignore_array_bounds || idx_is_valid)
6356 {
6357 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
6358 if (array)
6359 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006360 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006361 if (element_type.GetCompleteType())
6362 {
6363 char element_name[64];
6364 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6365 child_name.assign(element_name);
6366 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6367 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6368 return element_type;
6369 }
6370 }
6371 }
6372 break;
6373
6374
6375 case clang::Type::Pointer:
6376 if (idx_is_valid)
6377 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006378 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006379
6380 // Don't dereference "void *" pointers
6381 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00006382 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006383
6384 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6385 {
6386 child_is_deref_of_parent = false;
6387 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006388 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6389 idx,
6390 transparent_pointers,
6391 omit_empty_base_classes,
6392 ignore_array_bounds,
6393 child_name,
6394 child_byte_size,
6395 child_byte_offset,
6396 child_bitfield_bit_size,
6397 child_bitfield_bit_offset,
6398 child_is_base_class,
6399 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006400 valobj,
6401 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006402 }
6403 else
6404 {
6405 child_is_deref_of_parent = true;
6406
6407 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6408 if (parent_name)
6409 {
6410 child_name.assign(1, '*');
6411 child_name += parent_name;
6412 }
6413
6414 // We have a pointer to an simple type
6415 if (idx == 0)
6416 {
6417 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6418 child_byte_offset = 0;
6419 return pointee_clang_type;
6420 }
6421 }
6422 }
6423 break;
6424
6425 case clang::Type::LValueReference:
6426 case clang::Type::RValueReference:
6427 if (idx_is_valid)
6428 {
6429 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006430 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006431 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6432 {
6433 child_is_deref_of_parent = false;
6434 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006435 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6436 idx,
6437 transparent_pointers,
6438 omit_empty_base_classes,
6439 ignore_array_bounds,
6440 child_name,
6441 child_byte_size,
6442 child_byte_offset,
6443 child_bitfield_bit_size,
6444 child_bitfield_bit_offset,
6445 child_is_base_class,
6446 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006447 valobj,
6448 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006449 }
6450 else
6451 {
6452 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6453 if (parent_name)
6454 {
6455 child_name.assign(1, '&');
6456 child_name += parent_name;
6457 }
6458
6459 // We have a pointer to an simple type
6460 if (idx == 0)
6461 {
6462 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6463 child_byte_offset = 0;
6464 return pointee_clang_type;
6465 }
6466 }
6467 }
6468 break;
6469
6470 case clang::Type::Typedef:
6471 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006472 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006473 return typedefed_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6474 idx,
6475 transparent_pointers,
6476 omit_empty_base_classes,
6477 ignore_array_bounds,
6478 child_name,
6479 child_byte_size,
6480 child_byte_offset,
6481 child_bitfield_bit_size,
6482 child_bitfield_bit_offset,
6483 child_is_base_class,
6484 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006485 valobj,
6486 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006487 }
6488 break;
6489
Enrico Granata36f51e42015-12-18 22:41:25 +00006490 case clang::Type::Auto:
6491 {
6492 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::AutoType>(parent_qual_type)->getDeducedType());
6493 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6494 idx,
6495 transparent_pointers,
6496 omit_empty_base_classes,
6497 ignore_array_bounds,
6498 child_name,
6499 child_byte_size,
6500 child_byte_offset,
6501 child_bitfield_bit_size,
6502 child_bitfield_bit_offset,
6503 child_is_base_class,
6504 child_is_deref_of_parent,
6505 valobj,
6506 language_flags);
6507 }
6508
Greg Claytond8d4a572015-08-11 21:38:15 +00006509 case clang::Type::Elaborated:
6510 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006511 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006512 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6513 idx,
6514 transparent_pointers,
6515 omit_empty_base_classes,
6516 ignore_array_bounds,
6517 child_name,
6518 child_byte_size,
6519 child_byte_offset,
6520 child_bitfield_bit_size,
6521 child_bitfield_bit_offset,
6522 child_is_base_class,
6523 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006524 valobj,
6525 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006526 }
6527
6528 case clang::Type::Paren:
6529 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006530 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006531 return paren_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6532 idx,
6533 transparent_pointers,
6534 omit_empty_base_classes,
6535 ignore_array_bounds,
6536 child_name,
6537 child_byte_size,
6538 child_byte_offset,
6539 child_bitfield_bit_size,
6540 child_bitfield_bit_offset,
6541 child_is_base_class,
6542 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006543 valobj,
6544 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006545 }
6546
6547
6548 default:
6549 break;
6550 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006551 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006552}
6553
6554static uint32_t
6555GetIndexForRecordBase
6556(
6557 const clang::RecordDecl *record_decl,
6558 const clang::CXXBaseSpecifier *base_spec,
6559 bool omit_empty_base_classes
6560 )
6561{
6562 uint32_t child_idx = 0;
6563
6564 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6565
6566 // const char *super_name = record_decl->getNameAsCString();
6567 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6568 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6569 //
6570 if (cxx_record_decl)
6571 {
6572 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6573 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6574 base_class != base_class_end;
6575 ++base_class)
6576 {
6577 if (omit_empty_base_classes)
6578 {
6579 if (BaseSpecifierIsEmpty (base_class))
6580 continue;
6581 }
6582
6583 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6584 // child_idx,
6585 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6586 //
6587 //
6588 if (base_class == base_spec)
6589 return child_idx;
6590 ++child_idx;
6591 }
6592 }
6593
6594 return UINT32_MAX;
6595}
6596
6597
6598static uint32_t
6599GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6600 clang::NamedDecl *canonical_decl,
6601 bool omit_empty_base_classes)
6602{
6603 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6604 omit_empty_base_classes);
6605
6606 clang::RecordDecl::field_iterator field, field_end;
6607 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6608 field != field_end;
6609 ++field, ++child_idx)
6610 {
6611 if (field->getCanonicalDecl() == canonical_decl)
6612 return child_idx;
6613 }
6614
6615 return UINT32_MAX;
6616}
6617
6618// Look for a child member (doesn't include base classes, but it does include
6619// their members) in the type hierarchy. Returns an index path into "clang_type"
6620// on how to reach the appropriate member.
6621//
6622// class A
6623// {
6624// public:
6625// int m_a;
6626// int m_b;
6627// };
6628//
6629// class B
6630// {
6631// };
6632//
6633// class C :
6634// public B,
6635// public A
6636// {
6637// };
6638//
6639// If we have a clang type that describes "class C", and we wanted to looked
6640// "m_b" in it:
6641//
6642// With omit_empty_base_classes == false we would get an integer array back with:
6643// { 1, 1 }
6644// The first index 1 is the child index for "class A" within class C
6645// The second index 1 is the child index for "m_b" within class A
6646//
6647// With omit_empty_base_classes == true we would get an integer array back with:
6648// { 0, 1 }
6649// 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)
6650// The second index 1 is the child index for "m_b" within class A
6651
6652size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006653ClangASTContext::GetIndexOfChildMemberWithName (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006654 bool omit_empty_base_classes,
6655 std::vector<uint32_t>& child_indexes)
6656{
6657 if (type && name && name[0])
6658 {
6659 clang::QualType qual_type(GetCanonicalQualType(type));
6660 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6661 switch (type_class)
6662 {
6663 case clang::Type::Record:
6664 if (GetCompleteType(type))
6665 {
6666 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6667 const clang::RecordDecl *record_decl = record_type->getDecl();
6668
6669 assert(record_decl);
6670 uint32_t child_idx = 0;
6671
6672 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6673
6674 // Try and find a field that matches NAME
6675 clang::RecordDecl::field_iterator field, field_end;
6676 llvm::StringRef name_sref(name);
6677 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6678 field != field_end;
6679 ++field, ++child_idx)
6680 {
6681 llvm::StringRef field_name = field->getName();
6682 if (field_name.empty())
6683 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006684 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006685 child_indexes.push_back(child_idx);
6686 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
6687 return child_indexes.size();
6688 child_indexes.pop_back();
6689
6690 }
6691 else if (field_name.equals (name_sref))
6692 {
6693 // We have to add on the number of base classes to this index!
6694 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
6695 return child_indexes.size();
6696 }
6697 }
6698
6699 if (cxx_record_decl)
6700 {
6701 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6702
6703 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6704
6705 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6706 // Didn't find things easily, lets let clang do its thang...
6707 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
6708 clang::DeclarationName decl_name(&ident_ref);
6709
6710 clang::CXXBasePaths paths;
6711 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
6712 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
6713 },
6714 paths))
6715 {
6716 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
6717 for (path = paths.begin(); path != path_end; ++path)
6718 {
6719 const size_t num_path_elements = path->size();
6720 for (size_t e=0; e<num_path_elements; ++e)
6721 {
6722 clang::CXXBasePathElement elem = (*path)[e];
6723
6724 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
6725 if (child_idx == UINT32_MAX)
6726 {
6727 child_indexes.clear();
6728 return 0;
6729 }
6730 else
6731 {
6732 child_indexes.push_back (child_idx);
6733 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
6734 }
6735 }
6736 for (clang::NamedDecl *path_decl : path->Decls)
6737 {
6738 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
6739 if (child_idx == UINT32_MAX)
6740 {
6741 child_indexes.clear();
6742 return 0;
6743 }
6744 else
6745 {
6746 child_indexes.push_back (child_idx);
6747 }
6748 }
6749 }
6750 return child_indexes.size();
6751 }
6752 }
6753
6754 }
6755 break;
6756
6757 case clang::Type::ObjCObject:
6758 case clang::Type::ObjCInterface:
6759 if (GetCompleteType(type))
6760 {
6761 llvm::StringRef name_sref(name);
6762 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6763 assert (objc_class_type);
6764 if (objc_class_type)
6765 {
6766 uint32_t child_idx = 0;
6767 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6768
6769 if (class_interface_decl)
6770 {
6771 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6772 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6773
6774 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6775 {
6776 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6777
6778 if (ivar_decl->getName().equals (name_sref))
6779 {
6780 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6781 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6782 ++child_idx;
6783
6784 child_indexes.push_back (child_idx);
6785 return child_indexes.size();
6786 }
6787 }
6788
6789 if (superclass_interface_decl)
6790 {
6791 // The super class index is always zero for ObjC classes,
6792 // so we push it onto the child indexes in case we find
6793 // an ivar in our superclass...
6794 child_indexes.push_back (0);
6795
Greg Claytona1e5dc82015-08-11 22:53:00 +00006796 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006797 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
6798 omit_empty_base_classes,
6799 child_indexes))
6800 {
6801 // We did find an ivar in a superclass so just
6802 // return the results!
6803 return child_indexes.size();
6804 }
6805
6806 // We didn't find an ivar matching "name" in our
6807 // superclass, pop the superclass zero index that
6808 // we pushed on above.
6809 child_indexes.pop_back();
6810 }
6811 }
6812 }
6813 }
6814 break;
6815
6816 case clang::Type::ObjCObjectPointer:
6817 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006818 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006819 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
6820 omit_empty_base_classes,
6821 child_indexes);
6822 }
6823 break;
6824
6825
6826 case clang::Type::ConstantArray:
6827 {
6828 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6829 // const uint64_t element_count = array->getSize().getLimitedValue();
6830 //
6831 // if (idx < element_count)
6832 // {
6833 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6834 //
6835 // char element_name[32];
6836 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6837 //
6838 // child_name.assign(element_name);
6839 // assert(field_type_info.first % 8 == 0);
6840 // child_byte_size = field_type_info.first / 8;
6841 // child_byte_offset = idx * child_byte_size;
6842 // return array->getElementType().getAsOpaquePtr();
6843 // }
6844 }
6845 break;
6846
6847 // case clang::Type::MemberPointerType:
6848 // {
6849 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6850 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6851 //
6852 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6853 // {
6854 // return GetIndexOfChildWithName (ast,
6855 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6856 // name);
6857 // }
6858 // }
6859 // break;
6860 //
6861 case clang::Type::LValueReference:
6862 case clang::Type::RValueReference:
6863 {
6864 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6865 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006866 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006867
6868 if (pointee_clang_type.IsAggregateType ())
6869 {
6870 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6871 omit_empty_base_classes,
6872 child_indexes);
6873 }
6874 }
6875 break;
6876
6877 case clang::Type::Pointer:
6878 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006879 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006880
6881 if (pointee_clang_type.IsAggregateType ())
6882 {
6883 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6884 omit_empty_base_classes,
6885 child_indexes);
6886 }
6887 }
6888 break;
6889
6890 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006891 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00006892 omit_empty_base_classes,
6893 child_indexes);
6894
6895 case clang::Type::Auto:
6896 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetIndexOfChildMemberWithName (name,
6897 omit_empty_base_classes,
6898 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006899
6900 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006901 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00006902 omit_empty_base_classes,
6903 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006904
6905 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006906 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00006907 omit_empty_base_classes,
6908 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006909
6910 default:
6911 break;
6912 }
6913 }
6914 return 0;
6915}
6916
6917
6918// Get the index of the child of "clang_type" whose name matches. This function
6919// doesn't descend into the children, but only looks one level deep and name
6920// matches can include base class names.
6921
6922uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006923ClangASTContext::GetIndexOfChildWithName (lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00006924{
6925 if (type && name && name[0])
6926 {
6927 clang::QualType qual_type(GetCanonicalQualType(type));
6928
6929 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6930
6931 switch (type_class)
6932 {
6933 case clang::Type::Record:
6934 if (GetCompleteType(type))
6935 {
6936 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6937 const clang::RecordDecl *record_decl = record_type->getDecl();
6938
6939 assert(record_decl);
6940 uint32_t child_idx = 0;
6941
6942 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6943
6944 if (cxx_record_decl)
6945 {
6946 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6947 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6948 base_class != base_class_end;
6949 ++base_class)
6950 {
6951 // Skip empty base classes
6952 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6953 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
6954 continue;
6955
Greg Claytona1e5dc82015-08-11 22:53:00 +00006956 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006957 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
6958 if (base_class_type_name.compare (name) == 0)
6959 return child_idx;
6960 ++child_idx;
6961 }
6962 }
6963
6964 // Try and find a field that matches NAME
6965 clang::RecordDecl::field_iterator field, field_end;
6966 llvm::StringRef name_sref(name);
6967 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6968 field != field_end;
6969 ++field, ++child_idx)
6970 {
6971 if (field->getName().equals (name_sref))
6972 return child_idx;
6973 }
6974
6975 }
6976 break;
6977
6978 case clang::Type::ObjCObject:
6979 case clang::Type::ObjCInterface:
6980 if (GetCompleteType(type))
6981 {
6982 llvm::StringRef name_sref(name);
6983 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6984 assert (objc_class_type);
6985 if (objc_class_type)
6986 {
6987 uint32_t child_idx = 0;
6988 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6989
6990 if (class_interface_decl)
6991 {
6992 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6993 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6994
6995 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6996 {
6997 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6998
6999 if (ivar_decl->getName().equals (name_sref))
7000 {
7001 if ((!omit_empty_base_classes && superclass_interface_decl) ||
7002 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
7003 ++child_idx;
7004
7005 return child_idx;
7006 }
7007 }
7008
7009 if (superclass_interface_decl)
7010 {
7011 if (superclass_interface_decl->getName().equals (name_sref))
7012 return 0;
7013 }
7014 }
7015 }
7016 }
7017 break;
7018
7019 case clang::Type::ObjCObjectPointer:
7020 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007021 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007022 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7023 }
7024 break;
7025
7026 case clang::Type::ConstantArray:
7027 {
7028 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
7029 // const uint64_t element_count = array->getSize().getLimitedValue();
7030 //
7031 // if (idx < element_count)
7032 // {
7033 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
7034 //
7035 // char element_name[32];
7036 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
7037 //
7038 // child_name.assign(element_name);
7039 // assert(field_type_info.first % 8 == 0);
7040 // child_byte_size = field_type_info.first / 8;
7041 // child_byte_offset = idx * child_byte_size;
7042 // return array->getElementType().getAsOpaquePtr();
7043 // }
7044 }
7045 break;
7046
7047 // case clang::Type::MemberPointerType:
7048 // {
7049 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
7050 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
7051 //
7052 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
7053 // {
7054 // return GetIndexOfChildWithName (ast,
7055 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
7056 // name);
7057 // }
7058 // }
7059 // break;
7060 //
7061 case clang::Type::LValueReference:
7062 case clang::Type::RValueReference:
7063 {
7064 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00007065 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007066
7067 if (pointee_type.IsAggregateType ())
7068 {
7069 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7070 }
7071 }
7072 break;
7073
7074 case clang::Type::Pointer:
7075 {
7076 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00007077 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007078
7079 if (pointee_type.IsAggregateType ())
7080 {
7081 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7082 }
7083 else
7084 {
7085 // if (parent_name)
7086 // {
7087 // child_name.assign(1, '*');
7088 // child_name += parent_name;
7089 // }
7090 //
7091 // // We have a pointer to an simple type
7092 // if (idx == 0)
7093 // {
7094 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
7095 // assert(clang_type_info.first % 8 == 0);
7096 // child_byte_size = clang_type_info.first / 8;
7097 // child_byte_offset = 0;
7098 // return pointee_type.getAsOpaquePtr();
7099 // }
7100 }
7101 }
7102 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00007103
7104 case clang::Type::Auto:
7105 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007106
7107 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007108 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007109
7110 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007111 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007112
7113 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007114 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007115
7116 default:
7117 break;
7118 }
7119 }
7120 return UINT32_MAX;
7121}
7122
7123
7124size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007125ClangASTContext::GetNumTemplateArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007126{
7127 if (!type)
7128 return 0;
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007129
7130 clang::QualType qual_type (GetCanonicalQualType(type));
7131 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7132 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007133 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007134 case clang::Type::Record:
7135 if (GetCompleteType(type))
7136 {
7137 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7138 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007139 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007140 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7141 if (template_decl)
7142 return template_decl->getTemplateArgs().size();
Greg Claytond8d4a572015-08-11 21:38:15 +00007143 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007144 }
7145 break;
7146
7147 case clang::Type::Typedef:
7148 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
Enrico Granata36f51e42015-12-18 22:41:25 +00007149
7150 case clang::Type::Auto:
7151 return (CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType())).GetNumTemplateArguments();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007152
7153 case clang::Type::Elaborated:
7154 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
7155
7156 case clang::Type::Paren:
7157 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
7158
7159 default:
7160 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007161 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007162
Greg Claytond8d4a572015-08-11 21:38:15 +00007163 return 0;
7164}
7165
Greg Claytona1e5dc82015-08-11 22:53:00 +00007166CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007167ClangASTContext::GetTemplateArgument (lldb::opaque_compiler_type_t type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00007168{
7169 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007170 return CompilerType();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007171
7172 clang::QualType qual_type (GetCanonicalQualType(type));
7173 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7174 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007175 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007176 case clang::Type::Record:
7177 if (GetCompleteType(type))
7178 {
7179 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7180 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007181 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007182 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7183 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
Greg Claytond8d4a572015-08-11 21:38:15 +00007184 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007185 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
7186 switch (template_arg.getKind())
Greg Claytond8d4a572015-08-11 21:38:15 +00007187 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007188 case clang::TemplateArgument::Null:
7189 kind = eTemplateArgumentKindNull;
7190 return CompilerType();
7191
7192 case clang::TemplateArgument::Type:
7193 kind = eTemplateArgumentKindType;
7194 return CompilerType(getASTContext(), template_arg.getAsType());
7195
7196 case clang::TemplateArgument::Declaration:
7197 kind = eTemplateArgumentKindDeclaration;
7198 return CompilerType();
7199
7200 case clang::TemplateArgument::Integral:
7201 kind = eTemplateArgumentKindIntegral;
7202 return CompilerType(getASTContext(), template_arg.getIntegralType());
7203
7204 case clang::TemplateArgument::Template:
7205 kind = eTemplateArgumentKindTemplate;
7206 return CompilerType();
7207
7208 case clang::TemplateArgument::TemplateExpansion:
7209 kind = eTemplateArgumentKindTemplateExpansion;
7210 return CompilerType();
7211
7212 case clang::TemplateArgument::Expression:
7213 kind = eTemplateArgumentKindExpression;
7214 return CompilerType();
7215
7216 case clang::TemplateArgument::Pack:
7217 kind = eTemplateArgumentKindPack;
7218 return CompilerType();
7219
7220 default:
7221 assert (!"Unhandled clang::TemplateArgument::ArgKind");
7222 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007223 }
7224 }
7225 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007226 }
7227 break;
7228
7229 case clang::Type::Typedef:
7230 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
Enrico Granata36f51e42015-12-18 22:41:25 +00007231
7232 case clang::Type::Auto:
7233 return (CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType())).GetTemplateArgument(arg_idx, kind);
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007234
7235 case clang::Type::Elaborated:
7236 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
7237
7238 case clang::Type::Paren:
7239 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
7240
7241 default:
7242 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007243 }
7244 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00007245 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00007246}
7247
Enrico Granatac6bf2e22015-09-23 01:39:46 +00007248CompilerType
7249ClangASTContext::GetTypeForFormatters (void* type)
7250{
7251 if (type)
7252 return RemoveFastQualifiers(CompilerType(this, type));
7253 return CompilerType();
7254}
7255
Greg Claytond8d4a572015-08-11 21:38:15 +00007256static bool
7257IsOperator (const char *name, clang::OverloadedOperatorKind &op_kind)
7258{
7259 if (name == nullptr || name[0] == '\0')
7260 return false;
7261
7262#define OPERATOR_PREFIX "operator"
7263#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
7264
7265 const char *post_op_name = nullptr;
7266
7267 bool no_space = true;
7268
7269 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
7270 return false;
7271
7272 post_op_name = name + OPERATOR_PREFIX_LENGTH;
7273
7274 if (post_op_name[0] == ' ')
7275 {
7276 post_op_name++;
7277 no_space = false;
7278 }
7279
7280#undef OPERATOR_PREFIX
7281#undef OPERATOR_PREFIX_LENGTH
7282
7283 // This is an operator, set the overloaded operator kind to invalid
7284 // in case this is a conversion operator...
7285 op_kind = clang::NUM_OVERLOADED_OPERATORS;
7286
7287 switch (post_op_name[0])
7288 {
7289 default:
7290 if (no_space)
7291 return false;
7292 break;
7293 case 'n':
7294 if (no_space)
7295 return false;
7296 if (strcmp (post_op_name, "new") == 0)
7297 op_kind = clang::OO_New;
7298 else if (strcmp (post_op_name, "new[]") == 0)
7299 op_kind = clang::OO_Array_New;
7300 break;
7301
7302 case 'd':
7303 if (no_space)
7304 return false;
7305 if (strcmp (post_op_name, "delete") == 0)
7306 op_kind = clang::OO_Delete;
7307 else if (strcmp (post_op_name, "delete[]") == 0)
7308 op_kind = clang::OO_Array_Delete;
7309 break;
7310
7311 case '+':
7312 if (post_op_name[1] == '\0')
7313 op_kind = clang::OO_Plus;
7314 else if (post_op_name[2] == '\0')
7315 {
7316 if (post_op_name[1] == '=')
7317 op_kind = clang::OO_PlusEqual;
7318 else if (post_op_name[1] == '+')
7319 op_kind = clang::OO_PlusPlus;
7320 }
7321 break;
7322
7323 case '-':
7324 if (post_op_name[1] == '\0')
7325 op_kind = clang::OO_Minus;
7326 else if (post_op_name[2] == '\0')
7327 {
7328 switch (post_op_name[1])
7329 {
7330 case '=': op_kind = clang::OO_MinusEqual; break;
7331 case '-': op_kind = clang::OO_MinusMinus; break;
7332 case '>': op_kind = clang::OO_Arrow; break;
7333 }
7334 }
7335 else if (post_op_name[3] == '\0')
7336 {
7337 if (post_op_name[2] == '*')
7338 op_kind = clang::OO_ArrowStar; break;
7339 }
7340 break;
7341
7342 case '*':
7343 if (post_op_name[1] == '\0')
7344 op_kind = clang::OO_Star;
7345 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7346 op_kind = clang::OO_StarEqual;
7347 break;
7348
7349 case '/':
7350 if (post_op_name[1] == '\0')
7351 op_kind = clang::OO_Slash;
7352 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7353 op_kind = clang::OO_SlashEqual;
7354 break;
7355
7356 case '%':
7357 if (post_op_name[1] == '\0')
7358 op_kind = clang::OO_Percent;
7359 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7360 op_kind = clang::OO_PercentEqual;
7361 break;
7362
7363
7364 case '^':
7365 if (post_op_name[1] == '\0')
7366 op_kind = clang::OO_Caret;
7367 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7368 op_kind = clang::OO_CaretEqual;
7369 break;
7370
7371 case '&':
7372 if (post_op_name[1] == '\0')
7373 op_kind = clang::OO_Amp;
7374 else if (post_op_name[2] == '\0')
7375 {
7376 switch (post_op_name[1])
7377 {
7378 case '=': op_kind = clang::OO_AmpEqual; break;
7379 case '&': op_kind = clang::OO_AmpAmp; break;
7380 }
7381 }
7382 break;
7383
7384 case '|':
7385 if (post_op_name[1] == '\0')
7386 op_kind = clang::OO_Pipe;
7387 else if (post_op_name[2] == '\0')
7388 {
7389 switch (post_op_name[1])
7390 {
7391 case '=': op_kind = clang::OO_PipeEqual; break;
7392 case '|': op_kind = clang::OO_PipePipe; break;
7393 }
7394 }
7395 break;
7396
7397 case '~':
7398 if (post_op_name[1] == '\0')
7399 op_kind = clang::OO_Tilde;
7400 break;
7401
7402 case '!':
7403 if (post_op_name[1] == '\0')
7404 op_kind = clang::OO_Exclaim;
7405 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7406 op_kind = clang::OO_ExclaimEqual;
7407 break;
7408
7409 case '=':
7410 if (post_op_name[1] == '\0')
7411 op_kind = clang::OO_Equal;
7412 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7413 op_kind = clang::OO_EqualEqual;
7414 break;
7415
7416 case '<':
7417 if (post_op_name[1] == '\0')
7418 op_kind = clang::OO_Less;
7419 else if (post_op_name[2] == '\0')
7420 {
7421 switch (post_op_name[1])
7422 {
7423 case '<': op_kind = clang::OO_LessLess; break;
7424 case '=': op_kind = clang::OO_LessEqual; break;
7425 }
7426 }
7427 else if (post_op_name[3] == '\0')
7428 {
7429 if (post_op_name[2] == '=')
7430 op_kind = clang::OO_LessLessEqual;
7431 }
7432 break;
7433
7434 case '>':
7435 if (post_op_name[1] == '\0')
7436 op_kind = clang::OO_Greater;
7437 else if (post_op_name[2] == '\0')
7438 {
7439 switch (post_op_name[1])
7440 {
7441 case '>': op_kind = clang::OO_GreaterGreater; break;
7442 case '=': op_kind = clang::OO_GreaterEqual; break;
7443 }
7444 }
7445 else if (post_op_name[1] == '>' &&
7446 post_op_name[2] == '=' &&
7447 post_op_name[3] == '\0')
7448 {
7449 op_kind = clang::OO_GreaterGreaterEqual;
7450 }
7451 break;
7452
7453 case ',':
7454 if (post_op_name[1] == '\0')
7455 op_kind = clang::OO_Comma;
7456 break;
7457
7458 case '(':
7459 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
7460 op_kind = clang::OO_Call;
7461 break;
7462
7463 case '[':
7464 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
7465 op_kind = clang::OO_Subscript;
7466 break;
7467 }
7468
7469 return true;
7470}
7471
7472clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007473ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007474{
7475 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
7476 if (enutype)
7477 return enutype->getDecl();
7478 return NULL;
7479}
7480
7481clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007482ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007483{
7484 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(GetCanonicalQualType(type));
7485 if (record_type)
7486 return record_type->getDecl();
7487 return nullptr;
7488}
7489
Greg Claytone6b36cd2015-12-08 01:02:08 +00007490clang::TagDecl *
7491ClangASTContext::GetAsTagDecl (const CompilerType& type)
7492{
7493 clang::QualType qual_type = GetCanonicalQualType(type);
7494 if (qual_type.isNull())
7495 return nullptr;
7496 else
7497 return qual_type->getAsTagDecl();
7498}
7499
Greg Claytond8d4a572015-08-11 21:38:15 +00007500clang::CXXRecordDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007501ClangASTContext::GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007502{
7503 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
7504}
7505
7506clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007507ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007508{
7509 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(GetCanonicalQualType(type));
7510 if (objc_class_type)
7511 return objc_class_type->getInterface();
7512 return nullptr;
7513}
7514
7515clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007516ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
7517 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007518 AccessType access,
7519 uint32_t bitfield_bit_size)
7520{
7521 if (!type.IsValid() || !field_clang_type.IsValid())
7522 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007523 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007524 if (!ast)
7525 return nullptr;
7526 clang::ASTContext* clang_ast = ast->getASTContext();
7527
7528 clang::FieldDecl *field = nullptr;
7529
7530 clang::Expr *bit_width = nullptr;
7531 if (bitfield_bit_size != 0)
7532 {
7533 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
7534 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
7535 }
7536
7537 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7538 if (record_decl)
7539 {
7540 field = clang::FieldDecl::Create (*clang_ast,
7541 record_decl,
7542 clang::SourceLocation(),
7543 clang::SourceLocation(),
7544 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7545 GetQualType(field_clang_type), // Field type
7546 nullptr, // TInfo *
7547 bit_width, // BitWidth
7548 false, // Mutable
7549 clang::ICIS_NoInit); // HasInit
7550
7551 if (!name)
7552 {
7553 // Determine whether this field corresponds to an anonymous
7554 // struct or union.
7555 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
7556 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
7557 if (!Rec->getDeclName()) {
7558 Rec->setAnonymousStructOrUnion(true);
7559 field->setImplicit();
7560
7561 }
7562 }
7563 }
7564
7565 if (field)
7566 {
7567 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7568
7569 record_decl->addDecl(field);
7570
7571#ifdef LLDB_CONFIGURATION_DEBUG
7572 VerifyDecl(field);
7573#endif
7574 }
7575 }
7576 else
7577 {
7578 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7579
7580 if (class_interface_decl)
7581 {
7582 const bool is_synthesized = false;
7583
7584 field_clang_type.GetCompleteType();
7585
7586 field = clang::ObjCIvarDecl::Create (*clang_ast,
7587 class_interface_decl,
7588 clang::SourceLocation(),
7589 clang::SourceLocation(),
7590 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7591 GetQualType(field_clang_type), // Field type
7592 nullptr, // TypeSourceInfo *
7593 ConvertAccessTypeToObjCIvarAccessControl (access),
7594 bit_width,
7595 is_synthesized);
7596
7597 if (field)
7598 {
7599 class_interface_decl->addDecl(field);
7600
7601#ifdef LLDB_CONFIGURATION_DEBUG
7602 VerifyDecl(field);
7603#endif
7604 }
7605 }
7606 }
7607 return field;
7608}
7609
7610void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007611ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007612{
Greg Claytonf73034f2015-09-08 18:15:05 +00007613 if (!type)
7614 return;
7615
7616 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007617 if (!ast)
7618 return;
7619
7620 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7621
7622 if (!record_decl)
7623 return;
7624
7625 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7626
7627 IndirectFieldVector indirect_fields;
7628 clang::RecordDecl::field_iterator field_pos;
7629 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7630 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7631 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7632 {
7633 if (field_pos->isAnonymousStructOrUnion())
7634 {
7635 clang::QualType field_qual_type = field_pos->getType();
7636
7637 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7638
7639 if (!field_record_type)
7640 continue;
7641
7642 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7643
7644 if (!field_record_decl)
7645 continue;
7646
7647 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7648 di != de;
7649 ++di)
7650 {
7651 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7652 {
7653 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7654 chain[0] = *field_pos;
7655 chain[1] = nested_field_decl;
7656 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7657 record_decl,
7658 clang::SourceLocation(),
7659 nested_field_decl->getIdentifier(),
7660 nested_field_decl->getType(),
7661 chain,
7662 2);
7663
7664 indirect_field->setImplicit();
7665
7666 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7667 nested_field_decl->getAccess()));
7668
7669 indirect_fields.push_back(indirect_field);
7670 }
7671 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7672 {
7673 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
7674 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7675 chain[0] = *field_pos;
7676
7677 int chain_index = 1;
7678 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7679 nce = nested_indirect_field_decl->chain_end();
7680 nci < nce;
7681 ++nci)
7682 {
7683 chain[chain_index] = *nci;
7684 chain_index++;
7685 }
7686
7687 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7688 record_decl,
7689 clang::SourceLocation(),
7690 nested_indirect_field_decl->getIdentifier(),
7691 nested_indirect_field_decl->getType(),
7692 chain,
7693 nested_chain_size + 1);
7694
7695 indirect_field->setImplicit();
7696
7697 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7698 nested_indirect_field_decl->getAccess()));
7699
7700 indirect_fields.push_back(indirect_field);
7701 }
7702 }
7703 }
7704 }
7705
7706 // Check the last field to see if it has an incomplete array type as its
7707 // last member and if it does, the tell the record decl about it
7708 if (last_field_pos != field_end_pos)
7709 {
7710 if (last_field_pos->getType()->isIncompleteArrayType())
7711 record_decl->hasFlexibleArrayMember();
7712 }
7713
7714 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7715 ifi < ife;
7716 ++ifi)
7717 {
7718 record_decl->addDecl(*ifi);
7719 }
7720}
7721
7722void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007723ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007724{
Greg Claytonf73034f2015-09-08 18:15:05 +00007725 if (type)
7726 {
7727 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7728 if (ast)
7729 {
7730 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007731
Greg Claytonf73034f2015-09-08 18:15:05 +00007732 if (!record_decl)
7733 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00007734
Greg Claytonf73034f2015-09-08 18:15:05 +00007735 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*ast->getASTContext()));
7736 }
7737 }
Greg Claytond8d4a572015-08-11 21:38:15 +00007738}
7739
7740clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007741ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7742 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007743 AccessType access)
7744{
7745 clang::VarDecl *var_decl = nullptr;
7746
7747 if (!type.IsValid() || !var_type.IsValid())
7748 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007749 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007750 if (!ast)
7751 return nullptr;
7752
7753 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7754 if (record_decl)
7755 {
7756 var_decl = clang::VarDecl::Create (*ast->getASTContext(), // ASTContext &
7757 record_decl, // DeclContext *
7758 clang::SourceLocation(), // clang::SourceLocation StartLoc
7759 clang::SourceLocation(), // clang::SourceLocation IdLoc
7760 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7761 GetQualType(var_type), // Variable clang::QualType
7762 nullptr, // TypeSourceInfo *
7763 clang::SC_Static); // StorageClass
7764 if (var_decl)
7765 {
7766 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7767 record_decl->addDecl(var_decl);
7768
7769#ifdef LLDB_CONFIGURATION_DEBUG
7770 VerifyDecl(var_decl);
7771#endif
7772 }
7773 }
7774 return var_decl;
7775}
7776
7777
7778clang::CXXMethodDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007779ClangASTContext::AddMethodToCXXRecordType (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007780 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007781 lldb::AccessType access,
7782 bool is_virtual,
7783 bool is_static,
7784 bool is_inline,
7785 bool is_explicit,
7786 bool is_attr_used,
7787 bool is_artificial)
7788{
7789 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7790 return nullptr;
7791
7792 clang::QualType record_qual_type(GetCanonicalQualType(type));
7793
7794 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7795
7796 if (cxx_record_decl == nullptr)
7797 return nullptr;
7798
7799 clang::QualType method_qual_type (GetQualType(method_clang_type));
7800
7801 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7802
7803 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7804
7805 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7806
7807 if (function_type == nullptr)
7808 return nullptr;
7809
7810 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7811
7812 if (!method_function_prototype)
7813 return nullptr;
7814
7815 unsigned int num_params = method_function_prototype->getNumParams();
7816
7817 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7818 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7819
7820 if (is_artificial)
7821 return nullptr; // skip everything artificial
7822
7823 if (name[0] == '~')
7824 {
7825 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7826 cxx_record_decl,
7827 clang::SourceLocation(),
7828 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7829 method_qual_type,
7830 nullptr,
7831 is_inline,
7832 is_artificial);
7833 cxx_method_decl = cxx_dtor_decl;
7834 }
7835 else if (decl_name == cxx_record_decl->getDeclName())
7836 {
7837 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
7838 cxx_record_decl,
7839 clang::SourceLocation(),
7840 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7841 method_qual_type,
7842 nullptr, // TypeSourceInfo *
7843 is_explicit,
7844 is_inline,
7845 is_artificial,
7846 false /*is_constexpr*/);
7847 cxx_method_decl = cxx_ctor_decl;
7848 }
7849 else
7850 {
7851 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7852 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7853
7854 if (IsOperator (name, op_kind))
7855 {
7856 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
7857 {
7858 // Check the number of operator parameters. Sometimes we have
7859 // seen bad DWARF that doesn't correctly describe operators and
7860 // if we try to create a method and add it to the class, clang
7861 // will assert and crash, so we need to make sure things are
7862 // acceptable.
7863 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
7864 return nullptr;
7865 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7866 cxx_record_decl,
7867 clang::SourceLocation(),
7868 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
7869 method_qual_type,
7870 nullptr, // TypeSourceInfo *
7871 SC,
7872 is_inline,
7873 false /*is_constexpr*/,
7874 clang::SourceLocation());
7875 }
7876 else if (num_params == 0)
7877 {
7878 // Conversion operators don't take params...
7879 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
7880 cxx_record_decl,
7881 clang::SourceLocation(),
7882 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
7883 method_qual_type,
7884 nullptr, // TypeSourceInfo *
7885 is_inline,
7886 is_explicit,
7887 false /*is_constexpr*/,
7888 clang::SourceLocation());
7889 }
7890 }
7891
7892 if (cxx_method_decl == nullptr)
7893 {
7894 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7895 cxx_record_decl,
7896 clang::SourceLocation(),
7897 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
7898 method_qual_type,
7899 nullptr, // TypeSourceInfo *
7900 SC,
7901 is_inline,
7902 false /*is_constexpr*/,
7903 clang::SourceLocation());
7904 }
7905 }
7906
7907 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
7908
7909 cxx_method_decl->setAccess (access_specifier);
7910 cxx_method_decl->setVirtualAsWritten (is_virtual);
7911
7912 if (is_attr_used)
7913 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
7914
7915 // Populate the method decl with parameter decls
7916
7917 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7918
7919 for (unsigned param_index = 0;
7920 param_index < num_params;
7921 ++param_index)
7922 {
7923 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
7924 cxx_method_decl,
7925 clang::SourceLocation(),
7926 clang::SourceLocation(),
7927 nullptr, // anonymous
7928 method_function_prototype->getParamType(param_index),
7929 nullptr,
7930 clang::SC_None,
7931 nullptr));
7932 }
7933
7934 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
7935
7936 cxx_record_decl->addDecl (cxx_method_decl);
7937
7938 // Sometimes the debug info will mention a constructor (default/copy/move),
7939 // destructor, or assignment operator (copy/move) but there won't be any
7940 // version of this in the code. So we check if the function was artificially
7941 // generated and if it is trivial and this lets the compiler/backend know
7942 // that it can inline the IR for these when it needs to and we can avoid a
7943 // "missing function" error when running expressions.
7944
7945 if (is_artificial)
7946 {
7947 if (cxx_ctor_decl &&
7948 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
7949 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
7950 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
7951 {
7952 cxx_ctor_decl->setDefaulted();
7953 cxx_ctor_decl->setTrivial(true);
7954 }
7955 else if (cxx_dtor_decl)
7956 {
7957 if (cxx_record_decl->hasTrivialDestructor())
7958 {
7959 cxx_dtor_decl->setDefaulted();
7960 cxx_dtor_decl->setTrivial(true);
7961 }
7962 }
7963 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
7964 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
7965 {
7966 cxx_method_decl->setDefaulted();
7967 cxx_method_decl->setTrivial(true);
7968 }
7969 }
7970
7971#ifdef LLDB_CONFIGURATION_DEBUG
7972 VerifyDecl(cxx_method_decl);
7973#endif
7974
7975 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
7976 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
7977 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
7978 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
7979 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
7980 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
7981 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
7982 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
7983 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
7984 return cxx_method_decl;
7985}
7986
7987
7988#pragma mark C++ Base Classes
7989
7990clang::CXXBaseSpecifier *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007991ClangASTContext::CreateBaseClassSpecifier (lldb::opaque_compiler_type_t type, AccessType access, bool is_virtual, bool base_of_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007992{
7993 if (type)
7994 return new clang::CXXBaseSpecifier (clang::SourceRange(),
7995 is_virtual,
7996 base_of_class,
7997 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
7998 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
7999 clang::SourceLocation());
8000 return nullptr;
8001}
8002
8003void
8004ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
8005{
8006 for (unsigned i=0; i<num_base_classes; ++i)
8007 {
8008 delete base_classes[i];
8009 base_classes[i] = nullptr;
8010 }
8011}
8012
8013bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008014ClangASTContext::SetBaseClassesForClassType (lldb::opaque_compiler_type_t type, clang::CXXBaseSpecifier const * const *base_classes,
Greg Claytond8d4a572015-08-11 21:38:15 +00008015 unsigned num_base_classes)
8016{
8017 if (type)
8018 {
8019 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
8020 if (cxx_record_decl)
8021 {
8022 cxx_record_decl->setBases(base_classes, num_base_classes);
8023 return true;
8024 }
8025 }
8026 return false;
8027}
8028
8029bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008030ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008031{
Greg Claytonf73034f2015-09-08 18:15:05 +00008032 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008033 if (!ast)
8034 return false;
8035 clang::ASTContext* clang_ast = ast->getASTContext();
8036
8037 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
8038 {
8039 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8040 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
8041 if (class_interface_decl && super_interface_decl)
8042 {
8043 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
8044 return true;
8045 }
8046 }
8047 return false;
8048}
8049
8050bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008051ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008052 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00008053 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008054 clang::ObjCIvarDecl *ivar_decl,
8055 const char *property_setter_name,
8056 const char *property_getter_name,
8057 uint32_t property_attributes,
8058 ClangASTMetadata *metadata)
8059{
8060 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
8061 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00008062 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008063 if (!ast)
8064 return false;
8065 clang::ASTContext* clang_ast = ast->getASTContext();
8066
8067 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8068
8069 if (class_interface_decl)
8070 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008071 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00008072
8073 if (property_clang_type.IsValid())
8074 property_clang_type_to_access = property_clang_type;
8075 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008076 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008077
8078 if (class_interface_decl && property_clang_type_to_access.IsValid())
8079 {
8080 clang::TypeSourceInfo *prop_type_source;
8081 if (ivar_decl)
8082 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
8083 else
8084 prop_type_source = clang_ast->getTrivialTypeSourceInfo (GetQualType(property_clang_type));
8085
8086 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create (*clang_ast,
8087 class_interface_decl,
8088 clang::SourceLocation(), // Source Location
8089 &clang_ast->Idents.get(property_name),
8090 clang::SourceLocation(), //Source Location for AT
8091 clang::SourceLocation(), //Source location for (
8092 ivar_decl ? ivar_decl->getType() : ClangASTContext::GetQualType(property_clang_type),
8093 prop_type_source);
8094
8095 if (property_decl)
8096 {
8097 if (metadata)
8098 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
8099
8100 class_interface_decl->addDecl (property_decl);
8101
8102 clang::Selector setter_sel, getter_sel;
8103
8104 if (property_setter_name != nullptr)
8105 {
8106 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
8107 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
8108 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
8109 }
8110 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
8111 {
8112 std::string setter_sel_string("set");
8113 setter_sel_string.push_back(::toupper(property_name[0]));
8114 setter_sel_string.append(&property_name[1]);
8115 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
8116 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
8117 }
8118 property_decl->setSetterName(setter_sel);
8119 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
8120
8121 if (property_getter_name != nullptr)
8122 {
8123 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
8124 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
8125 }
8126 else
8127 {
8128 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
8129 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
8130 }
8131 property_decl->setGetterName(getter_sel);
8132 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
8133
8134 if (ivar_decl)
8135 property_decl->setPropertyIvarDecl (ivar_decl);
8136
8137 if (property_attributes & DW_APPLE_PROPERTY_readonly)
8138 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
8139 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
8140 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
8141 if (property_attributes & DW_APPLE_PROPERTY_assign)
8142 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
8143 if (property_attributes & DW_APPLE_PROPERTY_retain)
8144 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
8145 if (property_attributes & DW_APPLE_PROPERTY_copy)
8146 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
8147 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
8148 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
8149
8150 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
8151 {
8152 const bool isInstance = true;
8153 const bool isVariadic = false;
8154 const bool isSynthesized = false;
8155 const bool isImplicitlyDeclared = true;
8156 const bool isDefined = false;
8157 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8158 const bool HasRelatedResultType = false;
8159
8160 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create (*clang_ast,
8161 clang::SourceLocation(),
8162 clang::SourceLocation(),
8163 getter_sel,
8164 GetQualType(property_clang_type_to_access),
8165 nullptr,
8166 class_interface_decl,
8167 isInstance,
8168 isVariadic,
8169 isSynthesized,
8170 isImplicitlyDeclared,
8171 isDefined,
8172 impControl,
8173 HasRelatedResultType);
8174
8175 if (getter && metadata)
8176 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
8177
8178 if (getter)
8179 {
8180 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
8181
8182 class_interface_decl->addDecl(getter);
8183 }
8184 }
8185
8186 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
8187 {
8188 clang::QualType result_type = clang_ast->VoidTy;
8189
8190 const bool isInstance = true;
8191 const bool isVariadic = false;
8192 const bool isSynthesized = false;
8193 const bool isImplicitlyDeclared = true;
8194 const bool isDefined = false;
8195 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8196 const bool HasRelatedResultType = false;
8197
8198 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
8199 clang::SourceLocation(),
8200 clang::SourceLocation(),
8201 setter_sel,
8202 result_type,
8203 nullptr,
8204 class_interface_decl,
8205 isInstance,
8206 isVariadic,
8207 isSynthesized,
8208 isImplicitlyDeclared,
8209 isDefined,
8210 impControl,
8211 HasRelatedResultType);
8212
8213 if (setter && metadata)
8214 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
8215
8216 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
8217
8218 params.push_back (clang::ParmVarDecl::Create (*clang_ast,
8219 setter,
8220 clang::SourceLocation(),
8221 clang::SourceLocation(),
8222 nullptr, // anonymous
8223 GetQualType(property_clang_type_to_access),
8224 nullptr,
8225 clang::SC_Auto,
8226 nullptr));
8227
8228 if (setter)
8229 {
8230 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8231
8232 class_interface_decl->addDecl(setter);
8233 }
8234 }
8235
8236 return true;
8237 }
8238 }
8239 }
8240 return false;
8241}
8242
8243bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008244ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00008245{
8246 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8247 if (class_interface_decl)
8248 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
8249 return false;
8250}
8251
8252
8253clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00008254ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008255 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 +00008256 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008257 lldb::AccessType access,
8258 bool is_artificial)
8259{
8260 if (!type || !method_clang_type.IsValid())
8261 return nullptr;
8262
8263 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
8264
8265 if (class_interface_decl == nullptr)
8266 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00008267 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8268 if (lldb_ast == nullptr)
8269 return nullptr;
8270 clang::ASTContext *ast = lldb_ast->getASTContext();
8271
Greg Claytond8d4a572015-08-11 21:38:15 +00008272 const char *selector_start = ::strchr (name, ' ');
8273 if (selector_start == nullptr)
8274 return nullptr;
8275
8276 selector_start++;
8277 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
8278
8279 size_t len = 0;
8280 const char *start;
8281 //printf ("name = '%s'\n", name);
8282
8283 unsigned num_selectors_with_args = 0;
8284 for (start = selector_start;
8285 start && *start != '\0' && *start != ']';
8286 start += len)
8287 {
8288 len = ::strcspn(start, ":]");
8289 bool has_arg = (start[len] == ':');
8290 if (has_arg)
8291 ++num_selectors_with_args;
8292 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
8293 if (has_arg)
8294 len += 1;
8295 }
8296
8297
8298 if (selector_idents.size() == 0)
8299 return nullptr;
8300
8301 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
8302 selector_idents.data());
8303
8304 clang::QualType method_qual_type (GetQualType(method_clang_type));
8305
8306 // Populate the method decl with parameter decls
8307 const clang::Type *method_type(method_qual_type.getTypePtr());
8308
8309 if (method_type == nullptr)
8310 return nullptr;
8311
8312 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
8313
8314 if (!method_function_prototype)
8315 return nullptr;
8316
8317
8318 bool is_variadic = false;
8319 bool is_synthesized = false;
8320 bool is_defined = false;
8321 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
8322
8323 const unsigned num_args = method_function_prototype->getNumParams();
8324
8325 if (num_args != num_selectors_with_args)
8326 return nullptr; // some debug information is corrupt. We are not going to deal with it.
8327
8328 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create (*ast,
8329 clang::SourceLocation(), // beginLoc,
8330 clang::SourceLocation(), // endLoc,
8331 method_selector,
8332 method_function_prototype->getReturnType(),
8333 nullptr, // TypeSourceInfo *ResultTInfo,
8334 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(GetQualType(type)),
8335 name[0] == '-',
8336 is_variadic,
8337 is_synthesized,
8338 true, // is_implicitly_declared; we force this to true because we don't have source locations
8339 is_defined,
8340 imp_control,
8341 false /*has_related_result_type*/);
8342
8343
8344 if (objc_method_decl == nullptr)
8345 return nullptr;
8346
8347 if (num_args > 0)
8348 {
8349 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
8350
8351 for (unsigned param_index = 0; param_index < num_args; ++param_index)
8352 {
8353 params.push_back (clang::ParmVarDecl::Create (*ast,
8354 objc_method_decl,
8355 clang::SourceLocation(),
8356 clang::SourceLocation(),
8357 nullptr, // anonymous
8358 method_function_prototype->getParamType(param_index),
8359 nullptr,
8360 clang::SC_Auto,
8361 nullptr));
8362 }
8363
8364 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8365 }
8366
8367 class_interface_decl->addDecl (objc_method_decl);
8368
8369#ifdef LLDB_CONFIGURATION_DEBUG
8370 VerifyDecl(objc_method_decl);
8371#endif
8372
8373 return objc_method_decl;
8374}
8375
8376bool
Greg Claytone6b36cd2015-12-08 01:02:08 +00008377ClangASTContext::GetHasExternalStorage (const CompilerType &type)
8378{
8379 if (IsClangType(type))
8380 return false;
8381
8382 clang::QualType qual_type (GetCanonicalQualType(type));
8383
8384 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8385 switch (type_class)
8386 {
8387 case clang::Type::Record:
8388 {
8389 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8390 if (cxx_record_decl)
8391 return cxx_record_decl->hasExternalLexicalStorage () || cxx_record_decl->hasExternalVisibleStorage();
8392 }
8393 break;
8394
8395 case clang::Type::Enum:
8396 {
8397 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8398 if (enum_decl)
8399 return enum_decl->hasExternalLexicalStorage () || enum_decl->hasExternalVisibleStorage();
8400 }
8401 break;
8402
8403 case clang::Type::ObjCObject:
8404 case clang::Type::ObjCInterface:
8405 {
8406 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8407 assert (objc_class_type);
8408 if (objc_class_type)
8409 {
8410 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8411
8412 if (class_interface_decl)
8413 return class_interface_decl->hasExternalLexicalStorage () || class_interface_decl->hasExternalVisibleStorage ();
8414 }
8415 }
8416 break;
8417
8418 case clang::Type::Typedef:
8419 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()));
8420
Enrico Granata36f51e42015-12-18 22:41:25 +00008421 case clang::Type::Auto:
8422 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()));
8423
Greg Claytone6b36cd2015-12-08 01:02:08 +00008424 case clang::Type::Elaborated:
8425 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
8426
8427 case clang::Type::Paren:
8428 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
8429
8430 default:
8431 break;
8432 }
8433 return false;
8434}
8435
8436
8437bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008438ClangASTContext::SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool has_extern)
Greg Claytond8d4a572015-08-11 21:38:15 +00008439{
8440 if (!type)
8441 return false;
8442
8443 clang::QualType qual_type (GetCanonicalQualType(type));
8444
8445 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8446 switch (type_class)
8447 {
8448 case clang::Type::Record:
8449 {
8450 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8451 if (cxx_record_decl)
8452 {
8453 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
8454 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
8455 return true;
8456 }
8457 }
8458 break;
8459
8460 case clang::Type::Enum:
8461 {
8462 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8463 if (enum_decl)
8464 {
8465 enum_decl->setHasExternalLexicalStorage (has_extern);
8466 enum_decl->setHasExternalVisibleStorage (has_extern);
8467 return true;
8468 }
8469 }
8470 break;
8471
8472 case clang::Type::ObjCObject:
8473 case clang::Type::ObjCInterface:
8474 {
8475 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8476 assert (objc_class_type);
8477 if (objc_class_type)
8478 {
8479 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8480
8481 if (class_interface_decl)
8482 {
8483 class_interface_decl->setHasExternalLexicalStorage (has_extern);
8484 class_interface_decl->setHasExternalVisibleStorage (has_extern);
8485 return true;
8486 }
8487 }
8488 }
8489 break;
8490
8491 case clang::Type::Typedef:
8492 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Enrico Granata36f51e42015-12-18 22:41:25 +00008493
8494 case clang::Type::Auto:
8495 return SetHasExternalStorage (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), has_extern);
Greg Claytond8d4a572015-08-11 21:38:15 +00008496
8497 case clang::Type::Elaborated:
8498 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
8499
8500 case clang::Type::Paren:
8501 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
8502
8503 default:
8504 break;
8505 }
8506 return false;
8507}
8508
8509
Greg Claytone6b36cd2015-12-08 01:02:08 +00008510bool
8511ClangASTContext::CanImport (const CompilerType &type, lldb_private::ClangASTImporter &importer)
8512{
8513 if (IsClangType(type))
8514 {
8515 // TODO: remove external completion BOOL
8516 // CompleteAndFetchChildren should get the Decl out and check for the
8517
8518 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
8519
8520 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8521 switch (type_class)
8522 {
8523 case clang::Type::Record:
8524 {
8525 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8526 if (cxx_record_decl)
8527 {
8528 if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL))
8529 return true;
8530 }
8531 }
8532 break;
8533
8534 case clang::Type::Enum:
8535 {
8536 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8537 if (enum_decl)
8538 {
8539 if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL))
8540 return true;
8541 }
8542 }
8543 break;
8544
8545 case clang::Type::ObjCObject:
8546 case clang::Type::ObjCInterface:
8547 {
8548 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
8549 if (objc_class_type)
8550 {
8551 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8552 // We currently can't complete objective C types through the newly added ASTContext
8553 // because it only supports TagDecl objects right now...
8554 if (class_interface_decl)
8555 {
8556 if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL))
8557 return true;
8558 }
8559 }
8560 }
8561 break;
8562
8563
8564 case clang::Type::Typedef:
8565 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer);
8566
Enrico Granata36f51e42015-12-18 22:41:25 +00008567 case clang::Type::Auto:
8568 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()), importer);
8569
Greg Claytone6b36cd2015-12-08 01:02:08 +00008570 case clang::Type::Elaborated:
8571 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer);
8572
8573 case clang::Type::Paren:
8574 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer);
8575
8576 default:
8577 break;
8578 }
8579 }
8580 return false;
8581}
8582bool
8583ClangASTContext::Import (const CompilerType &type, lldb_private::ClangASTImporter &importer)
8584{
8585 if (IsClangType(type))
8586 {
8587 // TODO: remove external completion BOOL
8588 // CompleteAndFetchChildren should get the Decl out and check for the
8589
8590 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
8591
8592 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8593 switch (type_class)
8594 {
8595 case clang::Type::Record:
8596 {
8597 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8598 if (cxx_record_decl)
8599 {
8600 if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL))
8601 return importer.CompleteAndFetchChildren(qual_type);
8602 }
8603 }
8604 break;
8605
8606 case clang::Type::Enum:
8607 {
8608 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8609 if (enum_decl)
8610 {
8611 if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL))
8612 return importer.CompleteAndFetchChildren(qual_type);
8613 }
8614 }
8615 break;
8616
8617 case clang::Type::ObjCObject:
8618 case clang::Type::ObjCInterface:
8619 {
8620 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
8621 if (objc_class_type)
8622 {
8623 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8624 // We currently can't complete objective C types through the newly added ASTContext
8625 // because it only supports TagDecl objects right now...
8626 if (class_interface_decl)
8627 {
8628 if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL))
8629 return importer.CompleteAndFetchChildren(qual_type);
8630 }
8631 }
8632 }
8633 break;
8634
8635
8636 case clang::Type::Typedef:
8637 return Import (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer);
8638
Enrico Granata36f51e42015-12-18 22:41:25 +00008639 case clang::Type::Auto:
8640 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()), importer);
8641
Greg Claytone6b36cd2015-12-08 01:02:08 +00008642 case clang::Type::Elaborated:
8643 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer);
8644
8645 case clang::Type::Paren:
8646 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer);
8647
8648 default:
8649 break;
8650 }
8651 }
8652 return false;
8653}
8654
8655
Greg Claytond8d4a572015-08-11 21:38:15 +00008656#pragma mark TagDecl
8657
8658bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008659ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008660{
Greg Claytone6b36cd2015-12-08 01:02:08 +00008661 clang::QualType qual_type (ClangASTContext::GetQualType(type));
8662 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008663 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008664 const clang::TagType *tag_type = qual_type->getAs<clang::TagType>();
8665 if (tag_type)
Greg Clayton5dfc4a42015-12-02 00:43:32 +00008666 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008667 clang::TagDecl *tag_decl = tag_type->getDecl();
8668 if (tag_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00008669 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008670 tag_decl->startDefinition();
8671 return true;
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008672 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00008673 }
8674
8675 const clang::ObjCObjectType *object_type = qual_type->getAs<clang::ObjCObjectType>();
8676 if (object_type)
8677 {
8678 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
8679 if (interface_decl)
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008680 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008681 interface_decl->startDefinition();
8682 return true;
Greg Claytond8d4a572015-08-11 21:38:15 +00008683 }
8684 }
8685 }
8686 return false;
8687}
8688
8689bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008690ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008691{
Greg Claytone6b36cd2015-12-08 01:02:08 +00008692 clang::QualType qual_type (ClangASTContext::GetQualType(type));
8693 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008694 {
Greg Claytond8d4a572015-08-11 21:38:15 +00008695 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8696
8697 if (cxx_record_decl)
8698 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008699 if (!cxx_record_decl->isCompleteDefinition())
8700 cxx_record_decl->completeDefinition();
8701 cxx_record_decl->setHasLoadedFieldsFromExternalStorage(true);
8702 cxx_record_decl->setHasExternalLexicalStorage (false);
8703 cxx_record_decl->setHasExternalVisibleStorage (false);
Greg Claytond8d4a572015-08-11 21:38:15 +00008704 return true;
8705 }
8706
Greg Claytone6b36cd2015-12-08 01:02:08 +00008707 const clang::EnumType *enutype = qual_type->getAs<clang::EnumType>();
Greg Claytond8d4a572015-08-11 21:38:15 +00008708
8709 if (enutype)
8710 {
8711 clang::EnumDecl *enum_decl = enutype->getDecl();
8712
8713 if (enum_decl)
8714 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008715 if (!enum_decl->isCompleteDefinition())
Greg Claytond8d4a572015-08-11 21:38:15 +00008716 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008717 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8718 if (lldb_ast == nullptr)
8719 return false;
8720 clang::ASTContext *ast = lldb_ast->getASTContext();
8721
8722 /// TODO This really needs to be fixed.
8723
8724 unsigned NumPositiveBits = 1;
8725 unsigned NumNegativeBits = 0;
8726
8727 clang::QualType promotion_qual_type;
8728 // If the enum integer type is less than an integer in bit width,
8729 // then we must promote it to an integer size.
8730 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
8731 {
8732 if (enum_decl->getIntegerType()->isSignedIntegerType())
8733 promotion_qual_type = ast->IntTy;
8734 else
8735 promotion_qual_type = ast->UnsignedIntTy;
8736 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008737 else
Greg Claytone6b36cd2015-12-08 01:02:08 +00008738 promotion_qual_type = enum_decl->getIntegerType();
8739
8740 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Claytond8d4a572015-08-11 21:38:15 +00008741 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008742 return true;
8743 }
8744 }
8745 }
8746 return false;
8747}
8748
Greg Claytond8d4a572015-08-11 21:38:15 +00008749bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008750ClangASTContext::AddEnumerationValueToEnumerationType (lldb::opaque_compiler_type_t type,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008751 const CompilerType &enumerator_clang_type,
8752 const Declaration &decl,
8753 const char *name,
8754 int64_t enum_value,
8755 uint32_t enum_value_bit_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008756{
8757 if (type && enumerator_clang_type.IsValid() && name && name[0])
8758 {
8759 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8760
8761 bool is_signed = false;
8762 enumerator_clang_type.IsIntegerType (is_signed);
8763 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8764 if (clang_type)
8765 {
8766 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8767
8768 if (enutype)
8769 {
8770 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
8771 enum_llvm_apsint = enum_value;
8772 clang::EnumConstantDecl *enumerator_decl =
8773 clang::EnumConstantDecl::Create (*getASTContext(),
8774 enutype->getDecl(),
8775 clang::SourceLocation(),
8776 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
8777 GetQualType(enumerator_clang_type),
8778 nullptr,
8779 enum_llvm_apsint);
8780
8781 if (enumerator_decl)
8782 {
8783 enutype->getDecl()->addDecl(enumerator_decl);
8784
8785#ifdef LLDB_CONFIGURATION_DEBUG
8786 VerifyDecl(enumerator_decl);
8787#endif
8788
8789 return true;
8790 }
8791 }
8792 }
8793 }
8794 return false;
8795}
8796
Greg Claytona1e5dc82015-08-11 22:53:00 +00008797CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008798ClangASTContext::GetEnumerationIntegerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008799{
8800 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8801 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8802 if (clang_type)
8803 {
8804 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8805 if (enutype)
8806 {
8807 clang::EnumDecl *enum_decl = enutype->getDecl();
8808 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008809 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008810 }
8811 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008812 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008813}
8814
Greg Claytona1e5dc82015-08-11 22:53:00 +00008815CompilerType
8816ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008817{
8818 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8819 {
Greg Claytonf73034f2015-09-08 18:15:05 +00008820 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008821 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008822 return CompilerType();
8823 return CompilerType (ast->getASTContext(),
Greg Claytond8d4a572015-08-11 21:38:15 +00008824 ast->getASTContext()->getMemberPointerType (GetQualType(pointee_type),
8825 GetQualType(type).getTypePtr()));
8826 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008827 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008828}
8829
8830
8831size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008832ClangASTContext::ConvertStringToFloatValue (lldb::opaque_compiler_type_t type, const char *s, uint8_t *dst, size_t dst_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008833{
8834 if (type)
8835 {
8836 clang::QualType qual_type (GetCanonicalQualType(type));
8837 uint32_t count = 0;
8838 bool is_complex = false;
8839 if (IsFloatingPointType (type, count, is_complex))
8840 {
8841 // TODO: handle complex and vector types
8842 if (count != 1)
8843 return false;
8844
8845 llvm::StringRef s_sref(s);
8846 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8847
8848 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8849 const uint64_t byte_size = bit_size / 8;
8850 if (dst_size >= byte_size)
8851 {
8852 if (bit_size == sizeof(float)*8)
8853 {
8854 float float32 = ap_float.convertToFloat();
8855 ::memcpy (dst, &float32, byte_size);
8856 return byte_size;
8857 }
8858 else if (bit_size >= 64)
8859 {
8860 llvm::APInt ap_int(ap_float.bitcastToAPInt());
8861 ::memcpy (dst, ap_int.getRawData(), byte_size);
8862 return byte_size;
8863 }
8864 }
8865 }
8866 }
8867 return 0;
8868}
8869
8870
8871
8872//----------------------------------------------------------------------
8873// Dumping types
8874//----------------------------------------------------------------------
8875#define DEPTH_INCREMENT 2
8876
8877void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008878ClangASTContext::DumpValue (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00008879 Stream *s,
8880 lldb::Format format,
8881 const lldb_private::DataExtractor &data,
8882 lldb::offset_t data_byte_offset,
8883 size_t data_byte_size,
8884 uint32_t bitfield_bit_size,
8885 uint32_t bitfield_bit_offset,
8886 bool show_types,
8887 bool show_summary,
8888 bool verbose,
8889 uint32_t depth)
8890{
8891 if (!type)
8892 return;
8893
8894 clang::QualType qual_type(GetQualType(type));
8895 switch (qual_type->getTypeClass())
8896 {
8897 case clang::Type::Record:
8898 if (GetCompleteType(type))
8899 {
8900 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8901 const clang::RecordDecl *record_decl = record_type->getDecl();
8902 assert(record_decl);
8903 uint32_t field_bit_offset = 0;
8904 uint32_t field_byte_offset = 0;
8905 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8906 uint32_t child_idx = 0;
8907
8908 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8909 if (cxx_record_decl)
8910 {
8911 // We might have base classes to print out first
8912 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8913 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8914 base_class != base_class_end;
8915 ++base_class)
8916 {
8917 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8918
8919 // Skip empty base classes
8920 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8921 continue;
8922
8923 if (base_class->isVirtual())
8924 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8925 else
8926 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8927 field_byte_offset = field_bit_offset / 8;
8928 assert (field_bit_offset % 8 == 0);
8929 if (child_idx == 0)
8930 s->PutChar('{');
8931 else
8932 s->PutChar(',');
8933
8934 clang::QualType base_class_qual_type = base_class->getType();
8935 std::string base_class_type_name(base_class_qual_type.getAsString());
8936
8937 // Indent and print the base class type name
8938 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8939
8940 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8941
8942 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008943 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008944 base_clang_type.DumpValue (exe_ctx,
8945 s, // Stream to dump to
8946 base_clang_type.GetFormat(), // The format with which to display the member
8947 data, // Data buffer containing all bytes for this type
8948 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8949 base_class_type_info.Width / 8, // Size of this type in bytes
8950 0, // Bitfield bit size
8951 0, // Bitfield bit offset
8952 show_types, // Boolean indicating if we should show the variable types
8953 show_summary, // Boolean indicating if we should show a summary for the current type
8954 verbose, // Verbose output?
8955 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8956
8957 ++child_idx;
8958 }
8959 }
8960 uint32_t field_idx = 0;
8961 clang::RecordDecl::field_iterator field, field_end;
8962 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8963 {
8964 // Print the starting squiggly bracket (if this is the
8965 // first member) or comma (for member 2 and beyond) for
8966 // the struct/union/class member.
8967 if (child_idx == 0)
8968 s->PutChar('{');
8969 else
8970 s->PutChar(',');
8971
8972 // Indent
8973 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8974
8975 clang::QualType field_type = field->getType();
8976 // Print the member type if requested
8977 // Figure out the type byte size (field_type_info.first) and
8978 // alignment (field_type_info.second) from the AST context.
8979 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8980 assert(field_idx < record_layout.getFieldCount());
8981 // Figure out the field offset within the current struct/union/class type
8982 field_bit_offset = record_layout.getFieldOffset (field_idx);
8983 field_byte_offset = field_bit_offset / 8;
8984 uint32_t field_bitfield_bit_size = 0;
8985 uint32_t field_bitfield_bit_offset = 0;
8986 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8987 field_bitfield_bit_offset = field_bit_offset % 8;
8988
8989 if (show_types)
8990 {
8991 std::string field_type_name(field_type.getAsString());
8992 if (field_bitfield_bit_size > 0)
8993 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
8994 else
8995 s->Printf("(%s) ", field_type_name.c_str());
8996 }
8997 // Print the member name and equal sign
8998 s->Printf("%s = ", field->getNameAsString().c_str());
8999
9000
9001 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00009002 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009003 field_clang_type.DumpValue (exe_ctx,
9004 s, // Stream to dump to
9005 field_clang_type.GetFormat(), // The format with which to display the member
9006 data, // Data buffer containing all bytes for this type
9007 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
9008 field_type_info.Width / 8, // Size of this type in bytes
9009 field_bitfield_bit_size, // Bitfield bit size
9010 field_bitfield_bit_offset, // Bitfield bit offset
9011 show_types, // Boolean indicating if we should show the variable types
9012 show_summary, // Boolean indicating if we should show a summary for the current type
9013 verbose, // Verbose output?
9014 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
9015 }
9016
9017 // Indent the trailing squiggly bracket
9018 if (child_idx > 0)
9019 s->Printf("\n%*s}", depth, "");
9020 }
9021 return;
9022
9023 case clang::Type::Enum:
9024 if (GetCompleteType(type))
9025 {
9026 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
9027 const clang::EnumDecl *enum_decl = enutype->getDecl();
9028 assert(enum_decl);
9029 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
9030 lldb::offset_t offset = data_byte_offset;
9031 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
9032 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9033 {
9034 if (enum_pos->getInitVal() == enum_value)
9035 {
9036 s->Printf("%s", enum_pos->getNameAsString().c_str());
9037 return;
9038 }
9039 }
9040 // If we have gotten here we didn't get find the enumerator in the
9041 // enum decl, so just print the integer.
9042 s->Printf("%" PRIi64, enum_value);
9043 }
9044 return;
9045
9046 case clang::Type::ConstantArray:
9047 {
9048 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
9049 bool is_array_of_characters = false;
9050 clang::QualType element_qual_type = array->getElementType();
9051
9052 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
9053 if (canonical_type)
9054 is_array_of_characters = canonical_type->isCharType();
9055
9056 const uint64_t element_count = array->getSize().getLimitedValue();
9057
9058 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
9059
9060 uint32_t element_idx = 0;
9061 uint32_t element_offset = 0;
9062 uint64_t element_byte_size = field_type_info.Width / 8;
9063 uint32_t element_stride = element_byte_size;
9064
9065 if (is_array_of_characters)
9066 {
9067 s->PutChar('"');
9068 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
9069 s->PutChar('"');
9070 return;
9071 }
9072 else
9073 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00009074 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009075 lldb::Format element_format = element_clang_type.GetFormat();
9076
9077 for (element_idx = 0; element_idx < element_count; ++element_idx)
9078 {
9079 // Print the starting squiggly bracket (if this is the
9080 // first member) or comman (for member 2 and beyong) for
9081 // the struct/union/class member.
9082 if (element_idx == 0)
9083 s->PutChar('{');
9084 else
9085 s->PutChar(',');
9086
9087 // Indent and print the index
9088 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
9089
9090 // Figure out the field offset within the current struct/union/class type
9091 element_offset = element_idx * element_stride;
9092
9093 // Dump the value of the member
9094 element_clang_type.DumpValue (exe_ctx,
9095 s, // Stream to dump to
9096 element_format, // The format with which to display the element
9097 data, // Data buffer containing all bytes for this type
9098 data_byte_offset + element_offset,// Offset into "data" where to grab value from
9099 element_byte_size, // Size of this type in bytes
9100 0, // Bitfield bit size
9101 0, // Bitfield bit offset
9102 show_types, // Boolean indicating if we should show the variable types
9103 show_summary, // Boolean indicating if we should show a summary for the current type
9104 verbose, // Verbose output?
9105 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
9106 }
9107
9108 // Indent the trailing squiggly bracket
9109 if (element_idx > 0)
9110 s->Printf("\n%*s}", depth, "");
9111 }
9112 }
9113 return;
9114
9115 case clang::Type::Typedef:
9116 {
9117 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
9118
Greg Claytona1e5dc82015-08-11 22:53:00 +00009119 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009120 lldb::Format typedef_format = typedef_clang_type.GetFormat();
9121 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
9122 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
9123
9124 return typedef_clang_type.DumpValue (exe_ctx,
9125 s, // Stream to dump to
9126 typedef_format, // The format with which to display the element
9127 data, // Data buffer containing all bytes for this type
9128 data_byte_offset, // Offset into "data" where to grab value from
9129 typedef_byte_size, // Size of this type in bytes
9130 bitfield_bit_size, // Bitfield bit size
9131 bitfield_bit_offset,// Bitfield bit offset
9132 show_types, // Boolean indicating if we should show the variable types
9133 show_summary, // Boolean indicating if we should show a summary for the current type
9134 verbose, // Verbose output?
9135 depth); // Scope depth for any types that have children
9136 }
9137 break;
9138
Enrico Granata36f51e42015-12-18 22:41:25 +00009139 case clang::Type::Auto:
9140 {
9141 clang::QualType elaborated_qual_type = llvm::cast<clang::AutoType>(qual_type)->getDeducedType();
9142 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
9143 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
9144 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
9145 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
9146
9147 return elaborated_clang_type.DumpValue (exe_ctx,
9148 s, // Stream to dump to
9149 elaborated_format, // The format with which to display the element
9150 data, // Data buffer containing all bytes for this type
9151 data_byte_offset, // Offset into "data" where to grab value from
9152 elaborated_byte_size, // Size of this type in bytes
9153 bitfield_bit_size, // Bitfield bit size
9154 bitfield_bit_offset,// Bitfield bit offset
9155 show_types, // Boolean indicating if we should show the variable types
9156 show_summary, // Boolean indicating if we should show a summary for the current type
9157 verbose, // Verbose output?
9158 depth); // Scope depth for any types that have children
9159 }
9160 break;
9161
Greg Claytond8d4a572015-08-11 21:38:15 +00009162 case clang::Type::Elaborated:
9163 {
9164 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009165 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009166 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
9167 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
9168 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
9169
9170 return elaborated_clang_type.DumpValue (exe_ctx,
9171 s, // Stream to dump to
9172 elaborated_format, // The format with which to display the element
9173 data, // Data buffer containing all bytes for this type
9174 data_byte_offset, // Offset into "data" where to grab value from
9175 elaborated_byte_size, // Size of this type in bytes
9176 bitfield_bit_size, // Bitfield bit size
9177 bitfield_bit_offset,// Bitfield bit offset
9178 show_types, // Boolean indicating if we should show the variable types
9179 show_summary, // Boolean indicating if we should show a summary for the current type
9180 verbose, // Verbose output?
9181 depth); // Scope depth for any types that have children
9182 }
9183 break;
9184
9185 case clang::Type::Paren:
9186 {
9187 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009188 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009189
9190 lldb::Format desugar_format = desugar_clang_type.GetFormat();
9191 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
9192 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
9193
9194 return desugar_clang_type.DumpValue (exe_ctx,
9195 s, // Stream to dump to
9196 desugar_format, // The format with which to display the element
9197 data, // Data buffer containing all bytes for this type
9198 data_byte_offset, // Offset into "data" where to grab value from
9199 desugar_byte_size, // Size of this type in bytes
9200 bitfield_bit_size, // Bitfield bit size
9201 bitfield_bit_offset,// Bitfield bit offset
9202 show_types, // Boolean indicating if we should show the variable types
9203 show_summary, // Boolean indicating if we should show a summary for the current type
9204 verbose, // Verbose output?
9205 depth); // Scope depth for any types that have children
9206 }
9207 break;
9208
9209 default:
9210 // We are down to a scalar type that we just need to display.
9211 data.Dump(s,
9212 data_byte_offset,
9213 format,
9214 data_byte_size,
9215 1,
9216 UINT32_MAX,
9217 LLDB_INVALID_ADDRESS,
9218 bitfield_bit_size,
9219 bitfield_bit_offset);
9220
9221 if (show_summary)
9222 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
9223 break;
9224 }
9225}
9226
9227
9228
9229
9230bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009231ClangASTContext::DumpTypeValue (lldb::opaque_compiler_type_t type, Stream *s,
Greg Claytond8d4a572015-08-11 21:38:15 +00009232 lldb::Format format,
9233 const lldb_private::DataExtractor &data,
9234 lldb::offset_t byte_offset,
9235 size_t byte_size,
9236 uint32_t bitfield_bit_size,
9237 uint32_t bitfield_bit_offset,
9238 ExecutionContextScope *exe_scope)
9239{
9240 if (!type)
9241 return false;
9242 if (IsAggregateType(type))
9243 {
9244 return false;
9245 }
9246 else
9247 {
9248 clang::QualType qual_type(GetQualType(type));
9249
9250 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9251 switch (type_class)
9252 {
9253 case clang::Type::Typedef:
9254 {
9255 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009256 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009257 if (format == eFormatDefault)
9258 format = typedef_clang_type.GetFormat();
9259 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
9260 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
9261
9262 return typedef_clang_type.DumpTypeValue (s,
9263 format, // The format with which to display the element
9264 data, // Data buffer containing all bytes for this type
9265 byte_offset, // Offset into "data" where to grab value from
9266 typedef_byte_size, // Size of this type in bytes
9267 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
9268 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
9269 exe_scope);
9270 }
9271 break;
9272
9273 case clang::Type::Enum:
9274 // If our format is enum or default, show the enumeration value as
9275 // its enumeration string value, else just display it as requested.
9276 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
9277 {
9278 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
9279 const clang::EnumDecl *enum_decl = enutype->getDecl();
9280 assert(enum_decl);
9281 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
9282 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
9283 lldb::offset_t offset = byte_offset;
9284 if (is_signed)
9285 {
9286 const int64_t enum_svalue = data.GetMaxS64Bitfield (&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().getSExtValue() == enum_svalue)
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("%" PRIi64, enum_svalue);
9298 }
9299 else
9300 {
9301 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
9302 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9303 {
9304 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
9305 {
9306 s->PutCString (enum_pos->getNameAsString().c_str());
9307 return true;
9308 }
9309 }
9310 // If we have gotten here we didn't get find the enumerator in the
9311 // enum decl, so just print the integer.
9312 s->Printf("%" PRIu64, enum_uvalue);
9313 }
9314 return true;
9315 }
9316 // format was not enum, just fall through and dump the value as requested....
Jason Molenda62e06812016-02-16 04:14:33 +00009317 LLVM_FALLTHROUGH;
Greg Claytond8d4a572015-08-11 21:38:15 +00009318
9319 default:
9320 // We are down to a scalar type that we just need to display.
9321 {
9322 uint32_t item_count = 1;
9323 // A few formats, we might need to modify our size and count for depending
9324 // on how we are trying to display the value...
9325 switch (format)
9326 {
9327 default:
9328 case eFormatBoolean:
9329 case eFormatBinary:
9330 case eFormatComplex:
9331 case eFormatCString: // NULL terminated C strings
9332 case eFormatDecimal:
9333 case eFormatEnum:
9334 case eFormatHex:
9335 case eFormatHexUppercase:
9336 case eFormatFloat:
9337 case eFormatOctal:
9338 case eFormatOSType:
9339 case eFormatUnsigned:
9340 case eFormatPointer:
9341 case eFormatVectorOfChar:
9342 case eFormatVectorOfSInt8:
9343 case eFormatVectorOfUInt8:
9344 case eFormatVectorOfSInt16:
9345 case eFormatVectorOfUInt16:
9346 case eFormatVectorOfSInt32:
9347 case eFormatVectorOfUInt32:
9348 case eFormatVectorOfSInt64:
9349 case eFormatVectorOfUInt64:
9350 case eFormatVectorOfFloat32:
9351 case eFormatVectorOfFloat64:
9352 case eFormatVectorOfUInt128:
9353 break;
9354
9355 case eFormatChar:
9356 case eFormatCharPrintable:
9357 case eFormatCharArray:
9358 case eFormatBytes:
9359 case eFormatBytesWithASCII:
9360 item_count = byte_size;
9361 byte_size = 1;
9362 break;
9363
9364 case eFormatUnicode16:
9365 item_count = byte_size / 2;
9366 byte_size = 2;
9367 break;
9368
9369 case eFormatUnicode32:
9370 item_count = byte_size / 4;
9371 byte_size = 4;
9372 break;
9373 }
9374 return data.Dump (s,
9375 byte_offset,
9376 format,
9377 byte_size,
9378 item_count,
9379 UINT32_MAX,
9380 LLDB_INVALID_ADDRESS,
9381 bitfield_bit_size,
9382 bitfield_bit_offset,
9383 exe_scope);
9384 }
9385 break;
9386 }
9387 }
9388 return 0;
9389}
9390
9391
9392
9393void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009394ClangASTContext::DumpSummary (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00009395 Stream *s,
9396 const lldb_private::DataExtractor &data,
9397 lldb::offset_t data_byte_offset,
9398 size_t data_byte_size)
9399{
9400 uint32_t length = 0;
9401 if (IsCStringType (type, length))
9402 {
9403 if (exe_ctx)
9404 {
9405 Process *process = exe_ctx->GetProcessPtr();
9406 if (process)
9407 {
9408 lldb::offset_t offset = data_byte_offset;
9409 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
9410 std::vector<uint8_t> buf;
9411 if (length > 0)
9412 buf.resize (length);
9413 else
9414 buf.resize (256);
9415
9416 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
9417 buf.back() = '\0';
9418 size_t bytes_read;
9419 size_t total_cstr_len = 0;
9420 Error error;
9421 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
9422 {
9423 const size_t len = strlen((const char *)&buf.front());
9424 if (len == 0)
9425 break;
9426 if (total_cstr_len == 0)
9427 s->PutCString (" \"");
9428 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
9429 total_cstr_len += len;
9430 if (len < buf.size())
9431 break;
9432 pointer_address += total_cstr_len;
9433 }
9434 if (total_cstr_len > 0)
9435 s->PutChar ('"');
9436 }
9437 }
9438 }
9439}
9440
9441void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009442ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00009443{
9444 StreamFile s (stdout, false);
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00009445 DumpTypeDescription (type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009446 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
9447 if (metadata)
9448 {
9449 metadata->Dump (&s);
9450 }
9451}
9452
9453void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009454ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type, Stream *s)
Greg Claytond8d4a572015-08-11 21:38:15 +00009455{
9456 if (type)
9457 {
9458 clang::QualType qual_type(GetQualType(type));
9459
9460 llvm::SmallVector<char, 1024> buf;
9461 llvm::raw_svector_ostream llvm_ostrm (buf);
9462
9463 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9464 switch (type_class)
9465 {
9466 case clang::Type::ObjCObject:
9467 case clang::Type::ObjCInterface:
9468 {
9469 GetCompleteType(type);
9470
9471 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
9472 assert (objc_class_type);
9473 if (objc_class_type)
9474 {
9475 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9476 if (class_interface_decl)
9477 {
9478 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
9479 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
9480 }
9481 }
9482 }
9483 break;
9484
9485 case clang::Type::Typedef:
9486 {
9487 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
9488 if (typedef_type)
9489 {
9490 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
9491 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
9492 if (!clang_typedef_name.empty())
9493 {
9494 s->PutCString ("typedef ");
9495 s->PutCString (clang_typedef_name.c_str());
9496 }
9497 }
9498 }
9499 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00009500
9501 case clang::Type::Auto:
9502 CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).DumpTypeDescription(s);
9503 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00009504
9505 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009506 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009507 return;
9508
9509 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009510 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009511 return;
9512
9513 case clang::Type::Record:
9514 {
9515 GetCompleteType(type);
9516
9517 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
9518 const clang::RecordDecl *record_decl = record_type->getDecl();
9519 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
9520
9521 if (cxx_record_decl)
9522 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9523 else
9524 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9525 }
9526 break;
9527
9528 default:
9529 {
9530 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
9531 if (tag_type)
9532 {
9533 clang::TagDecl *tag_decl = tag_type->getDecl();
9534 if (tag_decl)
9535 tag_decl->print(llvm_ostrm, 0);
9536 }
9537 else
9538 {
9539 std::string clang_type_name(qual_type.getAsString());
9540 if (!clang_type_name.empty())
9541 s->PutCString (clang_type_name.c_str());
9542 }
9543 }
9544 }
9545
Greg Claytond8d4a572015-08-11 21:38:15 +00009546 if (buf.size() > 0)
9547 {
9548 s->Write (buf.data(), buf.size());
9549 }
9550 }
9551}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009552
Greg Claytone6b36cd2015-12-08 01:02:08 +00009553void
9554ClangASTContext::DumpTypeName (const CompilerType &type)
9555{
9556 if (IsClangType(type))
9557 {
9558 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
9559
9560 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9561 switch (type_class)
9562 {
9563 case clang::Type::Record:
9564 {
9565 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
9566 if (cxx_record_decl)
9567 printf("class %s", cxx_record_decl->getName().str().c_str());
9568 }
9569 break;
9570
9571 case clang::Type::Enum:
9572 {
9573 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
9574 if (enum_decl)
9575 {
9576 printf("enum %s", enum_decl->getName().str().c_str());
9577 }
9578 }
9579 break;
9580
9581 case clang::Type::ObjCObject:
9582 case clang::Type::ObjCInterface:
9583 {
9584 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
9585 if (objc_class_type)
9586 {
9587 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9588 // We currently can't complete objective C types through the newly added ASTContext
9589 // because it only supports TagDecl objects right now...
9590 if (class_interface_decl)
9591 printf("@class %s", class_interface_decl->getName().str().c_str());
9592 }
9593 }
9594 break;
9595
9596
9597 case clang::Type::Typedef:
9598 printf("typedef %s", llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getName().str().c_str());
9599 break;
9600
Enrico Granata36f51e42015-12-18 22:41:25 +00009601 case clang::Type::Auto:
9602 printf("auto ");
9603 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()));
9604
Greg Claytone6b36cd2015-12-08 01:02:08 +00009605 case clang::Type::Elaborated:
9606 printf("elaborated ");
9607 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
9608
9609 case clang::Type::Paren:
9610 printf("paren ");
9611 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
9612
9613 default:
9614 printf("ClangASTContext::DumpTypeName() type_class = %u", type_class);
9615 break;
9616 }
9617 }
9618
9619}
9620
9621
9622
Greg Clayton8b4edba2015-08-14 20:02:05 +00009623clang::ClassTemplateDecl *
Greg Clayton6071e6f2015-08-26 22:57:51 +00009624ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009625 lldb::AccessType access_type,
9626 const char *parent_name,
9627 int tag_decl_kind,
9628 const ClangASTContext::TemplateParameterInfos &template_param_infos)
9629{
9630 if (template_param_infos.IsValid())
9631 {
9632 std::string template_basename(parent_name);
9633 template_basename.erase (template_basename.find('<'));
9634
9635 return CreateClassTemplateDecl (decl_ctx,
9636 access_type,
9637 template_basename.c_str(),
9638 tag_decl_kind,
9639 template_param_infos);
9640 }
9641 return NULL;
9642}
9643
Greg Clayton6dc8d582015-08-18 22:32:36 +00009644void
9645ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl)
9646{
9647 ClangASTContext *ast = (ClangASTContext *)baton;
9648 SymbolFile *sym_file = ast->GetSymbolFile();
9649 if (sym_file)
9650 {
9651 CompilerType clang_type = GetTypeForDecl (decl);
9652 if (clang_type)
9653 sym_file->CompleteType (clang_type);
9654 }
9655}
9656
9657void
9658ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
9659{
9660 ClangASTContext *ast = (ClangASTContext *)baton;
9661 SymbolFile *sym_file = ast->GetSymbolFile();
9662 if (sym_file)
9663 {
9664 CompilerType clang_type = GetTypeForDecl (decl);
9665 if (clang_type)
9666 sym_file->CompleteType (clang_type);
9667 }
9668}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009669
Greg Clayton261ac3f2015-08-28 01:01:03 +00009670
9671DWARFASTParser *
9672ClangASTContext::GetDWARFParser ()
9673{
9674 if (!m_dwarf_ast_parser_ap)
9675 m_dwarf_ast_parser_ap.reset(new DWARFASTParserClang(*this));
9676 return m_dwarf_ast_parser_ap.get();
9677}
9678
9679
Greg Clayton8b4edba2015-08-14 20:02:05 +00009680bool
Greg Clayton6dc8d582015-08-18 22:32:36 +00009681ClangASTContext::LayoutRecordType(void *baton,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009682 const clang::RecordDecl *record_decl,
9683 uint64_t &bit_size,
9684 uint64_t &alignment,
9685 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
9686 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
9687 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
9688{
Greg Clayton6dc8d582015-08-18 22:32:36 +00009689 ClangASTContext *ast = (ClangASTContext *)baton;
Greg Clayton261ac3f2015-08-28 01:01:03 +00009690 DWARFASTParserClang *dwarf_ast_parser = (DWARFASTParserClang *)ast->GetDWARFParser();
9691 return dwarf_ast_parser->LayoutRecordType(record_decl, bit_size, alignment, field_offsets, base_offsets, vbase_offsets);
Greg Clayton8b4edba2015-08-14 20:02:05 +00009692}
9693
Greg Clayton99558cc42015-08-24 23:46:31 +00009694//----------------------------------------------------------------------
Paul Hermand628cbb2015-09-15 23:44:17 +00009695// CompilerDecl override functions
9696//----------------------------------------------------------------------
9697lldb::VariableSP
9698ClangASTContext::DeclGetVariable (void *opaque_decl)
9699{
9700 if (llvm::dyn_cast<clang::VarDecl>((clang::Decl *)opaque_decl))
9701 {
9702 auto decl_search_it = m_decl_objects.find(opaque_decl);
9703 if (decl_search_it != m_decl_objects.end())
9704 return std::static_pointer_cast<Variable>(decl_search_it->second);
9705 }
9706 return VariableSP();
9707}
9708
9709void
9710ClangASTContext::DeclLinkToObject (void *opaque_decl, std::shared_ptr<void> object)
9711{
9712 if (m_decl_objects.find(opaque_decl) == m_decl_objects.end())
9713 m_decl_objects.insert(std::make_pair(opaque_decl, object));
9714}
9715
9716ConstString
9717ClangASTContext::DeclGetName (void *opaque_decl)
9718{
9719 if (opaque_decl)
9720 {
9721 clang::NamedDecl *nd = llvm::dyn_cast<NamedDecl>((clang::Decl*)opaque_decl);
9722 if (nd != nullptr)
Greg Claytonfe689042015-11-10 17:47:04 +00009723 return ConstString(nd->getDeclName().getAsString());
Paul Hermand628cbb2015-09-15 23:44:17 +00009724 }
9725 return ConstString();
9726}
9727
Greg Claytonfe689042015-11-10 17:47:04 +00009728ConstString
9729ClangASTContext::DeclGetMangledName (void *opaque_decl)
9730{
9731 if (opaque_decl)
9732 {
9733 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>((clang::Decl*)opaque_decl);
9734 if (nd != nullptr && !llvm::isa<clang::ObjCMethodDecl>(nd))
9735 {
9736 clang::MangleContext *mc = getMangleContext();
9737 if (mc && mc->shouldMangleCXXName(nd))
9738 {
9739 llvm::SmallVector<char, 1024> buf;
9740 llvm::raw_svector_ostream llvm_ostrm (buf);
9741 if (llvm::isa<clang::CXXConstructorDecl>(nd))
9742 {
9743 mc->mangleCXXCtor(llvm::dyn_cast<clang::CXXConstructorDecl>(nd), Ctor_Complete, llvm_ostrm);
9744 }
9745 else if (llvm::isa<clang::CXXDestructorDecl>(nd))
9746 {
9747 mc->mangleCXXDtor(llvm::dyn_cast<clang::CXXDestructorDecl>(nd), Dtor_Complete, llvm_ostrm);
9748 }
9749 else
9750 {
9751 mc->mangleName(nd, llvm_ostrm);
9752 }
9753 if (buf.size() > 0)
9754 return ConstString(buf.data(), buf.size());
9755 }
9756 }
9757 }
9758 return ConstString();
9759}
9760
9761CompilerDeclContext
9762ClangASTContext::DeclGetDeclContext (void *opaque_decl)
9763{
9764 if (opaque_decl)
9765 return CompilerDeclContext(this, ((clang::Decl*)opaque_decl)->getDeclContext());
9766 else
9767 return CompilerDeclContext();
9768}
9769
9770CompilerType
9771ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl)
9772{
9773 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9774 return CompilerType(this, func_decl->getReturnType().getAsOpaquePtr());
9775 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9776 return CompilerType(this, objc_method->getReturnType().getAsOpaquePtr());
9777 else
9778 return CompilerType();
9779}
9780
9781size_t
9782ClangASTContext::DeclGetFunctionNumArguments(void *opaque_decl)
9783{
9784 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9785 return func_decl->param_size();
9786 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9787 return objc_method->param_size();
9788 else
9789 return 0;
9790}
9791
9792CompilerType
9793ClangASTContext::DeclGetFunctionArgumentType (void *opaque_decl, size_t idx)
9794{
9795 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9796 {
9797 if (idx < func_decl->param_size())
9798 {
9799 ParmVarDecl *var_decl = func_decl->getParamDecl(idx);
9800 if (var_decl)
9801 return CompilerType(this, var_decl->getOriginalType().getAsOpaquePtr());
9802 }
9803 }
9804 else if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9805 {
9806 if (idx < objc_method->param_size())
9807 return CompilerType(this, objc_method->parameters()[idx]->getOriginalType().getAsOpaquePtr());
9808 }
9809 return CompilerType();
9810}
9811
Paul Hermand628cbb2015-09-15 23:44:17 +00009812//----------------------------------------------------------------------
Greg Clayton99558cc42015-08-24 23:46:31 +00009813// CompilerDeclContext functions
9814//----------------------------------------------------------------------
9815
Greg Claytondfc09622015-12-08 18:39:50 +00009816std::vector<CompilerDecl>
Siva Chandra03ff5c82016-02-05 19:10:04 +00009817ClangASTContext::DeclContextFindDeclByName(void *opaque_decl_ctx,
9818 ConstString name,
9819 const bool ignore_using_decls)
Paul Hermand628cbb2015-09-15 23:44:17 +00009820{
Greg Claytondfc09622015-12-08 18:39:50 +00009821 std::vector<CompilerDecl> found_decls;
Paul Hermand628cbb2015-09-15 23:44:17 +00009822 if (opaque_decl_ctx)
9823 {
9824 DeclContext *root_decl_ctx = (DeclContext *)opaque_decl_ctx;
9825 std::set<DeclContext *> searched;
9826 std::multimap<DeclContext *, DeclContext *> search_queue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009827 SymbolFile *symbol_file = GetSymbolFile();
Paul Hermand628cbb2015-09-15 23:44:17 +00009828
9829 for (clang::DeclContext *decl_context = root_decl_ctx; decl_context != nullptr && found_decls.empty(); decl_context = decl_context->getParent())
9830 {
9831 search_queue.insert(std::make_pair(decl_context, decl_context));
9832
9833 for (auto it = search_queue.find(decl_context); it != search_queue.end(); it++)
9834 {
Eugene Leviantc1ba9fc2015-11-13 11:00:10 +00009835 if (!searched.insert(it->second).second)
9836 continue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009837 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9838
Paul Hermand628cbb2015-09-15 23:44:17 +00009839 for (clang::Decl *child : it->second->decls())
9840 {
Paul Hermanea188fc2015-09-16 18:48:30 +00009841 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
Paul Hermand628cbb2015-09-15 23:44:17 +00009842 {
Siva Chandra03ff5c82016-02-05 19:10:04 +00009843 if (ignore_using_decls)
9844 continue;
Paul Hermand628cbb2015-09-15 23:44:17 +00009845 clang::DeclContext *from = ud->getCommonAncestor();
9846 if (searched.find(ud->getNominatedNamespace()) == searched.end())
9847 search_queue.insert(std::make_pair(from, ud->getNominatedNamespace()));
9848 }
9849 else if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9850 {
Siva Chandra03ff5c82016-02-05 19:10:04 +00009851 if (ignore_using_decls)
9852 continue;
Paul Hermand628cbb2015-09-15 23:44:17 +00009853 for (clang::UsingShadowDecl *usd : ud->shadows())
9854 {
9855 clang::Decl *target = usd->getTargetDecl();
9856 if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target))
9857 {
9858 IdentifierInfo *ii = nd->getIdentifier();
9859 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009860 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermand628cbb2015-09-15 23:44:17 +00009861 }
9862 }
9863 }
Paul Hermanea188fc2015-09-16 18:48:30 +00009864 else if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(child))
9865 {
9866 IdentifierInfo *ii = nd->getIdentifier();
9867 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009868 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermanea188fc2015-09-16 18:48:30 +00009869 }
Paul Hermand628cbb2015-09-15 23:44:17 +00009870 }
9871 }
9872 }
9873 }
9874 return found_decls;
9875}
9876
Dawn Perchikb5925782015-12-12 19:31:41 +00009877// Look for child_decl_ctx's lookup scope in frame_decl_ctx and its parents,
9878// and return the number of levels it took to find it, or LLDB_INVALID_DECL_LEVEL
9879// if not found. If the decl was imported via a using declaration, its name and/or
9880// type, if set, will be used to check that the decl found in the scope is a match.
9881//
9882// The optional name is required by languages (like C++) to handle using declarations
9883// like:
9884//
9885// void poo();
9886// namespace ns {
9887// void foo();
9888// void goo();
9889// }
9890// void bar() {
9891// using ns::foo;
9892// // CountDeclLevels returns 0 for 'foo', 1 for 'poo', and
9893// // LLDB_INVALID_DECL_LEVEL for 'goo'.
9894// }
9895//
9896// The optional type is useful in the case that there's a specific overload
9897// that we're looking for that might otherwise be shadowed, like:
9898//
9899// void foo(int);
9900// namespace ns {
9901// void foo();
9902// }
9903// void bar() {
9904// using ns::foo;
9905// // CountDeclLevels returns 0 for { 'foo', void() },
9906// // 1 for { 'foo', void(int) }, and
9907// // LLDB_INVALID_DECL_LEVEL for { 'foo', void(int, int) }.
9908// }
9909//
9910// NOTE: Because file statics are at the TranslationUnit along with globals, a
9911// function at file scope will return the same level as a function at global scope.
9912// Ideally we'd like to treat the file scope as an additional scope just below the
9913// global scope. More work needs to be done to recognise that, if the decl we're
9914// trying to look up is static, we should compare its source file with that of the
9915// current scope and return a lower number for it.
9916uint32_t
9917ClangASTContext::CountDeclLevels (clang::DeclContext *frame_decl_ctx,
9918 clang::DeclContext *child_decl_ctx,
9919 ConstString *child_name,
9920 CompilerType *child_type)
9921{
9922 if (frame_decl_ctx)
9923 {
9924 std::set<DeclContext *> searched;
9925 std::multimap<DeclContext *, DeclContext *> search_queue;
9926 SymbolFile *symbol_file = GetSymbolFile();
9927
9928 // Get the lookup scope for the decl we're trying to find.
9929 clang::DeclContext *parent_decl_ctx = child_decl_ctx->getParent();
9930
9931 // Look for it in our scope's decl context and its parents.
9932 uint32_t level = 0;
9933 for (clang::DeclContext *decl_ctx = frame_decl_ctx; decl_ctx != nullptr; decl_ctx = decl_ctx->getParent())
9934 {
9935 if (!decl_ctx->isLookupContext())
9936 continue;
9937 if (decl_ctx == parent_decl_ctx)
9938 // Found it!
9939 return level;
9940 search_queue.insert(std::make_pair(decl_ctx, decl_ctx));
9941 for (auto it = search_queue.find(decl_ctx); it != search_queue.end(); it++)
9942 {
9943 if (searched.find(it->second) != searched.end())
9944 continue;
Sean Callanan8c05fb92016-02-12 21:55:05 +00009945
9946 // Currently DWARF has one shared translation unit for all Decls at top level, so this
9947 // would erroneously find using statements anywhere. So don't look at the top-level
9948 // translation unit.
9949 // TODO fix this and add a testcase that depends on it.
9950
9951 if (llvm::isa<clang::TranslationUnitDecl>(it->second))
9952 continue;
9953
Dawn Perchikb5925782015-12-12 19:31:41 +00009954 searched.insert(it->second);
9955 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9956
9957 for (clang::Decl *child : it->second->decls())
9958 {
9959 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
9960 {
9961 clang::DeclContext *ns = ud->getNominatedNamespace();
9962 if (ns == parent_decl_ctx)
9963 // Found it!
9964 return level;
9965 clang::DeclContext *from = ud->getCommonAncestor();
9966 if (searched.find(ns) == searched.end())
9967 search_queue.insert(std::make_pair(from, ns));
9968 }
9969 else if (child_name)
9970 {
9971 if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9972 {
9973 for (clang::UsingShadowDecl *usd : ud->shadows())
9974 {
9975 clang::Decl *target = usd->getTargetDecl();
9976 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target);
9977 if (!nd)
9978 continue;
9979 // Check names.
9980 IdentifierInfo *ii = nd->getIdentifier();
9981 if (ii == nullptr || !ii->getName().equals(child_name->AsCString(nullptr)))
9982 continue;
9983 // Check types, if one was provided.
9984 if (child_type)
9985 {
9986 CompilerType clang_type = ClangASTContext::GetTypeForDecl(nd);
9987 if (!AreTypesSame(clang_type, *child_type, /*ignore_qualifiers=*/true))
9988 continue;
9989 }
9990 // Found it!
9991 return level;
9992 }
9993 }
9994 }
9995 }
9996 }
9997 ++level;
9998 }
9999 }
10000 return LLDB_INVALID_DECL_LEVEL;
10001}
10002
Greg Clayton99558cc42015-08-24 23:46:31 +000010003bool
10004ClangASTContext::DeclContextIsStructUnionOrClass (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +000010005{
Greg Clayton99558cc42015-08-24 23:46:31 +000010006 if (opaque_decl_ctx)
10007 return ((clang::DeclContext *)opaque_decl_ctx)->isRecord();
10008 else
10009 return false;
Greg Clayton8b4edba2015-08-14 20:02:05 +000010010}
10011
Greg Clayton99558cc42015-08-24 23:46:31 +000010012ConstString
10013ClangASTContext::DeclContextGetName (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +000010014{
Greg Clayton99558cc42015-08-24 23:46:31 +000010015 if (opaque_decl_ctx)
10016 {
10017 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
10018 if (named_decl)
10019 return ConstString(named_decl->getName());
10020 }
10021 return ConstString();
10022}
10023
Siva Chandra9293fc42016-01-07 23:32:34 +000010024ConstString
10025ClangASTContext::DeclContextGetScopeQualifiedName (void *opaque_decl_ctx)
10026{
10027 if (opaque_decl_ctx)
10028 {
10029 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
10030 if (named_decl)
10031 return ConstString(llvm::StringRef(named_decl->getQualifiedNameAsString()));
10032 }
10033 return ConstString();
10034}
10035
Greg Clayton99558cc42015-08-24 23:46:31 +000010036bool
10037ClangASTContext::DeclContextIsClassMethod (void *opaque_decl_ctx,
10038 lldb::LanguageType *language_ptr,
10039 bool *is_instance_method_ptr,
10040 ConstString *language_object_name_ptr)
10041{
10042 if (opaque_decl_ctx)
10043 {
10044 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
10045 if (ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
10046 {
10047 if (is_instance_method_ptr)
10048 *is_instance_method_ptr = objc_method->isInstanceMethod();
10049 if (language_ptr)
10050 *language_ptr = eLanguageTypeObjC;
10051 if (language_object_name_ptr)
10052 language_object_name_ptr->SetCString("self");
10053 return true;
10054 }
10055 else if (CXXMethodDecl *cxx_method = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
10056 {
10057 if (is_instance_method_ptr)
10058 *is_instance_method_ptr = cxx_method->isInstance();
10059 if (language_ptr)
10060 *language_ptr = eLanguageTypeC_plus_plus;
10061 if (language_object_name_ptr)
10062 language_object_name_ptr->SetCString("this");
10063 return true;
10064 }
10065 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
10066 {
10067 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
10068 if (metadata && metadata->HasObjectPtr())
10069 {
10070 if (is_instance_method_ptr)
10071 *is_instance_method_ptr = true;
10072 if (language_ptr)
10073 *language_ptr = eLanguageTypeObjC;
10074 if (language_object_name_ptr)
10075 language_object_name_ptr->SetCString (metadata->GetObjectPtrName());
10076 return true;
10077 }
10078 }
10079 }
10080 return false;
10081}
10082
10083clang::DeclContext *
10084ClangASTContext::DeclContextGetAsDeclContext (const CompilerDeclContext &dc)
10085{
10086 if (dc.IsClang())
10087 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
10088 return nullptr;
10089}
10090
10091
10092ObjCMethodDecl *
10093ClangASTContext::DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc)
10094{
10095 if (dc.IsClang())
10096 return llvm::dyn_cast<clang::ObjCMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10097 return nullptr;
10098}
10099
10100CXXMethodDecl *
10101ClangASTContext::DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc)
10102{
10103 if (dc.IsClang())
10104 return llvm::dyn_cast<clang::CXXMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10105 return nullptr;
10106}
10107
10108clang::FunctionDecl *
10109ClangASTContext::DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc)
10110{
10111 if (dc.IsClang())
10112 return llvm::dyn_cast<clang::FunctionDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10113 return nullptr;
10114}
10115
10116clang::NamespaceDecl *
10117ClangASTContext::DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc)
10118{
10119 if (dc.IsClang())
10120 return llvm::dyn_cast<clang::NamespaceDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10121 return nullptr;
10122}
10123
10124ClangASTMetadata *
10125ClangASTContext::DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object)
10126{
10127 clang::ASTContext *ast = DeclContextGetClangASTContext (dc);
10128 if (ast)
10129 return ClangASTContext::GetMetadata (ast, object);
10130 return nullptr;
10131}
10132
10133clang::ASTContext *
10134ClangASTContext::DeclContextGetClangASTContext (const CompilerDeclContext &dc)
10135{
Greg Claytonf73034f2015-09-08 18:15:05 +000010136 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
10137 if (ast)
10138 return ast->getASTContext();
Greg Clayton99558cc42015-08-24 23:46:31 +000010139 return nullptr;
Greg Clayton8b4edba2015-08-14 20:02:05 +000010140}
10141
Jim Ingham151c0322015-09-15 21:13:50 +000010142ClangASTContextForExpressions::ClangASTContextForExpressions (Target &target) :
10143 ClangASTContext (target.GetArchitecture().GetTriple().getTriple().c_str()),
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010144 m_target_wp(target.shared_from_this()),
10145 m_persistent_variables (new ClangPersistentVariables)
Jim Ingham151c0322015-09-15 21:13:50 +000010146{
10147}
10148
10149UserExpression *
10150ClangASTContextForExpressions::GetUserExpression (const char *expr,
10151 const char *expr_prefix,
10152 lldb::LanguageType language,
Jim Ingham19a63fc2015-11-03 02:11:24 +000010153 Expression::ResultType desired_type,
10154 const EvaluateExpressionOptions &options)
Jim Ingham151c0322015-09-15 21:13:50 +000010155{
10156 TargetSP target_sp = m_target_wp.lock();
10157 if (!target_sp)
10158 return nullptr;
10159
Jim Ingham19a63fc2015-11-03 02:11:24 +000010160 return new ClangUserExpression(*target_sp.get(), expr, expr_prefix, language, desired_type, options);
Jim Ingham151c0322015-09-15 21:13:50 +000010161}
10162
10163FunctionCaller *
10164ClangASTContextForExpressions::GetFunctionCaller (const CompilerType &return_type,
10165 const Address& function_address,
10166 const ValueList &arg_value_list,
10167 const char *name)
10168{
10169 TargetSP target_sp = m_target_wp.lock();
10170 if (!target_sp)
10171 return nullptr;
10172
10173 Process *process = target_sp->GetProcessSP().get();
10174 if (!process)
10175 return nullptr;
10176
10177 return new ClangFunctionCaller (*process, return_type, function_address, arg_value_list, name);
10178}
10179
10180UtilityFunction *
10181ClangASTContextForExpressions::GetUtilityFunction (const char *text,
10182 const char *name)
10183{
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010184 TargetSP target_sp = m_target_wp.lock();
Jim Ingham151c0322015-09-15 21:13:50 +000010185 if (!target_sp)
10186 return nullptr;
10187
10188 return new ClangUtilityFunction(*target_sp.get(), text, name);
10189}
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010190
10191PersistentExpressionState *
10192ClangASTContextForExpressions::GetPersistentExpressionState ()
10193{
10194 return m_persistent_variables.get();
10195}