blob: d59b39c32808b91fea21bc8616eeb13093159e96 [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 {
3188 clang::QualType qual_type (GetCanonicalQualType(type));
3189 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
4643 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4644
4645 // Get a uniqued clang::QualType for the typedef decl type
4646 return CompilerType (this, clang_ast->getTypedefType (decl).getAsOpaquePtr());
4647
4648 }
4649 return CompilerType();
4650
4651}
4652
Greg Claytona1e5dc82015-08-11 22:53:00 +00004653CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004654ClangASTContext::GetTypedefedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004655{
4656 if (type)
4657 {
4658 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4659 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004660 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004661 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004662 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004663}
4664
Greg Claytona1e5dc82015-08-11 22:53:00 +00004665CompilerType
4666ClangASTContext::RemoveFastQualifiers (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004667{
Ryan Brown57bee1e2015-09-14 22:45:11 +00004668 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00004669 {
4670 clang::QualType qual_type(GetQualType(type));
4671 qual_type.getQualifiers().removeFastQualifiers();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004672 return CompilerType (type.GetTypeSystem(), qual_type.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004673 }
4674 return type;
4675}
4676
4677
4678//----------------------------------------------------------------------
4679// Create related types using the current type's AST
4680//----------------------------------------------------------------------
4681
Greg Claytona1e5dc82015-08-11 22:53:00 +00004682CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00004683ClangASTContext::GetBasicTypeFromAST (lldb::BasicType basic_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004684{
Greg Clayton99558cc42015-08-24 23:46:31 +00004685 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004686}
4687//----------------------------------------------------------------------
4688// Exploring the type
4689//----------------------------------------------------------------------
4690
4691uint64_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004692ClangASTContext::GetBitSize (lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope)
Greg Claytond8d4a572015-08-11 21:38:15 +00004693{
4694 if (GetCompleteType (type))
4695 {
4696 clang::QualType qual_type(GetCanonicalQualType(type));
4697 switch (qual_type->getTypeClass())
4698 {
4699 case clang::Type::ObjCInterface:
4700 case clang::Type::ObjCObject:
4701 {
4702 ExecutionContext exe_ctx (exe_scope);
4703 Process *process = exe_ctx.GetProcessPtr();
4704 if (process)
4705 {
4706 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4707 if (objc_runtime)
4708 {
4709 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004710 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00004711 return bit_size;
4712 }
4713 }
4714 else
4715 {
4716 static bool g_printed = false;
4717 if (!g_printed)
4718 {
4719 StreamString s;
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00004720 DumpTypeDescription(type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00004721
4722 llvm::outs() << "warning: trying to determine the size of type ";
4723 llvm::outs() << s.GetString() << "\n";
4724 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
4725 llvm::outs() << "backtrace:\n";
4726 llvm::sys::PrintStackTrace(llvm::outs());
4727 llvm::outs() << "\n";
4728 g_printed = true;
4729 }
4730 }
4731 }
Jason Molenda62e06812016-02-16 04:14:33 +00004732 LLVM_FALLTHROUGH;
Greg Claytond8d4a572015-08-11 21:38:15 +00004733 default:
4734 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
4735 if (bit_size == 0)
4736 {
4737 if (qual_type->isIncompleteArrayType())
4738 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
4739 }
4740 if (qual_type->isObjCObjectOrInterfaceType())
4741 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
4742 return bit_size;
4743 }
4744 }
4745 return 0;
4746}
4747
4748size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004749ClangASTContext::GetTypeBitAlign (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004750{
4751 if (GetCompleteType(type))
4752 return getASTContext()->getTypeAlign(GetQualType(type));
4753 return 0;
4754}
4755
4756
4757lldb::Encoding
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004758ClangASTContext::GetEncoding (lldb::opaque_compiler_type_t type, uint64_t &count)
Greg Claytond8d4a572015-08-11 21:38:15 +00004759{
4760 if (!type)
4761 return lldb::eEncodingInvalid;
4762
4763 count = 1;
4764 clang::QualType qual_type(GetCanonicalQualType(type));
4765
4766 switch (qual_type->getTypeClass())
4767 {
4768 case clang::Type::UnaryTransform:
4769 break;
4770
4771 case clang::Type::FunctionNoProto:
4772 case clang::Type::FunctionProto:
4773 break;
4774
4775 case clang::Type::IncompleteArray:
4776 case clang::Type::VariableArray:
4777 break;
4778
4779 case clang::Type::ConstantArray:
4780 break;
4781
4782 case clang::Type::ExtVector:
4783 case clang::Type::Vector:
4784 // TODO: Set this to more than one???
4785 break;
4786
4787 case clang::Type::Builtin:
4788 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4789 {
Greg Claytond8d4a572015-08-11 21:38:15 +00004790 case clang::BuiltinType::Void:
4791 break;
4792
4793 case clang::BuiltinType::Bool:
4794 case clang::BuiltinType::Char_S:
4795 case clang::BuiltinType::SChar:
4796 case clang::BuiltinType::WChar_S:
4797 case clang::BuiltinType::Char16:
4798 case clang::BuiltinType::Char32:
4799 case clang::BuiltinType::Short:
4800 case clang::BuiltinType::Int:
4801 case clang::BuiltinType::Long:
4802 case clang::BuiltinType::LongLong:
4803 case clang::BuiltinType::Int128: return lldb::eEncodingSint;
4804
4805 case clang::BuiltinType::Char_U:
4806 case clang::BuiltinType::UChar:
4807 case clang::BuiltinType::WChar_U:
4808 case clang::BuiltinType::UShort:
4809 case clang::BuiltinType::UInt:
4810 case clang::BuiltinType::ULong:
4811 case clang::BuiltinType::ULongLong:
4812 case clang::BuiltinType::UInt128: return lldb::eEncodingUint;
4813
Greg Claytondee40e72015-11-03 23:23:22 +00004814 case clang::BuiltinType::Half:
Greg Claytond8d4a572015-08-11 21:38:15 +00004815 case clang::BuiltinType::Float:
4816 case clang::BuiltinType::Double:
4817 case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
4818
4819 case clang::BuiltinType::ObjCClass:
4820 case clang::BuiltinType::ObjCId:
4821 case clang::BuiltinType::ObjCSel: return lldb::eEncodingUint;
4822
4823 case clang::BuiltinType::NullPtr: return lldb::eEncodingUint;
4824
4825 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4826 case clang::BuiltinType::Kind::BoundMember:
4827 case clang::BuiltinType::Kind::BuiltinFn:
4828 case clang::BuiltinType::Kind::Dependent:
Ed Mastec6dd6512015-09-23 18:32:34 +00004829 case clang::BuiltinType::Kind::OCLClkEvent:
Greg Claytond8d4a572015-08-11 21:38:15 +00004830 case clang::BuiltinType::Kind::OCLEvent:
4831 case clang::BuiltinType::Kind::OCLImage1d:
4832 case clang::BuiltinType::Kind::OCLImage1dArray:
4833 case clang::BuiltinType::Kind::OCLImage1dBuffer:
4834 case clang::BuiltinType::Kind::OCLImage2d:
4835 case clang::BuiltinType::Kind::OCLImage2dArray:
Ed Mastec6dd6512015-09-23 18:32:34 +00004836 case clang::BuiltinType::Kind::OCLImage2dArrayDepth:
4837 case clang::BuiltinType::Kind::OCLImage2dArrayMSAA:
4838 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepth:
4839 case clang::BuiltinType::Kind::OCLImage2dDepth:
4840 case clang::BuiltinType::Kind::OCLImage2dMSAA:
4841 case clang::BuiltinType::Kind::OCLImage2dMSAADepth:
Greg Claytond8d4a572015-08-11 21:38:15 +00004842 case clang::BuiltinType::Kind::OCLImage3d:
Ed Mastec6dd6512015-09-23 18:32:34 +00004843 case clang::BuiltinType::Kind::OCLQueue:
4844 case clang::BuiltinType::Kind::OCLNDRange:
4845 case clang::BuiltinType::Kind::OCLReserveID:
Greg Claytond8d4a572015-08-11 21:38:15 +00004846 case clang::BuiltinType::Kind::OCLSampler:
Ed Mastec6dd6512015-09-23 18:32:34 +00004847 case clang::BuiltinType::Kind::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00004848 case clang::BuiltinType::Kind::Overload:
4849 case clang::BuiltinType::Kind::PseudoObject:
4850 case clang::BuiltinType::Kind::UnknownAny:
4851 break;
4852 }
4853 break;
4854 // All pointer types are represented as unsigned integer encodings.
4855 // We may nee to add a eEncodingPointer if we ever need to know the
4856 // difference
4857 case clang::Type::ObjCObjectPointer:
4858 case clang::Type::BlockPointer:
4859 case clang::Type::Pointer:
4860 case clang::Type::LValueReference:
4861 case clang::Type::RValueReference:
4862 case clang::Type::MemberPointer: return lldb::eEncodingUint;
4863 case clang::Type::Complex:
4864 {
4865 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4866 if (qual_type->isComplexType())
4867 encoding = lldb::eEncodingIEEE754;
4868 else
4869 {
4870 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
4871 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004872 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004873 else
4874 encoding = lldb::eEncodingSint;
4875 }
4876 count = 2;
4877 return encoding;
4878 }
4879
4880 case clang::Type::ObjCInterface: break;
4881 case clang::Type::Record: break;
4882 case clang::Type::Enum: return lldb::eEncodingSint;
4883 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004884 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Enrico Granata36f51e42015-12-18 22:41:25 +00004885
4886 case clang::Type::Auto:
4887 return CompilerType(getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004888
4889 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004890 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004891
4892 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004893 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004894
4895 case clang::Type::DependentSizedArray:
4896 case clang::Type::DependentSizedExtVector:
4897 case clang::Type::UnresolvedUsing:
4898 case clang::Type::Attributed:
4899 case clang::Type::TemplateTypeParm:
4900 case clang::Type::SubstTemplateTypeParm:
4901 case clang::Type::SubstTemplateTypeParmPack:
Greg Claytond8d4a572015-08-11 21:38:15 +00004902 case clang::Type::InjectedClassName:
4903 case clang::Type::DependentName:
4904 case clang::Type::DependentTemplateSpecialization:
4905 case clang::Type::PackExpansion:
4906 case clang::Type::ObjCObject:
4907
4908 case clang::Type::TypeOfExpr:
4909 case clang::Type::TypeOf:
4910 case clang::Type::Decltype:
4911 case clang::Type::TemplateSpecialization:
4912 case clang::Type::Atomic:
4913 case clang::Type::Adjusted:
Pavel Labath484f0a32016-01-12 08:51:28 +00004914 case clang::Type::Pipe:
Greg Claytond8d4a572015-08-11 21:38:15 +00004915 break;
4916
4917 // pointer type decayed from an array or function type.
4918 case clang::Type::Decayed:
4919 break;
4920 }
4921 count = 0;
4922 return lldb::eEncodingInvalid;
4923}
4924
4925lldb::Format
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004926ClangASTContext::GetFormat (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004927{
4928 if (!type)
4929 return lldb::eFormatDefault;
4930
4931 clang::QualType qual_type(GetCanonicalQualType(type));
4932
4933 switch (qual_type->getTypeClass())
4934 {
4935 case clang::Type::UnaryTransform:
4936 break;
4937
4938 case clang::Type::FunctionNoProto:
4939 case clang::Type::FunctionProto:
4940 break;
4941
4942 case clang::Type::IncompleteArray:
4943 case clang::Type::VariableArray:
4944 break;
4945
4946 case clang::Type::ConstantArray:
4947 return lldb::eFormatVoid; // no value
4948
4949 case clang::Type::ExtVector:
4950 case clang::Type::Vector:
4951 break;
4952
4953 case clang::Type::Builtin:
4954 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4955 {
4956 //default: assert(0 && "Unknown builtin type!");
4957 case clang::BuiltinType::UnknownAny:
4958 case clang::BuiltinType::Void:
4959 case clang::BuiltinType::BoundMember:
4960 break;
4961
4962 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
4963 case clang::BuiltinType::Char_S:
4964 case clang::BuiltinType::SChar:
4965 case clang::BuiltinType::WChar_S:
4966 case clang::BuiltinType::Char_U:
4967 case clang::BuiltinType::UChar:
4968 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
4969 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
4970 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
4971 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
4972 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
4973 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
4974 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
4975 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
4976 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
4977 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
4978 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
4979 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
4980 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
Greg Claytondee40e72015-11-03 23:23:22 +00004981 case clang::BuiltinType::Half:
4982 case clang::BuiltinType::Float:
4983 case clang::BuiltinType::Double:
Greg Claytond8d4a572015-08-11 21:38:15 +00004984 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
Zachary Turnerdd07e002015-09-16 18:08:45 +00004985 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00004986 return lldb::eFormatHex;
4987 }
4988 break;
4989 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
4990 case clang::Type::BlockPointer: return lldb::eFormatHex;
4991 case clang::Type::Pointer: return lldb::eFormatHex;
4992 case clang::Type::LValueReference:
4993 case clang::Type::RValueReference: return lldb::eFormatHex;
4994 case clang::Type::MemberPointer: break;
4995 case clang::Type::Complex:
4996 {
4997 if (qual_type->isComplexType())
4998 return lldb::eFormatComplex;
4999 else
5000 return lldb::eFormatComplexInteger;
5001 }
5002 case clang::Type::ObjCInterface: break;
5003 case clang::Type::Record: break;
5004 case clang::Type::Enum: return lldb::eFormatEnum;
5005 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005006 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005007 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005008 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005009 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005010 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005011 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005012 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005013 case clang::Type::DependentSizedArray:
5014 case clang::Type::DependentSizedExtVector:
5015 case clang::Type::UnresolvedUsing:
5016 case clang::Type::Attributed:
5017 case clang::Type::TemplateTypeParm:
5018 case clang::Type::SubstTemplateTypeParm:
5019 case clang::Type::SubstTemplateTypeParmPack:
5020 case clang::Type::InjectedClassName:
5021 case clang::Type::DependentName:
5022 case clang::Type::DependentTemplateSpecialization:
5023 case clang::Type::PackExpansion:
5024 case clang::Type::ObjCObject:
5025
5026 case clang::Type::TypeOfExpr:
5027 case clang::Type::TypeOf:
5028 case clang::Type::Decltype:
5029 case clang::Type::TemplateSpecialization:
5030 case clang::Type::Atomic:
5031 case clang::Type::Adjusted:
Pavel Labath484f0a32016-01-12 08:51:28 +00005032 case clang::Type::Pipe:
Greg Claytond8d4a572015-08-11 21:38:15 +00005033 break;
5034
5035 // pointer type decayed from an array or function type.
5036 case clang::Type::Decayed:
5037 break;
5038 }
5039 // We don't know hot to display this type...
5040 return lldb::eFormatBytes;
5041}
5042
5043static bool
5044ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
5045{
5046 while (class_interface_decl)
5047 {
5048 if (class_interface_decl->ivar_size() > 0)
5049 return true;
5050
5051 if (check_superclass)
5052 class_interface_decl = class_interface_decl->getSuperClass();
5053 else
5054 break;
5055 }
5056 return false;
5057}
5058
5059uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005060ClangASTContext::GetNumChildren (lldb::opaque_compiler_type_t type, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00005061{
5062 if (!type)
5063 return 0;
5064
5065 uint32_t num_children = 0;
5066 clang::QualType qual_type(GetQualType(type));
5067 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5068 switch (type_class)
5069 {
5070 case clang::Type::Builtin:
5071 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5072 {
5073 case clang::BuiltinType::ObjCId: // child is Class
5074 case clang::BuiltinType::ObjCClass: // child is Class
5075 num_children = 1;
5076 break;
5077
5078 default:
5079 break;
5080 }
5081 break;
5082
5083 case clang::Type::Complex: return 0;
5084
5085 case clang::Type::Record:
5086 if (GetCompleteQualType (getASTContext(), qual_type))
5087 {
5088 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5089 const clang::RecordDecl *record_decl = record_type->getDecl();
5090 assert(record_decl);
5091 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5092 if (cxx_record_decl)
5093 {
5094 if (omit_empty_base_classes)
5095 {
5096 // Check each base classes to see if it or any of its
5097 // base classes contain any fields. This can help
5098 // limit the noise in variable views by not having to
5099 // show base classes that contain no members.
5100 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5101 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5102 base_class != base_class_end;
5103 ++base_class)
5104 {
5105 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5106
5107 // Skip empty base classes
5108 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5109 continue;
5110
5111 num_children++;
5112 }
5113 }
5114 else
5115 {
5116 // Include all base classes
5117 num_children += cxx_record_decl->getNumBases();
5118 }
5119
5120 }
5121 clang::RecordDecl::field_iterator field, field_end;
5122 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5123 ++num_children;
5124 }
5125 break;
5126
5127 case clang::Type::ObjCObject:
5128 case clang::Type::ObjCInterface:
5129 if (GetCompleteQualType (getASTContext(), qual_type))
5130 {
5131 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5132 assert (objc_class_type);
5133 if (objc_class_type)
5134 {
5135 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5136
5137 if (class_interface_decl)
5138 {
5139
5140 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5141 if (superclass_interface_decl)
5142 {
5143 if (omit_empty_base_classes)
5144 {
5145 if (ObjCDeclHasIVars (superclass_interface_decl, true))
5146 ++num_children;
5147 }
5148 else
5149 ++num_children;
5150 }
5151
5152 num_children += class_interface_decl->ivar_size();
5153 }
5154 }
5155 }
5156 break;
5157
5158 case clang::Type::ObjCObjectPointer:
5159 {
5160 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
5161 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005162 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005163 // If this type points to a simple type, then it has 1 child
5164 if (num_pointee_children == 0)
5165 num_children = 1;
5166 else
5167 num_children = num_pointee_children;
5168 }
5169 break;
5170
5171 case clang::Type::Vector:
5172 case clang::Type::ExtVector:
5173 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
5174 break;
5175
5176 case clang::Type::ConstantArray:
5177 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
5178 break;
5179
5180 case clang::Type::Pointer:
5181 {
5182 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
5183 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00005184 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005185 if (num_pointee_children == 0)
5186 {
5187 // We have a pointer to a pointee type that claims it has no children.
5188 // We will want to look at
5189 num_children = GetNumPointeeChildren (pointee_type);
5190 }
5191 else
5192 num_children = num_pointee_children;
5193 }
5194 break;
5195
5196 case clang::Type::LValueReference:
5197 case clang::Type::RValueReference:
5198 {
5199 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
5200 clang::QualType pointee_type = reference_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005201 uint32_t num_pointee_children = CompilerType (getASTContext(), pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005202 // If this type points to a simple type, then it has 1 child
5203 if (num_pointee_children == 0)
5204 num_children = 1;
5205 else
5206 num_children = num_pointee_children;
5207 }
5208 break;
5209
5210
5211 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005212 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005213 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00005214
5215 case clang::Type::Auto:
5216 num_children = CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumChildren (omit_empty_base_classes);
5217 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00005218
5219 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005220 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005221 break;
5222
5223 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005224 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005225 break;
5226 default:
5227 break;
5228 }
5229 return num_children;
5230}
5231
Greg Clayton56939cb2015-09-17 22:23:34 +00005232CompilerType
5233ClangASTContext::GetBuiltinTypeByName (const ConstString &name)
5234{
5235 return GetBasicType (GetBasicTypeEnumeration (name));
5236}
5237
Greg Claytond8d4a572015-08-11 21:38:15 +00005238lldb::BasicType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005239ClangASTContext::GetBasicTypeEnumeration (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005240{
5241 if (type)
5242 {
5243 clang::QualType qual_type(GetQualType(type));
5244 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5245 if (type_class == clang::Type::Builtin)
5246 {
5247 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5248 {
5249 case clang::BuiltinType::Void: return eBasicTypeVoid;
5250 case clang::BuiltinType::Bool: return eBasicTypeBool;
5251 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
5252 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
5253 case clang::BuiltinType::Char16: return eBasicTypeChar16;
5254 case clang::BuiltinType::Char32: return eBasicTypeChar32;
5255 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
5256 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
5257 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
5258 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
5259 case clang::BuiltinType::Short: return eBasicTypeShort;
5260 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
5261 case clang::BuiltinType::Int: return eBasicTypeInt;
5262 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
5263 case clang::BuiltinType::Long: return eBasicTypeLong;
5264 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
5265 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
5266 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
5267 case clang::BuiltinType::Int128: return eBasicTypeInt128;
5268 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
5269
5270 case clang::BuiltinType::Half: return eBasicTypeHalf;
5271 case clang::BuiltinType::Float: return eBasicTypeFloat;
5272 case clang::BuiltinType::Double: return eBasicTypeDouble;
5273 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
5274
5275 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
5276 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
5277 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
5278 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005279 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00005280 return eBasicTypeOther;
5281 }
5282 }
5283 }
5284 return eBasicTypeInvalid;
5285}
5286
Greg Clayton99558cc42015-08-24 23:46:31 +00005287void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005288ClangASTContext::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 +00005289{
5290 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
5291 if (enum_type)
5292 {
5293 const clang::EnumDecl *enum_decl = enum_type->getDecl();
5294 if (enum_decl)
5295 {
5296 CompilerType integer_type(this, enum_decl->getIntegerType().getAsOpaquePtr());
5297
5298 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
5299 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
5300 {
5301 ConstString name(enum_pos->getNameAsString().c_str());
5302 if (!callback (integer_type, name, enum_pos->getInitVal()))
5303 break;
5304 }
5305 }
5306 }
5307}
5308
Greg Claytond8d4a572015-08-11 21:38:15 +00005309
5310#pragma mark Aggregate Types
5311
5312uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005313ClangASTContext::GetNumFields (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005314{
5315 if (!type)
5316 return 0;
5317
5318 uint32_t count = 0;
5319 clang::QualType qual_type(GetCanonicalQualType(type));
5320 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5321 switch (type_class)
5322 {
5323 case clang::Type::Record:
5324 if (GetCompleteType(type))
5325 {
5326 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
5327 if (record_type)
5328 {
5329 clang::RecordDecl *record_decl = record_type->getDecl();
5330 if (record_decl)
5331 {
5332 uint32_t field_idx = 0;
5333 clang::RecordDecl::field_iterator field, field_end;
5334 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5335 ++field_idx;
5336 count = field_idx;
5337 }
5338 }
5339 }
5340 break;
5341
5342 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005343 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005344 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00005345
5346 case clang::Type::Auto:
5347 count = CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumFields();
5348 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00005349
5350 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005351 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005352 break;
5353
5354 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005355 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005356 break;
5357
5358 case clang::Type::ObjCObjectPointer:
5359 if (GetCompleteType(type))
5360 {
5361 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5362 if (objc_class_type)
5363 {
5364 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
5365
5366 if (class_interface_decl)
5367 count = class_interface_decl->ivar_size();
5368 }
5369 }
5370 break;
5371
5372 case clang::Type::ObjCObject:
5373 case clang::Type::ObjCInterface:
5374 if (GetCompleteType(type))
5375 {
5376 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5377 if (objc_class_type)
5378 {
5379 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5380
5381 if (class_interface_decl)
5382 count = class_interface_decl->ivar_size();
5383 }
5384 }
5385 break;
5386
5387 default:
5388 break;
5389 }
5390 return count;
5391}
5392
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005393static lldb::opaque_compiler_type_t
Greg Claytond8d4a572015-08-11 21:38:15 +00005394GetObjCFieldAtIndex (clang::ASTContext *ast,
5395 clang::ObjCInterfaceDecl *class_interface_decl,
5396 size_t idx,
5397 std::string& name,
5398 uint64_t *bit_offset_ptr,
5399 uint32_t *bitfield_bit_size_ptr,
5400 bool *is_bitfield_ptr)
5401{
5402 if (class_interface_decl)
5403 {
5404 if (idx < (class_interface_decl->ivar_size()))
5405 {
5406 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5407 uint32_t ivar_idx = 0;
5408
5409 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
5410 {
5411 if (ivar_idx == idx)
5412 {
5413 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5414
5415 clang::QualType ivar_qual_type(ivar_decl->getType());
5416
5417 name.assign(ivar_decl->getNameAsString());
5418
5419 if (bit_offset_ptr)
5420 {
5421 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
5422 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
5423 }
5424
5425 const bool is_bitfield = ivar_pos->isBitField();
5426
5427 if (bitfield_bit_size_ptr)
5428 {
5429 *bitfield_bit_size_ptr = 0;
5430
5431 if (is_bitfield && ast)
5432 {
5433 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
5434 llvm::APSInt bitfield_apsint;
5435 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
5436 {
5437 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5438 }
5439 }
5440 }
5441 if (is_bitfield_ptr)
5442 *is_bitfield_ptr = is_bitfield;
5443
5444 return ivar_qual_type.getAsOpaquePtr();
5445 }
5446 }
5447 }
5448 }
5449 return nullptr;
5450}
5451
Greg Claytona1e5dc82015-08-11 22:53:00 +00005452CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005453ClangASTContext::GetFieldAtIndex (lldb::opaque_compiler_type_t type, size_t idx,
Greg Claytond8d4a572015-08-11 21:38:15 +00005454 std::string& name,
5455 uint64_t *bit_offset_ptr,
5456 uint32_t *bitfield_bit_size_ptr,
5457 bool *is_bitfield_ptr)
5458{
5459 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005460 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005461
5462 clang::QualType qual_type(GetCanonicalQualType(type));
5463 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5464 switch (type_class)
5465 {
5466 case clang::Type::Record:
5467 if (GetCompleteType(type))
5468 {
5469 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5470 const clang::RecordDecl *record_decl = record_type->getDecl();
5471 uint32_t field_idx = 0;
5472 clang::RecordDecl::field_iterator field, field_end;
5473 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
5474 {
5475 if (idx == field_idx)
5476 {
5477 // Print the member type if requested
5478 // Print the member name and equal sign
5479 name.assign(field->getNameAsString());
5480
5481 // Figure out the type byte size (field_type_info.first) and
5482 // alignment (field_type_info.second) from the AST context.
5483 if (bit_offset_ptr)
5484 {
5485 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5486 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5487 }
5488
5489 const bool is_bitfield = field->isBitField();
5490
5491 if (bitfield_bit_size_ptr)
5492 {
5493 *bitfield_bit_size_ptr = 0;
5494
5495 if (is_bitfield)
5496 {
5497 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5498 llvm::APSInt bitfield_apsint;
5499 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5500 {
5501 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5502 }
5503 }
5504 }
5505 if (is_bitfield_ptr)
5506 *is_bitfield_ptr = is_bitfield;
5507
Greg Claytona1e5dc82015-08-11 22:53:00 +00005508 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005509 }
5510 }
5511 }
5512 break;
5513
5514 case clang::Type::ObjCObjectPointer:
5515 if (GetCompleteType(type))
5516 {
5517 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5518 if (objc_class_type)
5519 {
5520 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005521 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 +00005522 }
5523 }
5524 break;
5525
5526 case clang::Type::ObjCObject:
5527 case clang::Type::ObjCInterface:
5528 if (GetCompleteType(type))
5529 {
5530 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5531 assert (objc_class_type);
5532 if (objc_class_type)
5533 {
5534 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
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
5541 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005542 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005543 GetFieldAtIndex (idx,
5544 name,
5545 bit_offset_ptr,
5546 bitfield_bit_size_ptr,
5547 is_bitfield_ptr);
5548
Enrico Granata36f51e42015-12-18 22:41:25 +00005549 case clang::Type::Auto:
5550 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).
5551 GetFieldAtIndex (idx,
5552 name,
5553 bit_offset_ptr,
5554 bitfield_bit_size_ptr,
5555 is_bitfield_ptr);
5556
Greg Claytond8d4a572015-08-11 21:38:15 +00005557 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005558 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005559 GetFieldAtIndex (idx,
5560 name,
5561 bit_offset_ptr,
5562 bitfield_bit_size_ptr,
5563 is_bitfield_ptr);
5564
5565 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005566 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005567 GetFieldAtIndex (idx,
5568 name,
5569 bit_offset_ptr,
5570 bitfield_bit_size_ptr,
5571 is_bitfield_ptr);
5572
5573 default:
5574 break;
5575 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005576 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005577}
5578
Greg Clayton99558cc42015-08-24 23:46:31 +00005579uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005580ClangASTContext::GetNumDirectBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005581{
5582 uint32_t count = 0;
5583 clang::QualType qual_type(GetCanonicalQualType(type));
5584 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5585 switch (type_class)
5586 {
5587 case clang::Type::Record:
5588 if (GetCompleteType(type))
5589 {
5590 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5591 if (cxx_record_decl)
5592 count = cxx_record_decl->getNumBases();
5593 }
5594 break;
5595
5596 case clang::Type::ObjCObjectPointer:
5597 count = GetPointeeType(type).GetNumDirectBaseClasses();
5598 break;
5599
5600 case clang::Type::ObjCObject:
5601 if (GetCompleteType(type))
5602 {
5603 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5604 if (objc_class_type)
5605 {
5606 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5607
5608 if (class_interface_decl && class_interface_decl->getSuperClass())
5609 count = 1;
5610 }
5611 }
5612 break;
5613 case clang::Type::ObjCInterface:
5614 if (GetCompleteType(type))
5615 {
5616 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5617 if (objc_interface_type)
5618 {
5619 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5620
5621 if (class_interface_decl && class_interface_decl->getSuperClass())
5622 count = 1;
5623 }
5624 }
5625 break;
5626
5627
5628 case clang::Type::Typedef:
5629 count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5630 break;
5631
Enrico Granata36f51e42015-12-18 22:41:25 +00005632 case clang::Type::Auto:
5633 count = GetNumDirectBaseClasses(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
5634 break;
5635
Greg Clayton99558cc42015-08-24 23:46:31 +00005636 case clang::Type::Elaborated:
5637 count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5638 break;
5639
5640 case clang::Type::Paren:
5641 return GetNumDirectBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5642
5643 default:
5644 break;
5645 }
5646 return count;
5647
5648}
5649
5650uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005651ClangASTContext::GetNumVirtualBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005652{
5653 uint32_t count = 0;
5654 clang::QualType qual_type(GetCanonicalQualType(type));
5655 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5656 switch (type_class)
5657 {
5658 case clang::Type::Record:
5659 if (GetCompleteType(type))
5660 {
5661 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5662 if (cxx_record_decl)
5663 count = cxx_record_decl->getNumVBases();
5664 }
5665 break;
5666
5667 case clang::Type::Typedef:
5668 count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5669 break;
5670
Enrico Granata36f51e42015-12-18 22:41:25 +00005671 case clang::Type::Auto:
5672 count = GetNumVirtualBaseClasses(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
5673 break;
5674
Greg Clayton99558cc42015-08-24 23:46:31 +00005675 case clang::Type::Elaborated:
5676 count = GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5677 break;
5678
5679 case clang::Type::Paren:
5680 count = GetNumVirtualBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5681 break;
5682
5683 default:
5684 break;
5685 }
5686 return count;
5687
5688}
5689
5690CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005691ClangASTContext::GetDirectBaseClassAtIndex (lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00005692{
5693 clang::QualType qual_type(GetCanonicalQualType(type));
5694 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5695 switch (type_class)
5696 {
5697 case clang::Type::Record:
5698 if (GetCompleteType(type))
5699 {
5700 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5701 if (cxx_record_decl)
5702 {
5703 uint32_t curr_idx = 0;
5704 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5705 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5706 base_class != base_class_end;
5707 ++base_class, ++curr_idx)
5708 {
5709 if (curr_idx == idx)
5710 {
5711 if (bit_offset_ptr)
5712 {
5713 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5714 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5715 if (base_class->isVirtual())
5716 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5717 else
5718 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5719 }
5720 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5721 }
5722 }
5723 }
5724 }
5725 break;
5726
5727 case clang::Type::ObjCObjectPointer:
5728 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
5729
5730 case clang::Type::ObjCObject:
5731 if (idx == 0 && GetCompleteType(type))
5732 {
5733 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5734 if (objc_class_type)
5735 {
5736 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5737
5738 if (class_interface_decl)
5739 {
5740 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5741 if (superclass_interface_decl)
5742 {
5743 if (bit_offset_ptr)
5744 *bit_offset_ptr = 0;
5745 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5746 }
5747 }
5748 }
5749 }
5750 break;
5751 case clang::Type::ObjCInterface:
5752 if (idx == 0 && GetCompleteType(type))
5753 {
5754 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5755 if (objc_interface_type)
5756 {
5757 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5758
5759 if (class_interface_decl)
5760 {
5761 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5762 if (superclass_interface_decl)
5763 {
5764 if (bit_offset_ptr)
5765 *bit_offset_ptr = 0;
5766 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5767 }
5768 }
5769 }
5770 }
5771 break;
5772
5773
5774 case clang::Type::Typedef:
5775 return GetDirectBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5776
Enrico Granata36f51e42015-12-18 22:41:25 +00005777 case clang::Type::Auto:
5778 return GetDirectBaseClassAtIndex (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5779
Greg Clayton99558cc42015-08-24 23:46:31 +00005780 case clang::Type::Elaborated:
5781 return GetDirectBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5782
5783 case clang::Type::Paren:
5784 return GetDirectBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5785
5786 default:
5787 break;
5788 }
5789 return CompilerType();
5790}
5791
5792CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005793ClangASTContext::GetVirtualBaseClassAtIndex (lldb::opaque_compiler_type_t type,
Greg Clayton99558cc42015-08-24 23:46:31 +00005794 size_t idx,
5795 uint32_t *bit_offset_ptr)
5796{
5797 clang::QualType qual_type(GetCanonicalQualType(type));
5798 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5799 switch (type_class)
5800 {
5801 case clang::Type::Record:
5802 if (GetCompleteType(type))
5803 {
5804 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5805 if (cxx_record_decl)
5806 {
5807 uint32_t curr_idx = 0;
5808 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5809 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
5810 base_class != base_class_end;
5811 ++base_class, ++curr_idx)
5812 {
5813 if (curr_idx == idx)
5814 {
5815 if (bit_offset_ptr)
5816 {
5817 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5818 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5819 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5820
5821 }
5822 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5823 }
5824 }
5825 }
5826 }
5827 break;
5828
5829 case clang::Type::Typedef:
5830 return GetVirtualBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
Enrico Granata36f51e42015-12-18 22:41:25 +00005831
5832 case clang::Type::Auto:
5833 return GetVirtualBaseClassAtIndex (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5834
Greg Clayton99558cc42015-08-24 23:46:31 +00005835 case clang::Type::Elaborated:
5836 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5837
5838 case clang::Type::Paren:
5839 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5840
5841 default:
5842 break;
5843 }
5844 return CompilerType();
5845
5846}
5847
Greg Claytond8d4a572015-08-11 21:38:15 +00005848// If a pointer to a pointee type (the clang_type arg) says that it has no
5849// children, then we either need to trust it, or override it and return a
5850// different result. For example, an "int *" has one child that is an integer,
5851// but a function pointer doesn't have any children. Likewise if a Record type
5852// claims it has no children, then there really is nothing to show.
5853uint32_t
5854ClangASTContext::GetNumPointeeChildren (clang::QualType type)
5855{
5856 if (type.isNull())
5857 return 0;
5858
5859 clang::QualType qual_type(type.getCanonicalType());
5860 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5861 switch (type_class)
5862 {
5863 case clang::Type::Builtin:
5864 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5865 {
5866 case clang::BuiltinType::UnknownAny:
5867 case clang::BuiltinType::Void:
5868 case clang::BuiltinType::NullPtr:
5869 case clang::BuiltinType::OCLEvent:
5870 case clang::BuiltinType::OCLImage1d:
5871 case clang::BuiltinType::OCLImage1dArray:
5872 case clang::BuiltinType::OCLImage1dBuffer:
5873 case clang::BuiltinType::OCLImage2d:
5874 case clang::BuiltinType::OCLImage2dArray:
5875 case clang::BuiltinType::OCLImage3d:
5876 case clang::BuiltinType::OCLSampler:
5877 return 0;
5878 case clang::BuiltinType::Bool:
5879 case clang::BuiltinType::Char_U:
5880 case clang::BuiltinType::UChar:
5881 case clang::BuiltinType::WChar_U:
5882 case clang::BuiltinType::Char16:
5883 case clang::BuiltinType::Char32:
5884 case clang::BuiltinType::UShort:
5885 case clang::BuiltinType::UInt:
5886 case clang::BuiltinType::ULong:
5887 case clang::BuiltinType::ULongLong:
5888 case clang::BuiltinType::UInt128:
5889 case clang::BuiltinType::Char_S:
5890 case clang::BuiltinType::SChar:
5891 case clang::BuiltinType::WChar_S:
5892 case clang::BuiltinType::Short:
5893 case clang::BuiltinType::Int:
5894 case clang::BuiltinType::Long:
5895 case clang::BuiltinType::LongLong:
5896 case clang::BuiltinType::Int128:
5897 case clang::BuiltinType::Float:
5898 case clang::BuiltinType::Double:
5899 case clang::BuiltinType::LongDouble:
5900 case clang::BuiltinType::Dependent:
5901 case clang::BuiltinType::Overload:
5902 case clang::BuiltinType::ObjCId:
5903 case clang::BuiltinType::ObjCClass:
5904 case clang::BuiltinType::ObjCSel:
5905 case clang::BuiltinType::BoundMember:
5906 case clang::BuiltinType::Half:
5907 case clang::BuiltinType::ARCUnbridgedCast:
5908 case clang::BuiltinType::PseudoObject:
5909 case clang::BuiltinType::BuiltinFn:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00005910 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00005911 return 1;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005912 default:
5913 return 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00005914 }
5915 break;
5916
5917 case clang::Type::Complex: return 1;
5918 case clang::Type::Pointer: return 1;
5919 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
5920 case clang::Type::LValueReference: return 1;
5921 case clang::Type::RValueReference: return 1;
5922 case clang::Type::MemberPointer: return 0;
5923 case clang::Type::ConstantArray: return 0;
5924 case clang::Type::IncompleteArray: return 0;
5925 case clang::Type::VariableArray: return 0;
5926 case clang::Type::DependentSizedArray: return 0;
5927 case clang::Type::DependentSizedExtVector: return 0;
5928 case clang::Type::Vector: return 0;
5929 case clang::Type::ExtVector: return 0;
5930 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
5931 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
5932 case clang::Type::UnresolvedUsing: return 0;
5933 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
5934 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Enrico Granata36f51e42015-12-18 22:41:25 +00005935 case clang::Type::Auto: return GetNumPointeeChildren (llvm::cast<clang::AutoType>(qual_type)->getDeducedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005936 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
5937 case clang::Type::TypeOfExpr: return 0;
5938 case clang::Type::TypeOf: return 0;
5939 case clang::Type::Decltype: return 0;
5940 case clang::Type::Record: return 0;
5941 case clang::Type::Enum: return 1;
5942 case clang::Type::TemplateTypeParm: return 1;
5943 case clang::Type::SubstTemplateTypeParm: return 1;
5944 case clang::Type::TemplateSpecialization: return 1;
5945 case clang::Type::InjectedClassName: return 0;
5946 case clang::Type::DependentName: return 1;
5947 case clang::Type::DependentTemplateSpecialization: return 1;
5948 case clang::Type::ObjCObject: return 0;
5949 case clang::Type::ObjCInterface: return 0;
5950 case clang::Type::ObjCObjectPointer: return 1;
5951 default:
5952 break;
5953 }
5954 return 0;
5955}
5956
5957
Greg Claytona1e5dc82015-08-11 22:53:00 +00005958CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005959ClangASTContext::GetChildCompilerTypeAtIndex (lldb::opaque_compiler_type_t type,
Bruce Mitchener4ad83342015-09-21 16:48:48 +00005960 ExecutionContext *exe_ctx,
5961 size_t idx,
5962 bool transparent_pointers,
5963 bool omit_empty_base_classes,
5964 bool ignore_array_bounds,
5965 std::string& child_name,
5966 uint32_t &child_byte_size,
5967 int32_t &child_byte_offset,
5968 uint32_t &child_bitfield_bit_size,
5969 uint32_t &child_bitfield_bit_offset,
5970 bool &child_is_base_class,
5971 bool &child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00005972 ValueObject *valobj,
5973 uint64_t &language_flags)
Greg Claytond8d4a572015-08-11 21:38:15 +00005974{
5975 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005976 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005977
5978 clang::QualType parent_qual_type(GetCanonicalQualType(type));
5979 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
5980 child_bitfield_bit_size = 0;
5981 child_bitfield_bit_offset = 0;
5982 child_is_base_class = false;
Enrico Granatadc62ffd2015-11-09 19:27:34 +00005983 language_flags = 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00005984
5985 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
5986 uint32_t bit_offset;
5987 switch (parent_type_class)
5988 {
5989 case clang::Type::Builtin:
5990 if (idx_is_valid)
5991 {
5992 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
5993 {
5994 case clang::BuiltinType::ObjCId:
5995 case clang::BuiltinType::ObjCClass:
5996 child_name = "isa";
5997 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005998 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00005999
6000 default:
6001 break;
6002 }
6003 }
6004 break;
6005
6006 case clang::Type::Record:
6007 if (idx_is_valid && GetCompleteType(type))
6008 {
6009 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
6010 const clang::RecordDecl *record_decl = record_type->getDecl();
6011 assert(record_decl);
6012 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
6013 uint32_t child_idx = 0;
6014
6015 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6016 if (cxx_record_decl)
6017 {
6018 // We might have base classes to print out first
6019 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6020 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6021 base_class != base_class_end;
6022 ++base_class)
6023 {
6024 const clang::CXXRecordDecl *base_class_decl = nullptr;
6025
6026 // Skip empty base classes
6027 if (omit_empty_base_classes)
6028 {
6029 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6030 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
6031 continue;
6032 }
6033
6034 if (idx == child_idx)
6035 {
6036 if (base_class_decl == nullptr)
6037 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6038
6039
6040 if (base_class->isVirtual())
6041 {
6042 bool handled = false;
6043 if (valobj)
6044 {
6045 Error err;
6046 AddressType addr_type = eAddressTypeInvalid;
6047 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
6048
6049 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
6050 {
6051
6052 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
6053 Process *process = exe_ctx.GetProcessPtr();
6054 if (process)
6055 {
6056 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
6057 if (vtable_ctx)
6058 {
6059 if (vtable_ctx->isMicrosoft())
6060 {
6061 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
6062
6063 if (vtable_ptr_addr)
6064 {
6065 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
6066
6067 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
6068 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
6069 {
6070 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
6071 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
6072 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
6073 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
6074 if (base_offset != UINT32_MAX)
6075 {
6076 handled = true;
6077 bit_offset = base_offset * 8;
6078 }
6079 }
6080 }
6081 }
6082 else
6083 {
6084 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
6085 if (vtable_ptr_addr)
6086 {
6087 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
6088 if (vtable_ptr != LLDB_INVALID_ADDRESS)
6089 {
6090 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
6091 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
6092 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
6093 if (base_offset != UINT32_MAX)
6094 {
6095 handled = true;
6096 bit_offset = base_offset * 8;
6097 }
6098 }
6099 }
6100 }
6101 }
6102 }
6103 }
6104
6105 }
6106 if (!handled)
6107 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
6108 }
6109 else
6110 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
6111
6112 // Base classes should be a multiple of 8 bits in size
6113 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006114 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006115 child_name = base_class_clang_type.GetTypeName().AsCString("");
6116 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6117
6118 // Base classes bit sizes should be a multiple of 8 bits in size
6119 assert (base_class_clang_type_bit_size % 8 == 0);
6120 child_byte_size = base_class_clang_type_bit_size / 8;
6121 child_is_base_class = true;
6122 return base_class_clang_type;
6123 }
6124 // We don't increment the child index in the for loop since we might
6125 // be skipping empty base classes
6126 ++child_idx;
6127 }
6128 }
6129 // Make sure index is in range...
6130 uint32_t field_idx = 0;
6131 clang::RecordDecl::field_iterator field, field_end;
6132 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
6133 {
6134 if (idx == child_idx)
6135 {
6136 // Print the member type if requested
6137 // Print the member name and equal sign
6138 child_name.assign(field->getNameAsString().c_str());
6139
6140 // Figure out the type byte size (field_type_info.first) and
6141 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00006142 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006143 assert(field_idx < record_layout.getFieldCount());
6144 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6145
6146 // Figure out the field offset within the current struct/union/class type
6147 bit_offset = record_layout.getFieldOffset (field_idx);
6148 child_byte_offset = bit_offset / 8;
6149 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
6150 child_bitfield_bit_offset = bit_offset % 8;
6151
6152 return field_clang_type;
6153 }
6154 }
6155 }
6156 break;
6157
6158 case clang::Type::ObjCObject:
6159 case clang::Type::ObjCInterface:
6160 if (idx_is_valid && GetCompleteType(type))
6161 {
6162 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
6163 assert (objc_class_type);
6164 if (objc_class_type)
6165 {
6166 uint32_t child_idx = 0;
6167 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6168
6169 if (class_interface_decl)
6170 {
6171
6172 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
6173 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6174 if (superclass_interface_decl)
6175 {
6176 if (omit_empty_base_classes)
6177 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006178 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006179 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
6180 {
6181 if (idx == 0)
6182 {
6183 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
6184
6185
6186 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
6187
6188 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6189
6190 child_byte_size = ivar_type_info.Width / 8;
6191 child_byte_offset = 0;
6192 child_is_base_class = true;
6193
Greg Claytona1e5dc82015-08-11 22:53:00 +00006194 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006195 }
6196
6197 ++child_idx;
6198 }
6199 }
6200 else
6201 ++child_idx;
6202 }
6203
6204 const uint32_t superclass_idx = child_idx;
6205
6206 if (idx < (child_idx + class_interface_decl->ivar_size()))
6207 {
6208 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6209
6210 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
6211 {
6212 if (child_idx == idx)
6213 {
6214 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6215
6216 clang::QualType ivar_qual_type(ivar_decl->getType());
6217
6218 child_name.assign(ivar_decl->getNameAsString().c_str());
6219
6220 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6221
6222 child_byte_size = ivar_type_info.Width / 8;
6223
6224 // Figure out the field offset within the current struct/union/class type
6225 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
6226 // that doesn't account for the space taken up by unbacked properties, or from
6227 // the changing size of base classes that are newer than this class.
6228 // So if we have a process around that we can ask about this object, do so.
6229 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
6230 Process *process = nullptr;
6231 if (exe_ctx)
6232 process = exe_ctx->GetProcessPtr();
6233 if (process)
6234 {
6235 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
6236 if (objc_runtime != nullptr)
6237 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006238 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006239 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
6240 }
6241 }
6242
6243 // Setting this to UINT32_MAX to make sure we don't compute it twice...
6244 bit_offset = UINT32_MAX;
6245
6246 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
6247 {
6248 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6249 child_byte_offset = bit_offset / 8;
6250 }
6251
6252 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
6253 // of a bitfield within its containing object. So regardless of where we get the byte
6254 // offset from, we still need to get the bit offset for bitfields from the layout.
6255
6256 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
6257 {
6258 if (bit_offset == UINT32_MAX)
6259 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6260
6261 child_bitfield_bit_offset = bit_offset % 8;
6262 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006263 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006264 }
6265 ++child_idx;
6266 }
6267 }
6268 }
6269 }
6270 }
6271 break;
6272
6273 case clang::Type::ObjCObjectPointer:
6274 if (idx_is_valid)
6275 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006276 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006277
6278 if (transparent_pointers && pointee_clang_type.IsAggregateType())
6279 {
6280 child_is_deref_of_parent = false;
6281 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006282 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6283 idx,
6284 transparent_pointers,
6285 omit_empty_base_classes,
6286 ignore_array_bounds,
6287 child_name,
6288 child_byte_size,
6289 child_byte_offset,
6290 child_bitfield_bit_size,
6291 child_bitfield_bit_offset,
6292 child_is_base_class,
6293 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006294 valobj,
6295 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006296 }
6297 else
6298 {
6299 child_is_deref_of_parent = true;
6300 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6301 if (parent_name)
6302 {
6303 child_name.assign(1, '*');
6304 child_name += parent_name;
6305 }
6306
6307 // We have a pointer to an simple type
6308 if (idx == 0 && pointee_clang_type.GetCompleteType())
6309 {
6310 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6311 child_byte_offset = 0;
6312 return pointee_clang_type;
6313 }
6314 }
6315 }
6316 break;
6317
6318 case clang::Type::Vector:
6319 case clang::Type::ExtVector:
6320 if (idx_is_valid)
6321 {
6322 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
6323 if (array)
6324 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006325 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006326 if (element_type.GetCompleteType())
6327 {
6328 char element_name[64];
6329 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6330 child_name.assign(element_name);
6331 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6332 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6333 return element_type;
6334 }
6335 }
6336 }
6337 break;
6338
6339 case clang::Type::ConstantArray:
6340 case clang::Type::IncompleteArray:
6341 if (ignore_array_bounds || idx_is_valid)
6342 {
6343 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
6344 if (array)
6345 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006346 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006347 if (element_type.GetCompleteType())
6348 {
6349 char element_name[64];
6350 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6351 child_name.assign(element_name);
6352 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6353 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6354 return element_type;
6355 }
6356 }
6357 }
6358 break;
6359
6360
6361 case clang::Type::Pointer:
6362 if (idx_is_valid)
6363 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006364 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006365
6366 // Don't dereference "void *" pointers
6367 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00006368 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006369
6370 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6371 {
6372 child_is_deref_of_parent = false;
6373 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006374 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6375 idx,
6376 transparent_pointers,
6377 omit_empty_base_classes,
6378 ignore_array_bounds,
6379 child_name,
6380 child_byte_size,
6381 child_byte_offset,
6382 child_bitfield_bit_size,
6383 child_bitfield_bit_offset,
6384 child_is_base_class,
6385 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006386 valobj,
6387 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006388 }
6389 else
6390 {
6391 child_is_deref_of_parent = true;
6392
6393 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6394 if (parent_name)
6395 {
6396 child_name.assign(1, '*');
6397 child_name += parent_name;
6398 }
6399
6400 // We have a pointer to an simple type
6401 if (idx == 0)
6402 {
6403 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6404 child_byte_offset = 0;
6405 return pointee_clang_type;
6406 }
6407 }
6408 }
6409 break;
6410
6411 case clang::Type::LValueReference:
6412 case clang::Type::RValueReference:
6413 if (idx_is_valid)
6414 {
6415 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006416 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006417 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6418 {
6419 child_is_deref_of_parent = false;
6420 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006421 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6422 idx,
6423 transparent_pointers,
6424 omit_empty_base_classes,
6425 ignore_array_bounds,
6426 child_name,
6427 child_byte_size,
6428 child_byte_offset,
6429 child_bitfield_bit_size,
6430 child_bitfield_bit_offset,
6431 child_is_base_class,
6432 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006433 valobj,
6434 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006435 }
6436 else
6437 {
6438 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6439 if (parent_name)
6440 {
6441 child_name.assign(1, '&');
6442 child_name += parent_name;
6443 }
6444
6445 // We have a pointer to an simple type
6446 if (idx == 0)
6447 {
6448 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6449 child_byte_offset = 0;
6450 return pointee_clang_type;
6451 }
6452 }
6453 }
6454 break;
6455
6456 case clang::Type::Typedef:
6457 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006458 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006459 return typedefed_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6460 idx,
6461 transparent_pointers,
6462 omit_empty_base_classes,
6463 ignore_array_bounds,
6464 child_name,
6465 child_byte_size,
6466 child_byte_offset,
6467 child_bitfield_bit_size,
6468 child_bitfield_bit_offset,
6469 child_is_base_class,
6470 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006471 valobj,
6472 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006473 }
6474 break;
6475
Enrico Granata36f51e42015-12-18 22:41:25 +00006476 case clang::Type::Auto:
6477 {
6478 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::AutoType>(parent_qual_type)->getDeducedType());
6479 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6480 idx,
6481 transparent_pointers,
6482 omit_empty_base_classes,
6483 ignore_array_bounds,
6484 child_name,
6485 child_byte_size,
6486 child_byte_offset,
6487 child_bitfield_bit_size,
6488 child_bitfield_bit_offset,
6489 child_is_base_class,
6490 child_is_deref_of_parent,
6491 valobj,
6492 language_flags);
6493 }
6494
Greg Claytond8d4a572015-08-11 21:38:15 +00006495 case clang::Type::Elaborated:
6496 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006497 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006498 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6499 idx,
6500 transparent_pointers,
6501 omit_empty_base_classes,
6502 ignore_array_bounds,
6503 child_name,
6504 child_byte_size,
6505 child_byte_offset,
6506 child_bitfield_bit_size,
6507 child_bitfield_bit_offset,
6508 child_is_base_class,
6509 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006510 valobj,
6511 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006512 }
6513
6514 case clang::Type::Paren:
6515 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006516 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006517 return paren_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6518 idx,
6519 transparent_pointers,
6520 omit_empty_base_classes,
6521 ignore_array_bounds,
6522 child_name,
6523 child_byte_size,
6524 child_byte_offset,
6525 child_bitfield_bit_size,
6526 child_bitfield_bit_offset,
6527 child_is_base_class,
6528 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006529 valobj,
6530 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006531 }
6532
6533
6534 default:
6535 break;
6536 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006537 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006538}
6539
6540static uint32_t
6541GetIndexForRecordBase
6542(
6543 const clang::RecordDecl *record_decl,
6544 const clang::CXXBaseSpecifier *base_spec,
6545 bool omit_empty_base_classes
6546 )
6547{
6548 uint32_t child_idx = 0;
6549
6550 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6551
6552 // const char *super_name = record_decl->getNameAsCString();
6553 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6554 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6555 //
6556 if (cxx_record_decl)
6557 {
6558 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6559 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6560 base_class != base_class_end;
6561 ++base_class)
6562 {
6563 if (omit_empty_base_classes)
6564 {
6565 if (BaseSpecifierIsEmpty (base_class))
6566 continue;
6567 }
6568
6569 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6570 // child_idx,
6571 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6572 //
6573 //
6574 if (base_class == base_spec)
6575 return child_idx;
6576 ++child_idx;
6577 }
6578 }
6579
6580 return UINT32_MAX;
6581}
6582
6583
6584static uint32_t
6585GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6586 clang::NamedDecl *canonical_decl,
6587 bool omit_empty_base_classes)
6588{
6589 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6590 omit_empty_base_classes);
6591
6592 clang::RecordDecl::field_iterator field, field_end;
6593 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6594 field != field_end;
6595 ++field, ++child_idx)
6596 {
6597 if (field->getCanonicalDecl() == canonical_decl)
6598 return child_idx;
6599 }
6600
6601 return UINT32_MAX;
6602}
6603
6604// Look for a child member (doesn't include base classes, but it does include
6605// their members) in the type hierarchy. Returns an index path into "clang_type"
6606// on how to reach the appropriate member.
6607//
6608// class A
6609// {
6610// public:
6611// int m_a;
6612// int m_b;
6613// };
6614//
6615// class B
6616// {
6617// };
6618//
6619// class C :
6620// public B,
6621// public A
6622// {
6623// };
6624//
6625// If we have a clang type that describes "class C", and we wanted to looked
6626// "m_b" in it:
6627//
6628// With omit_empty_base_classes == false we would get an integer array back with:
6629// { 1, 1 }
6630// The first index 1 is the child index for "class A" within class C
6631// The second index 1 is the child index for "m_b" within class A
6632//
6633// With omit_empty_base_classes == true we would get an integer array back with:
6634// { 0, 1 }
6635// 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)
6636// The second index 1 is the child index for "m_b" within class A
6637
6638size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006639ClangASTContext::GetIndexOfChildMemberWithName (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006640 bool omit_empty_base_classes,
6641 std::vector<uint32_t>& child_indexes)
6642{
6643 if (type && name && name[0])
6644 {
6645 clang::QualType qual_type(GetCanonicalQualType(type));
6646 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6647 switch (type_class)
6648 {
6649 case clang::Type::Record:
6650 if (GetCompleteType(type))
6651 {
6652 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6653 const clang::RecordDecl *record_decl = record_type->getDecl();
6654
6655 assert(record_decl);
6656 uint32_t child_idx = 0;
6657
6658 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6659
6660 // Try and find a field that matches NAME
6661 clang::RecordDecl::field_iterator field, field_end;
6662 llvm::StringRef name_sref(name);
6663 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6664 field != field_end;
6665 ++field, ++child_idx)
6666 {
6667 llvm::StringRef field_name = field->getName();
6668 if (field_name.empty())
6669 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006670 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006671 child_indexes.push_back(child_idx);
6672 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
6673 return child_indexes.size();
6674 child_indexes.pop_back();
6675
6676 }
6677 else if (field_name.equals (name_sref))
6678 {
6679 // We have to add on the number of base classes to this index!
6680 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
6681 return child_indexes.size();
6682 }
6683 }
6684
6685 if (cxx_record_decl)
6686 {
6687 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6688
6689 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6690
6691 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6692 // Didn't find things easily, lets let clang do its thang...
6693 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
6694 clang::DeclarationName decl_name(&ident_ref);
6695
6696 clang::CXXBasePaths paths;
6697 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
6698 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
6699 },
6700 paths))
6701 {
6702 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
6703 for (path = paths.begin(); path != path_end; ++path)
6704 {
6705 const size_t num_path_elements = path->size();
6706 for (size_t e=0; e<num_path_elements; ++e)
6707 {
6708 clang::CXXBasePathElement elem = (*path)[e];
6709
6710 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
6711 if (child_idx == UINT32_MAX)
6712 {
6713 child_indexes.clear();
6714 return 0;
6715 }
6716 else
6717 {
6718 child_indexes.push_back (child_idx);
6719 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
6720 }
6721 }
6722 for (clang::NamedDecl *path_decl : path->Decls)
6723 {
6724 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, 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 }
6734 }
6735 }
6736 return child_indexes.size();
6737 }
6738 }
6739
6740 }
6741 break;
6742
6743 case clang::Type::ObjCObject:
6744 case clang::Type::ObjCInterface:
6745 if (GetCompleteType(type))
6746 {
6747 llvm::StringRef name_sref(name);
6748 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6749 assert (objc_class_type);
6750 if (objc_class_type)
6751 {
6752 uint32_t child_idx = 0;
6753 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6754
6755 if (class_interface_decl)
6756 {
6757 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6758 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6759
6760 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6761 {
6762 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6763
6764 if (ivar_decl->getName().equals (name_sref))
6765 {
6766 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6767 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6768 ++child_idx;
6769
6770 child_indexes.push_back (child_idx);
6771 return child_indexes.size();
6772 }
6773 }
6774
6775 if (superclass_interface_decl)
6776 {
6777 // The super class index is always zero for ObjC classes,
6778 // so we push it onto the child indexes in case we find
6779 // an ivar in our superclass...
6780 child_indexes.push_back (0);
6781
Greg Claytona1e5dc82015-08-11 22:53:00 +00006782 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006783 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
6784 omit_empty_base_classes,
6785 child_indexes))
6786 {
6787 // We did find an ivar in a superclass so just
6788 // return the results!
6789 return child_indexes.size();
6790 }
6791
6792 // We didn't find an ivar matching "name" in our
6793 // superclass, pop the superclass zero index that
6794 // we pushed on above.
6795 child_indexes.pop_back();
6796 }
6797 }
6798 }
6799 }
6800 break;
6801
6802 case clang::Type::ObjCObjectPointer:
6803 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006804 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006805 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
6806 omit_empty_base_classes,
6807 child_indexes);
6808 }
6809 break;
6810
6811
6812 case clang::Type::ConstantArray:
6813 {
6814 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6815 // const uint64_t element_count = array->getSize().getLimitedValue();
6816 //
6817 // if (idx < element_count)
6818 // {
6819 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6820 //
6821 // char element_name[32];
6822 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6823 //
6824 // child_name.assign(element_name);
6825 // assert(field_type_info.first % 8 == 0);
6826 // child_byte_size = field_type_info.first / 8;
6827 // child_byte_offset = idx * child_byte_size;
6828 // return array->getElementType().getAsOpaquePtr();
6829 // }
6830 }
6831 break;
6832
6833 // case clang::Type::MemberPointerType:
6834 // {
6835 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6836 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6837 //
6838 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6839 // {
6840 // return GetIndexOfChildWithName (ast,
6841 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6842 // name);
6843 // }
6844 // }
6845 // break;
6846 //
6847 case clang::Type::LValueReference:
6848 case clang::Type::RValueReference:
6849 {
6850 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6851 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006852 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006853
6854 if (pointee_clang_type.IsAggregateType ())
6855 {
6856 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6857 omit_empty_base_classes,
6858 child_indexes);
6859 }
6860 }
6861 break;
6862
6863 case clang::Type::Pointer:
6864 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006865 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006866
6867 if (pointee_clang_type.IsAggregateType ())
6868 {
6869 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6870 omit_empty_base_classes,
6871 child_indexes);
6872 }
6873 }
6874 break;
6875
6876 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006877 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00006878 omit_empty_base_classes,
6879 child_indexes);
6880
6881 case clang::Type::Auto:
6882 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetIndexOfChildMemberWithName (name,
6883 omit_empty_base_classes,
6884 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006885
6886 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006887 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00006888 omit_empty_base_classes,
6889 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006890
6891 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006892 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00006893 omit_empty_base_classes,
6894 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006895
6896 default:
6897 break;
6898 }
6899 }
6900 return 0;
6901}
6902
6903
6904// Get the index of the child of "clang_type" whose name matches. This function
6905// doesn't descend into the children, but only looks one level deep and name
6906// matches can include base class names.
6907
6908uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006909ClangASTContext::GetIndexOfChildWithName (lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00006910{
6911 if (type && name && name[0])
6912 {
6913 clang::QualType qual_type(GetCanonicalQualType(type));
6914
6915 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6916
6917 switch (type_class)
6918 {
6919 case clang::Type::Record:
6920 if (GetCompleteType(type))
6921 {
6922 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6923 const clang::RecordDecl *record_decl = record_type->getDecl();
6924
6925 assert(record_decl);
6926 uint32_t child_idx = 0;
6927
6928 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6929
6930 if (cxx_record_decl)
6931 {
6932 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6933 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6934 base_class != base_class_end;
6935 ++base_class)
6936 {
6937 // Skip empty base classes
6938 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6939 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
6940 continue;
6941
Greg Claytona1e5dc82015-08-11 22:53:00 +00006942 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006943 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
6944 if (base_class_type_name.compare (name) == 0)
6945 return child_idx;
6946 ++child_idx;
6947 }
6948 }
6949
6950 // Try and find a field that matches NAME
6951 clang::RecordDecl::field_iterator field, field_end;
6952 llvm::StringRef name_sref(name);
6953 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6954 field != field_end;
6955 ++field, ++child_idx)
6956 {
6957 if (field->getName().equals (name_sref))
6958 return child_idx;
6959 }
6960
6961 }
6962 break;
6963
6964 case clang::Type::ObjCObject:
6965 case clang::Type::ObjCInterface:
6966 if (GetCompleteType(type))
6967 {
6968 llvm::StringRef name_sref(name);
6969 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6970 assert (objc_class_type);
6971 if (objc_class_type)
6972 {
6973 uint32_t child_idx = 0;
6974 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6975
6976 if (class_interface_decl)
6977 {
6978 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6979 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6980
6981 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6982 {
6983 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6984
6985 if (ivar_decl->getName().equals (name_sref))
6986 {
6987 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6988 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6989 ++child_idx;
6990
6991 return child_idx;
6992 }
6993 }
6994
6995 if (superclass_interface_decl)
6996 {
6997 if (superclass_interface_decl->getName().equals (name_sref))
6998 return 0;
6999 }
7000 }
7001 }
7002 }
7003 break;
7004
7005 case clang::Type::ObjCObjectPointer:
7006 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007007 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007008 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7009 }
7010 break;
7011
7012 case clang::Type::ConstantArray:
7013 {
7014 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
7015 // const uint64_t element_count = array->getSize().getLimitedValue();
7016 //
7017 // if (idx < element_count)
7018 // {
7019 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
7020 //
7021 // char element_name[32];
7022 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
7023 //
7024 // child_name.assign(element_name);
7025 // assert(field_type_info.first % 8 == 0);
7026 // child_byte_size = field_type_info.first / 8;
7027 // child_byte_offset = idx * child_byte_size;
7028 // return array->getElementType().getAsOpaquePtr();
7029 // }
7030 }
7031 break;
7032
7033 // case clang::Type::MemberPointerType:
7034 // {
7035 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
7036 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
7037 //
7038 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
7039 // {
7040 // return GetIndexOfChildWithName (ast,
7041 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
7042 // name);
7043 // }
7044 // }
7045 // break;
7046 //
7047 case clang::Type::LValueReference:
7048 case clang::Type::RValueReference:
7049 {
7050 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00007051 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007052
7053 if (pointee_type.IsAggregateType ())
7054 {
7055 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7056 }
7057 }
7058 break;
7059
7060 case clang::Type::Pointer:
7061 {
7062 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00007063 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007064
7065 if (pointee_type.IsAggregateType ())
7066 {
7067 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7068 }
7069 else
7070 {
7071 // if (parent_name)
7072 // {
7073 // child_name.assign(1, '*');
7074 // child_name += parent_name;
7075 // }
7076 //
7077 // // We have a pointer to an simple type
7078 // if (idx == 0)
7079 // {
7080 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
7081 // assert(clang_type_info.first % 8 == 0);
7082 // child_byte_size = clang_type_info.first / 8;
7083 // child_byte_offset = 0;
7084 // return pointee_type.getAsOpaquePtr();
7085 // }
7086 }
7087 }
7088 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00007089
7090 case clang::Type::Auto:
7091 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007092
7093 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007094 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007095
7096 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007097 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007098
7099 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007100 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007101
7102 default:
7103 break;
7104 }
7105 }
7106 return UINT32_MAX;
7107}
7108
7109
7110size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007111ClangASTContext::GetNumTemplateArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007112{
7113 if (!type)
7114 return 0;
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007115
7116 clang::QualType qual_type (GetCanonicalQualType(type));
7117 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7118 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007119 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007120 case clang::Type::Record:
7121 if (GetCompleteType(type))
7122 {
7123 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7124 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007125 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007126 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7127 if (template_decl)
7128 return template_decl->getTemplateArgs().size();
Greg Claytond8d4a572015-08-11 21:38:15 +00007129 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007130 }
7131 break;
7132
7133 case clang::Type::Typedef:
7134 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
Enrico Granata36f51e42015-12-18 22:41:25 +00007135
7136 case clang::Type::Auto:
7137 return (CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType())).GetNumTemplateArguments();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007138
7139 case clang::Type::Elaborated:
7140 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
7141
7142 case clang::Type::Paren:
7143 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
7144
7145 default:
7146 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007147 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007148
Greg Claytond8d4a572015-08-11 21:38:15 +00007149 return 0;
7150}
7151
Greg Claytona1e5dc82015-08-11 22:53:00 +00007152CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007153ClangASTContext::GetTemplateArgument (lldb::opaque_compiler_type_t type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00007154{
7155 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007156 return CompilerType();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007157
7158 clang::QualType qual_type (GetCanonicalQualType(type));
7159 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7160 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007161 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007162 case clang::Type::Record:
7163 if (GetCompleteType(type))
7164 {
7165 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7166 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007167 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007168 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7169 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
Greg Claytond8d4a572015-08-11 21:38:15 +00007170 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007171 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
7172 switch (template_arg.getKind())
Greg Claytond8d4a572015-08-11 21:38:15 +00007173 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007174 case clang::TemplateArgument::Null:
7175 kind = eTemplateArgumentKindNull;
7176 return CompilerType();
7177
7178 case clang::TemplateArgument::Type:
7179 kind = eTemplateArgumentKindType;
7180 return CompilerType(getASTContext(), template_arg.getAsType());
7181
7182 case clang::TemplateArgument::Declaration:
7183 kind = eTemplateArgumentKindDeclaration;
7184 return CompilerType();
7185
7186 case clang::TemplateArgument::Integral:
7187 kind = eTemplateArgumentKindIntegral;
7188 return CompilerType(getASTContext(), template_arg.getIntegralType());
7189
7190 case clang::TemplateArgument::Template:
7191 kind = eTemplateArgumentKindTemplate;
7192 return CompilerType();
7193
7194 case clang::TemplateArgument::TemplateExpansion:
7195 kind = eTemplateArgumentKindTemplateExpansion;
7196 return CompilerType();
7197
7198 case clang::TemplateArgument::Expression:
7199 kind = eTemplateArgumentKindExpression;
7200 return CompilerType();
7201
7202 case clang::TemplateArgument::Pack:
7203 kind = eTemplateArgumentKindPack;
7204 return CompilerType();
7205
7206 default:
7207 assert (!"Unhandled clang::TemplateArgument::ArgKind");
7208 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007209 }
7210 }
7211 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007212 }
7213 break;
7214
7215 case clang::Type::Typedef:
7216 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
Enrico Granata36f51e42015-12-18 22:41:25 +00007217
7218 case clang::Type::Auto:
7219 return (CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType())).GetTemplateArgument(arg_idx, kind);
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007220
7221 case clang::Type::Elaborated:
7222 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
7223
7224 case clang::Type::Paren:
7225 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
7226
7227 default:
7228 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007229 }
7230 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00007231 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00007232}
7233
Enrico Granatac6bf2e22015-09-23 01:39:46 +00007234CompilerType
7235ClangASTContext::GetTypeForFormatters (void* type)
7236{
7237 if (type)
7238 return RemoveFastQualifiers(CompilerType(this, type));
7239 return CompilerType();
7240}
7241
Greg Claytond8d4a572015-08-11 21:38:15 +00007242static bool
7243IsOperator (const char *name, clang::OverloadedOperatorKind &op_kind)
7244{
7245 if (name == nullptr || name[0] == '\0')
7246 return false;
7247
7248#define OPERATOR_PREFIX "operator"
7249#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
7250
7251 const char *post_op_name = nullptr;
7252
7253 bool no_space = true;
7254
7255 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
7256 return false;
7257
7258 post_op_name = name + OPERATOR_PREFIX_LENGTH;
7259
7260 if (post_op_name[0] == ' ')
7261 {
7262 post_op_name++;
7263 no_space = false;
7264 }
7265
7266#undef OPERATOR_PREFIX
7267#undef OPERATOR_PREFIX_LENGTH
7268
7269 // This is an operator, set the overloaded operator kind to invalid
7270 // in case this is a conversion operator...
7271 op_kind = clang::NUM_OVERLOADED_OPERATORS;
7272
7273 switch (post_op_name[0])
7274 {
7275 default:
7276 if (no_space)
7277 return false;
7278 break;
7279 case 'n':
7280 if (no_space)
7281 return false;
7282 if (strcmp (post_op_name, "new") == 0)
7283 op_kind = clang::OO_New;
7284 else if (strcmp (post_op_name, "new[]") == 0)
7285 op_kind = clang::OO_Array_New;
7286 break;
7287
7288 case 'd':
7289 if (no_space)
7290 return false;
7291 if (strcmp (post_op_name, "delete") == 0)
7292 op_kind = clang::OO_Delete;
7293 else if (strcmp (post_op_name, "delete[]") == 0)
7294 op_kind = clang::OO_Array_Delete;
7295 break;
7296
7297 case '+':
7298 if (post_op_name[1] == '\0')
7299 op_kind = clang::OO_Plus;
7300 else if (post_op_name[2] == '\0')
7301 {
7302 if (post_op_name[1] == '=')
7303 op_kind = clang::OO_PlusEqual;
7304 else if (post_op_name[1] == '+')
7305 op_kind = clang::OO_PlusPlus;
7306 }
7307 break;
7308
7309 case '-':
7310 if (post_op_name[1] == '\0')
7311 op_kind = clang::OO_Minus;
7312 else if (post_op_name[2] == '\0')
7313 {
7314 switch (post_op_name[1])
7315 {
7316 case '=': op_kind = clang::OO_MinusEqual; break;
7317 case '-': op_kind = clang::OO_MinusMinus; break;
7318 case '>': op_kind = clang::OO_Arrow; break;
7319 }
7320 }
7321 else if (post_op_name[3] == '\0')
7322 {
7323 if (post_op_name[2] == '*')
7324 op_kind = clang::OO_ArrowStar; break;
7325 }
7326 break;
7327
7328 case '*':
7329 if (post_op_name[1] == '\0')
7330 op_kind = clang::OO_Star;
7331 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7332 op_kind = clang::OO_StarEqual;
7333 break;
7334
7335 case '/':
7336 if (post_op_name[1] == '\0')
7337 op_kind = clang::OO_Slash;
7338 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7339 op_kind = clang::OO_SlashEqual;
7340 break;
7341
7342 case '%':
7343 if (post_op_name[1] == '\0')
7344 op_kind = clang::OO_Percent;
7345 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7346 op_kind = clang::OO_PercentEqual;
7347 break;
7348
7349
7350 case '^':
7351 if (post_op_name[1] == '\0')
7352 op_kind = clang::OO_Caret;
7353 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7354 op_kind = clang::OO_CaretEqual;
7355 break;
7356
7357 case '&':
7358 if (post_op_name[1] == '\0')
7359 op_kind = clang::OO_Amp;
7360 else if (post_op_name[2] == '\0')
7361 {
7362 switch (post_op_name[1])
7363 {
7364 case '=': op_kind = clang::OO_AmpEqual; break;
7365 case '&': op_kind = clang::OO_AmpAmp; break;
7366 }
7367 }
7368 break;
7369
7370 case '|':
7371 if (post_op_name[1] == '\0')
7372 op_kind = clang::OO_Pipe;
7373 else if (post_op_name[2] == '\0')
7374 {
7375 switch (post_op_name[1])
7376 {
7377 case '=': op_kind = clang::OO_PipeEqual; break;
7378 case '|': op_kind = clang::OO_PipePipe; break;
7379 }
7380 }
7381 break;
7382
7383 case '~':
7384 if (post_op_name[1] == '\0')
7385 op_kind = clang::OO_Tilde;
7386 break;
7387
7388 case '!':
7389 if (post_op_name[1] == '\0')
7390 op_kind = clang::OO_Exclaim;
7391 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7392 op_kind = clang::OO_ExclaimEqual;
7393 break;
7394
7395 case '=':
7396 if (post_op_name[1] == '\0')
7397 op_kind = clang::OO_Equal;
7398 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7399 op_kind = clang::OO_EqualEqual;
7400 break;
7401
7402 case '<':
7403 if (post_op_name[1] == '\0')
7404 op_kind = clang::OO_Less;
7405 else if (post_op_name[2] == '\0')
7406 {
7407 switch (post_op_name[1])
7408 {
7409 case '<': op_kind = clang::OO_LessLess; break;
7410 case '=': op_kind = clang::OO_LessEqual; break;
7411 }
7412 }
7413 else if (post_op_name[3] == '\0')
7414 {
7415 if (post_op_name[2] == '=')
7416 op_kind = clang::OO_LessLessEqual;
7417 }
7418 break;
7419
7420 case '>':
7421 if (post_op_name[1] == '\0')
7422 op_kind = clang::OO_Greater;
7423 else if (post_op_name[2] == '\0')
7424 {
7425 switch (post_op_name[1])
7426 {
7427 case '>': op_kind = clang::OO_GreaterGreater; break;
7428 case '=': op_kind = clang::OO_GreaterEqual; break;
7429 }
7430 }
7431 else if (post_op_name[1] == '>' &&
7432 post_op_name[2] == '=' &&
7433 post_op_name[3] == '\0')
7434 {
7435 op_kind = clang::OO_GreaterGreaterEqual;
7436 }
7437 break;
7438
7439 case ',':
7440 if (post_op_name[1] == '\0')
7441 op_kind = clang::OO_Comma;
7442 break;
7443
7444 case '(':
7445 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
7446 op_kind = clang::OO_Call;
7447 break;
7448
7449 case '[':
7450 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
7451 op_kind = clang::OO_Subscript;
7452 break;
7453 }
7454
7455 return true;
7456}
7457
7458clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007459ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007460{
7461 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
7462 if (enutype)
7463 return enutype->getDecl();
7464 return NULL;
7465}
7466
7467clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007468ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007469{
7470 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(GetCanonicalQualType(type));
7471 if (record_type)
7472 return record_type->getDecl();
7473 return nullptr;
7474}
7475
Greg Claytone6b36cd2015-12-08 01:02:08 +00007476clang::TagDecl *
7477ClangASTContext::GetAsTagDecl (const CompilerType& type)
7478{
7479 clang::QualType qual_type = GetCanonicalQualType(type);
7480 if (qual_type.isNull())
7481 return nullptr;
7482 else
7483 return qual_type->getAsTagDecl();
7484}
7485
Greg Claytond8d4a572015-08-11 21:38:15 +00007486clang::CXXRecordDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007487ClangASTContext::GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007488{
7489 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
7490}
7491
7492clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007493ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007494{
7495 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(GetCanonicalQualType(type));
7496 if (objc_class_type)
7497 return objc_class_type->getInterface();
7498 return nullptr;
7499}
7500
7501clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007502ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
7503 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007504 AccessType access,
7505 uint32_t bitfield_bit_size)
7506{
7507 if (!type.IsValid() || !field_clang_type.IsValid())
7508 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007509 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007510 if (!ast)
7511 return nullptr;
7512 clang::ASTContext* clang_ast = ast->getASTContext();
7513
7514 clang::FieldDecl *field = nullptr;
7515
7516 clang::Expr *bit_width = nullptr;
7517 if (bitfield_bit_size != 0)
7518 {
7519 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
7520 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
7521 }
7522
7523 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7524 if (record_decl)
7525 {
7526 field = clang::FieldDecl::Create (*clang_ast,
7527 record_decl,
7528 clang::SourceLocation(),
7529 clang::SourceLocation(),
7530 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7531 GetQualType(field_clang_type), // Field type
7532 nullptr, // TInfo *
7533 bit_width, // BitWidth
7534 false, // Mutable
7535 clang::ICIS_NoInit); // HasInit
7536
7537 if (!name)
7538 {
7539 // Determine whether this field corresponds to an anonymous
7540 // struct or union.
7541 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
7542 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
7543 if (!Rec->getDeclName()) {
7544 Rec->setAnonymousStructOrUnion(true);
7545 field->setImplicit();
7546
7547 }
7548 }
7549 }
7550
7551 if (field)
7552 {
7553 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7554
7555 record_decl->addDecl(field);
7556
7557#ifdef LLDB_CONFIGURATION_DEBUG
7558 VerifyDecl(field);
7559#endif
7560 }
7561 }
7562 else
7563 {
7564 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7565
7566 if (class_interface_decl)
7567 {
7568 const bool is_synthesized = false;
7569
7570 field_clang_type.GetCompleteType();
7571
7572 field = clang::ObjCIvarDecl::Create (*clang_ast,
7573 class_interface_decl,
7574 clang::SourceLocation(),
7575 clang::SourceLocation(),
7576 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7577 GetQualType(field_clang_type), // Field type
7578 nullptr, // TypeSourceInfo *
7579 ConvertAccessTypeToObjCIvarAccessControl (access),
7580 bit_width,
7581 is_synthesized);
7582
7583 if (field)
7584 {
7585 class_interface_decl->addDecl(field);
7586
7587#ifdef LLDB_CONFIGURATION_DEBUG
7588 VerifyDecl(field);
7589#endif
7590 }
7591 }
7592 }
7593 return field;
7594}
7595
7596void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007597ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007598{
Greg Claytonf73034f2015-09-08 18:15:05 +00007599 if (!type)
7600 return;
7601
7602 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007603 if (!ast)
7604 return;
7605
7606 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7607
7608 if (!record_decl)
7609 return;
7610
7611 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7612
7613 IndirectFieldVector indirect_fields;
7614 clang::RecordDecl::field_iterator field_pos;
7615 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7616 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7617 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7618 {
7619 if (field_pos->isAnonymousStructOrUnion())
7620 {
7621 clang::QualType field_qual_type = field_pos->getType();
7622
7623 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7624
7625 if (!field_record_type)
7626 continue;
7627
7628 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7629
7630 if (!field_record_decl)
7631 continue;
7632
7633 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7634 di != de;
7635 ++di)
7636 {
7637 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7638 {
7639 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7640 chain[0] = *field_pos;
7641 chain[1] = nested_field_decl;
7642 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7643 record_decl,
7644 clang::SourceLocation(),
7645 nested_field_decl->getIdentifier(),
7646 nested_field_decl->getType(),
7647 chain,
7648 2);
7649
7650 indirect_field->setImplicit();
7651
7652 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7653 nested_field_decl->getAccess()));
7654
7655 indirect_fields.push_back(indirect_field);
7656 }
7657 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7658 {
7659 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
7660 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7661 chain[0] = *field_pos;
7662
7663 int chain_index = 1;
7664 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7665 nce = nested_indirect_field_decl->chain_end();
7666 nci < nce;
7667 ++nci)
7668 {
7669 chain[chain_index] = *nci;
7670 chain_index++;
7671 }
7672
7673 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7674 record_decl,
7675 clang::SourceLocation(),
7676 nested_indirect_field_decl->getIdentifier(),
7677 nested_indirect_field_decl->getType(),
7678 chain,
7679 nested_chain_size + 1);
7680
7681 indirect_field->setImplicit();
7682
7683 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7684 nested_indirect_field_decl->getAccess()));
7685
7686 indirect_fields.push_back(indirect_field);
7687 }
7688 }
7689 }
7690 }
7691
7692 // Check the last field to see if it has an incomplete array type as its
7693 // last member and if it does, the tell the record decl about it
7694 if (last_field_pos != field_end_pos)
7695 {
7696 if (last_field_pos->getType()->isIncompleteArrayType())
7697 record_decl->hasFlexibleArrayMember();
7698 }
7699
7700 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7701 ifi < ife;
7702 ++ifi)
7703 {
7704 record_decl->addDecl(*ifi);
7705 }
7706}
7707
7708void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007709ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007710{
Greg Claytonf73034f2015-09-08 18:15:05 +00007711 if (type)
7712 {
7713 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7714 if (ast)
7715 {
7716 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007717
Greg Claytonf73034f2015-09-08 18:15:05 +00007718 if (!record_decl)
7719 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00007720
Greg Claytonf73034f2015-09-08 18:15:05 +00007721 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*ast->getASTContext()));
7722 }
7723 }
Greg Claytond8d4a572015-08-11 21:38:15 +00007724}
7725
7726clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007727ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7728 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007729 AccessType access)
7730{
7731 clang::VarDecl *var_decl = nullptr;
7732
7733 if (!type.IsValid() || !var_type.IsValid())
7734 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007735 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007736 if (!ast)
7737 return nullptr;
7738
7739 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7740 if (record_decl)
7741 {
7742 var_decl = clang::VarDecl::Create (*ast->getASTContext(), // ASTContext &
7743 record_decl, // DeclContext *
7744 clang::SourceLocation(), // clang::SourceLocation StartLoc
7745 clang::SourceLocation(), // clang::SourceLocation IdLoc
7746 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7747 GetQualType(var_type), // Variable clang::QualType
7748 nullptr, // TypeSourceInfo *
7749 clang::SC_Static); // StorageClass
7750 if (var_decl)
7751 {
7752 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7753 record_decl->addDecl(var_decl);
7754
7755#ifdef LLDB_CONFIGURATION_DEBUG
7756 VerifyDecl(var_decl);
7757#endif
7758 }
7759 }
7760 return var_decl;
7761}
7762
7763
7764clang::CXXMethodDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007765ClangASTContext::AddMethodToCXXRecordType (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007766 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007767 lldb::AccessType access,
7768 bool is_virtual,
7769 bool is_static,
7770 bool is_inline,
7771 bool is_explicit,
7772 bool is_attr_used,
7773 bool is_artificial)
7774{
7775 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7776 return nullptr;
7777
7778 clang::QualType record_qual_type(GetCanonicalQualType(type));
7779
7780 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7781
7782 if (cxx_record_decl == nullptr)
7783 return nullptr;
7784
7785 clang::QualType method_qual_type (GetQualType(method_clang_type));
7786
7787 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7788
7789 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7790
7791 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7792
7793 if (function_type == nullptr)
7794 return nullptr;
7795
7796 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7797
7798 if (!method_function_prototype)
7799 return nullptr;
7800
7801 unsigned int num_params = method_function_prototype->getNumParams();
7802
7803 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7804 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7805
7806 if (is_artificial)
7807 return nullptr; // skip everything artificial
7808
7809 if (name[0] == '~')
7810 {
7811 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7812 cxx_record_decl,
7813 clang::SourceLocation(),
7814 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7815 method_qual_type,
7816 nullptr,
7817 is_inline,
7818 is_artificial);
7819 cxx_method_decl = cxx_dtor_decl;
7820 }
7821 else if (decl_name == cxx_record_decl->getDeclName())
7822 {
7823 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
7824 cxx_record_decl,
7825 clang::SourceLocation(),
7826 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7827 method_qual_type,
7828 nullptr, // TypeSourceInfo *
7829 is_explicit,
7830 is_inline,
7831 is_artificial,
7832 false /*is_constexpr*/);
7833 cxx_method_decl = cxx_ctor_decl;
7834 }
7835 else
7836 {
7837 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7838 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7839
7840 if (IsOperator (name, op_kind))
7841 {
7842 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
7843 {
7844 // Check the number of operator parameters. Sometimes we have
7845 // seen bad DWARF that doesn't correctly describe operators and
7846 // if we try to create a method and add it to the class, clang
7847 // will assert and crash, so we need to make sure things are
7848 // acceptable.
7849 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
7850 return nullptr;
7851 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7852 cxx_record_decl,
7853 clang::SourceLocation(),
7854 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
7855 method_qual_type,
7856 nullptr, // TypeSourceInfo *
7857 SC,
7858 is_inline,
7859 false /*is_constexpr*/,
7860 clang::SourceLocation());
7861 }
7862 else if (num_params == 0)
7863 {
7864 // Conversion operators don't take params...
7865 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
7866 cxx_record_decl,
7867 clang::SourceLocation(),
7868 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
7869 method_qual_type,
7870 nullptr, // TypeSourceInfo *
7871 is_inline,
7872 is_explicit,
7873 false /*is_constexpr*/,
7874 clang::SourceLocation());
7875 }
7876 }
7877
7878 if (cxx_method_decl == nullptr)
7879 {
7880 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7881 cxx_record_decl,
7882 clang::SourceLocation(),
7883 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
7884 method_qual_type,
7885 nullptr, // TypeSourceInfo *
7886 SC,
7887 is_inline,
7888 false /*is_constexpr*/,
7889 clang::SourceLocation());
7890 }
7891 }
7892
7893 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
7894
7895 cxx_method_decl->setAccess (access_specifier);
7896 cxx_method_decl->setVirtualAsWritten (is_virtual);
7897
7898 if (is_attr_used)
7899 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
7900
7901 // Populate the method decl with parameter decls
7902
7903 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7904
7905 for (unsigned param_index = 0;
7906 param_index < num_params;
7907 ++param_index)
7908 {
7909 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
7910 cxx_method_decl,
7911 clang::SourceLocation(),
7912 clang::SourceLocation(),
7913 nullptr, // anonymous
7914 method_function_prototype->getParamType(param_index),
7915 nullptr,
7916 clang::SC_None,
7917 nullptr));
7918 }
7919
7920 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
7921
7922 cxx_record_decl->addDecl (cxx_method_decl);
7923
7924 // Sometimes the debug info will mention a constructor (default/copy/move),
7925 // destructor, or assignment operator (copy/move) but there won't be any
7926 // version of this in the code. So we check if the function was artificially
7927 // generated and if it is trivial and this lets the compiler/backend know
7928 // that it can inline the IR for these when it needs to and we can avoid a
7929 // "missing function" error when running expressions.
7930
7931 if (is_artificial)
7932 {
7933 if (cxx_ctor_decl &&
7934 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
7935 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
7936 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
7937 {
7938 cxx_ctor_decl->setDefaulted();
7939 cxx_ctor_decl->setTrivial(true);
7940 }
7941 else if (cxx_dtor_decl)
7942 {
7943 if (cxx_record_decl->hasTrivialDestructor())
7944 {
7945 cxx_dtor_decl->setDefaulted();
7946 cxx_dtor_decl->setTrivial(true);
7947 }
7948 }
7949 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
7950 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
7951 {
7952 cxx_method_decl->setDefaulted();
7953 cxx_method_decl->setTrivial(true);
7954 }
7955 }
7956
7957#ifdef LLDB_CONFIGURATION_DEBUG
7958 VerifyDecl(cxx_method_decl);
7959#endif
7960
7961 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
7962 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
7963 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
7964 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
7965 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
7966 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
7967 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
7968 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
7969 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
7970 return cxx_method_decl;
7971}
7972
7973
7974#pragma mark C++ Base Classes
7975
7976clang::CXXBaseSpecifier *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007977ClangASTContext::CreateBaseClassSpecifier (lldb::opaque_compiler_type_t type, AccessType access, bool is_virtual, bool base_of_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007978{
7979 if (type)
7980 return new clang::CXXBaseSpecifier (clang::SourceRange(),
7981 is_virtual,
7982 base_of_class,
7983 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
7984 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
7985 clang::SourceLocation());
7986 return nullptr;
7987}
7988
7989void
7990ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
7991{
7992 for (unsigned i=0; i<num_base_classes; ++i)
7993 {
7994 delete base_classes[i];
7995 base_classes[i] = nullptr;
7996 }
7997}
7998
7999bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008000ClangASTContext::SetBaseClassesForClassType (lldb::opaque_compiler_type_t type, clang::CXXBaseSpecifier const * const *base_classes,
Greg Claytond8d4a572015-08-11 21:38:15 +00008001 unsigned num_base_classes)
8002{
8003 if (type)
8004 {
8005 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
8006 if (cxx_record_decl)
8007 {
8008 cxx_record_decl->setBases(base_classes, num_base_classes);
8009 return true;
8010 }
8011 }
8012 return false;
8013}
8014
8015bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008016ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008017{
Greg Claytonf73034f2015-09-08 18:15:05 +00008018 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008019 if (!ast)
8020 return false;
8021 clang::ASTContext* clang_ast = ast->getASTContext();
8022
8023 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
8024 {
8025 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8026 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
8027 if (class_interface_decl && super_interface_decl)
8028 {
8029 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
8030 return true;
8031 }
8032 }
8033 return false;
8034}
8035
8036bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008037ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008038 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00008039 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008040 clang::ObjCIvarDecl *ivar_decl,
8041 const char *property_setter_name,
8042 const char *property_getter_name,
8043 uint32_t property_attributes,
8044 ClangASTMetadata *metadata)
8045{
8046 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
8047 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00008048 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008049 if (!ast)
8050 return false;
8051 clang::ASTContext* clang_ast = ast->getASTContext();
8052
8053 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8054
8055 if (class_interface_decl)
8056 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008057 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00008058
8059 if (property_clang_type.IsValid())
8060 property_clang_type_to_access = property_clang_type;
8061 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008062 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008063
8064 if (class_interface_decl && property_clang_type_to_access.IsValid())
8065 {
8066 clang::TypeSourceInfo *prop_type_source;
8067 if (ivar_decl)
8068 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
8069 else
8070 prop_type_source = clang_ast->getTrivialTypeSourceInfo (GetQualType(property_clang_type));
8071
8072 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create (*clang_ast,
8073 class_interface_decl,
8074 clang::SourceLocation(), // Source Location
8075 &clang_ast->Idents.get(property_name),
8076 clang::SourceLocation(), //Source Location for AT
8077 clang::SourceLocation(), //Source location for (
8078 ivar_decl ? ivar_decl->getType() : ClangASTContext::GetQualType(property_clang_type),
8079 prop_type_source);
8080
8081 if (property_decl)
8082 {
8083 if (metadata)
8084 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
8085
8086 class_interface_decl->addDecl (property_decl);
8087
8088 clang::Selector setter_sel, getter_sel;
8089
8090 if (property_setter_name != nullptr)
8091 {
8092 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
8093 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
8094 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
8095 }
8096 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
8097 {
8098 std::string setter_sel_string("set");
8099 setter_sel_string.push_back(::toupper(property_name[0]));
8100 setter_sel_string.append(&property_name[1]);
8101 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
8102 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
8103 }
8104 property_decl->setSetterName(setter_sel);
8105 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
8106
8107 if (property_getter_name != nullptr)
8108 {
8109 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
8110 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
8111 }
8112 else
8113 {
8114 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
8115 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
8116 }
8117 property_decl->setGetterName(getter_sel);
8118 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
8119
8120 if (ivar_decl)
8121 property_decl->setPropertyIvarDecl (ivar_decl);
8122
8123 if (property_attributes & DW_APPLE_PROPERTY_readonly)
8124 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
8125 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
8126 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
8127 if (property_attributes & DW_APPLE_PROPERTY_assign)
8128 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
8129 if (property_attributes & DW_APPLE_PROPERTY_retain)
8130 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
8131 if (property_attributes & DW_APPLE_PROPERTY_copy)
8132 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
8133 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
8134 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
8135
8136 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
8137 {
8138 const bool isInstance = true;
8139 const bool isVariadic = false;
8140 const bool isSynthesized = false;
8141 const bool isImplicitlyDeclared = true;
8142 const bool isDefined = false;
8143 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8144 const bool HasRelatedResultType = false;
8145
8146 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create (*clang_ast,
8147 clang::SourceLocation(),
8148 clang::SourceLocation(),
8149 getter_sel,
8150 GetQualType(property_clang_type_to_access),
8151 nullptr,
8152 class_interface_decl,
8153 isInstance,
8154 isVariadic,
8155 isSynthesized,
8156 isImplicitlyDeclared,
8157 isDefined,
8158 impControl,
8159 HasRelatedResultType);
8160
8161 if (getter && metadata)
8162 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
8163
8164 if (getter)
8165 {
8166 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
8167
8168 class_interface_decl->addDecl(getter);
8169 }
8170 }
8171
8172 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
8173 {
8174 clang::QualType result_type = clang_ast->VoidTy;
8175
8176 const bool isInstance = true;
8177 const bool isVariadic = false;
8178 const bool isSynthesized = false;
8179 const bool isImplicitlyDeclared = true;
8180 const bool isDefined = false;
8181 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8182 const bool HasRelatedResultType = false;
8183
8184 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
8185 clang::SourceLocation(),
8186 clang::SourceLocation(),
8187 setter_sel,
8188 result_type,
8189 nullptr,
8190 class_interface_decl,
8191 isInstance,
8192 isVariadic,
8193 isSynthesized,
8194 isImplicitlyDeclared,
8195 isDefined,
8196 impControl,
8197 HasRelatedResultType);
8198
8199 if (setter && metadata)
8200 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
8201
8202 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
8203
8204 params.push_back (clang::ParmVarDecl::Create (*clang_ast,
8205 setter,
8206 clang::SourceLocation(),
8207 clang::SourceLocation(),
8208 nullptr, // anonymous
8209 GetQualType(property_clang_type_to_access),
8210 nullptr,
8211 clang::SC_Auto,
8212 nullptr));
8213
8214 if (setter)
8215 {
8216 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8217
8218 class_interface_decl->addDecl(setter);
8219 }
8220 }
8221
8222 return true;
8223 }
8224 }
8225 }
8226 return false;
8227}
8228
8229bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008230ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00008231{
8232 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8233 if (class_interface_decl)
8234 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
8235 return false;
8236}
8237
8238
8239clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00008240ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008241 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 +00008242 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008243 lldb::AccessType access,
8244 bool is_artificial)
8245{
8246 if (!type || !method_clang_type.IsValid())
8247 return nullptr;
8248
8249 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
8250
8251 if (class_interface_decl == nullptr)
8252 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00008253 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8254 if (lldb_ast == nullptr)
8255 return nullptr;
8256 clang::ASTContext *ast = lldb_ast->getASTContext();
8257
Greg Claytond8d4a572015-08-11 21:38:15 +00008258 const char *selector_start = ::strchr (name, ' ');
8259 if (selector_start == nullptr)
8260 return nullptr;
8261
8262 selector_start++;
8263 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
8264
8265 size_t len = 0;
8266 const char *start;
8267 //printf ("name = '%s'\n", name);
8268
8269 unsigned num_selectors_with_args = 0;
8270 for (start = selector_start;
8271 start && *start != '\0' && *start != ']';
8272 start += len)
8273 {
8274 len = ::strcspn(start, ":]");
8275 bool has_arg = (start[len] == ':');
8276 if (has_arg)
8277 ++num_selectors_with_args;
8278 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
8279 if (has_arg)
8280 len += 1;
8281 }
8282
8283
8284 if (selector_idents.size() == 0)
8285 return nullptr;
8286
8287 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
8288 selector_idents.data());
8289
8290 clang::QualType method_qual_type (GetQualType(method_clang_type));
8291
8292 // Populate the method decl with parameter decls
8293 const clang::Type *method_type(method_qual_type.getTypePtr());
8294
8295 if (method_type == nullptr)
8296 return nullptr;
8297
8298 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
8299
8300 if (!method_function_prototype)
8301 return nullptr;
8302
8303
8304 bool is_variadic = false;
8305 bool is_synthesized = false;
8306 bool is_defined = false;
8307 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
8308
8309 const unsigned num_args = method_function_prototype->getNumParams();
8310
8311 if (num_args != num_selectors_with_args)
8312 return nullptr; // some debug information is corrupt. We are not going to deal with it.
8313
8314 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create (*ast,
8315 clang::SourceLocation(), // beginLoc,
8316 clang::SourceLocation(), // endLoc,
8317 method_selector,
8318 method_function_prototype->getReturnType(),
8319 nullptr, // TypeSourceInfo *ResultTInfo,
8320 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(GetQualType(type)),
8321 name[0] == '-',
8322 is_variadic,
8323 is_synthesized,
8324 true, // is_implicitly_declared; we force this to true because we don't have source locations
8325 is_defined,
8326 imp_control,
8327 false /*has_related_result_type*/);
8328
8329
8330 if (objc_method_decl == nullptr)
8331 return nullptr;
8332
8333 if (num_args > 0)
8334 {
8335 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
8336
8337 for (unsigned param_index = 0; param_index < num_args; ++param_index)
8338 {
8339 params.push_back (clang::ParmVarDecl::Create (*ast,
8340 objc_method_decl,
8341 clang::SourceLocation(),
8342 clang::SourceLocation(),
8343 nullptr, // anonymous
8344 method_function_prototype->getParamType(param_index),
8345 nullptr,
8346 clang::SC_Auto,
8347 nullptr));
8348 }
8349
8350 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8351 }
8352
8353 class_interface_decl->addDecl (objc_method_decl);
8354
8355#ifdef LLDB_CONFIGURATION_DEBUG
8356 VerifyDecl(objc_method_decl);
8357#endif
8358
8359 return objc_method_decl;
8360}
8361
8362bool
Greg Claytone6b36cd2015-12-08 01:02:08 +00008363ClangASTContext::GetHasExternalStorage (const CompilerType &type)
8364{
8365 if (IsClangType(type))
8366 return false;
8367
8368 clang::QualType qual_type (GetCanonicalQualType(type));
8369
8370 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8371 switch (type_class)
8372 {
8373 case clang::Type::Record:
8374 {
8375 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8376 if (cxx_record_decl)
8377 return cxx_record_decl->hasExternalLexicalStorage () || cxx_record_decl->hasExternalVisibleStorage();
8378 }
8379 break;
8380
8381 case clang::Type::Enum:
8382 {
8383 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8384 if (enum_decl)
8385 return enum_decl->hasExternalLexicalStorage () || enum_decl->hasExternalVisibleStorage();
8386 }
8387 break;
8388
8389 case clang::Type::ObjCObject:
8390 case clang::Type::ObjCInterface:
8391 {
8392 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8393 assert (objc_class_type);
8394 if (objc_class_type)
8395 {
8396 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8397
8398 if (class_interface_decl)
8399 return class_interface_decl->hasExternalLexicalStorage () || class_interface_decl->hasExternalVisibleStorage ();
8400 }
8401 }
8402 break;
8403
8404 case clang::Type::Typedef:
8405 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()));
8406
Enrico Granata36f51e42015-12-18 22:41:25 +00008407 case clang::Type::Auto:
8408 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()));
8409
Greg Claytone6b36cd2015-12-08 01:02:08 +00008410 case clang::Type::Elaborated:
8411 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
8412
8413 case clang::Type::Paren:
8414 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
8415
8416 default:
8417 break;
8418 }
8419 return false;
8420}
8421
8422
8423bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008424ClangASTContext::SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool has_extern)
Greg Claytond8d4a572015-08-11 21:38:15 +00008425{
8426 if (!type)
8427 return false;
8428
8429 clang::QualType qual_type (GetCanonicalQualType(type));
8430
8431 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8432 switch (type_class)
8433 {
8434 case clang::Type::Record:
8435 {
8436 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8437 if (cxx_record_decl)
8438 {
8439 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
8440 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
8441 return true;
8442 }
8443 }
8444 break;
8445
8446 case clang::Type::Enum:
8447 {
8448 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8449 if (enum_decl)
8450 {
8451 enum_decl->setHasExternalLexicalStorage (has_extern);
8452 enum_decl->setHasExternalVisibleStorage (has_extern);
8453 return true;
8454 }
8455 }
8456 break;
8457
8458 case clang::Type::ObjCObject:
8459 case clang::Type::ObjCInterface:
8460 {
8461 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8462 assert (objc_class_type);
8463 if (objc_class_type)
8464 {
8465 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8466
8467 if (class_interface_decl)
8468 {
8469 class_interface_decl->setHasExternalLexicalStorage (has_extern);
8470 class_interface_decl->setHasExternalVisibleStorage (has_extern);
8471 return true;
8472 }
8473 }
8474 }
8475 break;
8476
8477 case clang::Type::Typedef:
8478 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Enrico Granata36f51e42015-12-18 22:41:25 +00008479
8480 case clang::Type::Auto:
8481 return SetHasExternalStorage (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), has_extern);
Greg Claytond8d4a572015-08-11 21:38:15 +00008482
8483 case clang::Type::Elaborated:
8484 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
8485
8486 case clang::Type::Paren:
8487 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
8488
8489 default:
8490 break;
8491 }
8492 return false;
8493}
8494
8495
Greg Claytone6b36cd2015-12-08 01:02:08 +00008496bool
8497ClangASTContext::CanImport (const CompilerType &type, lldb_private::ClangASTImporter &importer)
8498{
8499 if (IsClangType(type))
8500 {
8501 // TODO: remove external completion BOOL
8502 // CompleteAndFetchChildren should get the Decl out and check for the
8503
8504 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
8505
8506 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8507 switch (type_class)
8508 {
8509 case clang::Type::Record:
8510 {
8511 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8512 if (cxx_record_decl)
8513 {
8514 if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL))
8515 return true;
8516 }
8517 }
8518 break;
8519
8520 case clang::Type::Enum:
8521 {
8522 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8523 if (enum_decl)
8524 {
8525 if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL))
8526 return true;
8527 }
8528 }
8529 break;
8530
8531 case clang::Type::ObjCObject:
8532 case clang::Type::ObjCInterface:
8533 {
8534 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
8535 if (objc_class_type)
8536 {
8537 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8538 // We currently can't complete objective C types through the newly added ASTContext
8539 // because it only supports TagDecl objects right now...
8540 if (class_interface_decl)
8541 {
8542 if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL))
8543 return true;
8544 }
8545 }
8546 }
8547 break;
8548
8549
8550 case clang::Type::Typedef:
8551 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer);
8552
Enrico Granata36f51e42015-12-18 22:41:25 +00008553 case clang::Type::Auto:
8554 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()), importer);
8555
Greg Claytone6b36cd2015-12-08 01:02:08 +00008556 case clang::Type::Elaborated:
8557 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer);
8558
8559 case clang::Type::Paren:
8560 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer);
8561
8562 default:
8563 break;
8564 }
8565 }
8566 return false;
8567}
8568bool
8569ClangASTContext::Import (const CompilerType &type, lldb_private::ClangASTImporter &importer)
8570{
8571 if (IsClangType(type))
8572 {
8573 // TODO: remove external completion BOOL
8574 // CompleteAndFetchChildren should get the Decl out and check for the
8575
8576 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
8577
8578 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8579 switch (type_class)
8580 {
8581 case clang::Type::Record:
8582 {
8583 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8584 if (cxx_record_decl)
8585 {
8586 if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL))
8587 return importer.CompleteAndFetchChildren(qual_type);
8588 }
8589 }
8590 break;
8591
8592 case clang::Type::Enum:
8593 {
8594 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8595 if (enum_decl)
8596 {
8597 if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL))
8598 return importer.CompleteAndFetchChildren(qual_type);
8599 }
8600 }
8601 break;
8602
8603 case clang::Type::ObjCObject:
8604 case clang::Type::ObjCInterface:
8605 {
8606 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
8607 if (objc_class_type)
8608 {
8609 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8610 // We currently can't complete objective C types through the newly added ASTContext
8611 // because it only supports TagDecl objects right now...
8612 if (class_interface_decl)
8613 {
8614 if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL))
8615 return importer.CompleteAndFetchChildren(qual_type);
8616 }
8617 }
8618 }
8619 break;
8620
8621
8622 case clang::Type::Typedef:
8623 return Import (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer);
8624
Enrico Granata36f51e42015-12-18 22:41:25 +00008625 case clang::Type::Auto:
8626 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()), importer);
8627
Greg Claytone6b36cd2015-12-08 01:02:08 +00008628 case clang::Type::Elaborated:
8629 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer);
8630
8631 case clang::Type::Paren:
8632 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer);
8633
8634 default:
8635 break;
8636 }
8637 }
8638 return false;
8639}
8640
8641
Greg Claytond8d4a572015-08-11 21:38:15 +00008642#pragma mark TagDecl
8643
8644bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008645ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008646{
Greg Claytone6b36cd2015-12-08 01:02:08 +00008647 clang::QualType qual_type (ClangASTContext::GetQualType(type));
8648 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008649 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008650 const clang::TagType *tag_type = qual_type->getAs<clang::TagType>();
8651 if (tag_type)
Greg Clayton5dfc4a42015-12-02 00:43:32 +00008652 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008653 clang::TagDecl *tag_decl = tag_type->getDecl();
8654 if (tag_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00008655 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008656 tag_decl->startDefinition();
8657 return true;
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008658 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00008659 }
8660
8661 const clang::ObjCObjectType *object_type = qual_type->getAs<clang::ObjCObjectType>();
8662 if (object_type)
8663 {
8664 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
8665 if (interface_decl)
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008666 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008667 interface_decl->startDefinition();
8668 return true;
Greg Claytond8d4a572015-08-11 21:38:15 +00008669 }
8670 }
8671 }
8672 return false;
8673}
8674
8675bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008676ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008677{
Greg Claytone6b36cd2015-12-08 01:02:08 +00008678 clang::QualType qual_type (ClangASTContext::GetQualType(type));
8679 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008680 {
Greg Claytond8d4a572015-08-11 21:38:15 +00008681 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8682
8683 if (cxx_record_decl)
8684 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008685 if (!cxx_record_decl->isCompleteDefinition())
8686 cxx_record_decl->completeDefinition();
8687 cxx_record_decl->setHasLoadedFieldsFromExternalStorage(true);
8688 cxx_record_decl->setHasExternalLexicalStorage (false);
8689 cxx_record_decl->setHasExternalVisibleStorage (false);
Greg Claytond8d4a572015-08-11 21:38:15 +00008690 return true;
8691 }
8692
Greg Claytone6b36cd2015-12-08 01:02:08 +00008693 const clang::EnumType *enutype = qual_type->getAs<clang::EnumType>();
Greg Claytond8d4a572015-08-11 21:38:15 +00008694
8695 if (enutype)
8696 {
8697 clang::EnumDecl *enum_decl = enutype->getDecl();
8698
8699 if (enum_decl)
8700 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008701 if (!enum_decl->isCompleteDefinition())
Greg Claytond8d4a572015-08-11 21:38:15 +00008702 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008703 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8704 if (lldb_ast == nullptr)
8705 return false;
8706 clang::ASTContext *ast = lldb_ast->getASTContext();
8707
8708 /// TODO This really needs to be fixed.
8709
8710 unsigned NumPositiveBits = 1;
8711 unsigned NumNegativeBits = 0;
8712
8713 clang::QualType promotion_qual_type;
8714 // If the enum integer type is less than an integer in bit width,
8715 // then we must promote it to an integer size.
8716 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
8717 {
8718 if (enum_decl->getIntegerType()->isSignedIntegerType())
8719 promotion_qual_type = ast->IntTy;
8720 else
8721 promotion_qual_type = ast->UnsignedIntTy;
8722 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008723 else
Greg Claytone6b36cd2015-12-08 01:02:08 +00008724 promotion_qual_type = enum_decl->getIntegerType();
8725
8726 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Claytond8d4a572015-08-11 21:38:15 +00008727 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008728 return true;
8729 }
8730 }
8731 }
8732 return false;
8733}
8734
Greg Claytond8d4a572015-08-11 21:38:15 +00008735bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008736ClangASTContext::AddEnumerationValueToEnumerationType (lldb::opaque_compiler_type_t type,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008737 const CompilerType &enumerator_clang_type,
8738 const Declaration &decl,
8739 const char *name,
8740 int64_t enum_value,
8741 uint32_t enum_value_bit_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008742{
8743 if (type && enumerator_clang_type.IsValid() && name && name[0])
8744 {
8745 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8746
8747 bool is_signed = false;
8748 enumerator_clang_type.IsIntegerType (is_signed);
8749 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8750 if (clang_type)
8751 {
8752 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8753
8754 if (enutype)
8755 {
8756 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
8757 enum_llvm_apsint = enum_value;
8758 clang::EnumConstantDecl *enumerator_decl =
8759 clang::EnumConstantDecl::Create (*getASTContext(),
8760 enutype->getDecl(),
8761 clang::SourceLocation(),
8762 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
8763 GetQualType(enumerator_clang_type),
8764 nullptr,
8765 enum_llvm_apsint);
8766
8767 if (enumerator_decl)
8768 {
8769 enutype->getDecl()->addDecl(enumerator_decl);
8770
8771#ifdef LLDB_CONFIGURATION_DEBUG
8772 VerifyDecl(enumerator_decl);
8773#endif
8774
8775 return true;
8776 }
8777 }
8778 }
8779 }
8780 return false;
8781}
8782
Greg Claytona1e5dc82015-08-11 22:53:00 +00008783CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008784ClangASTContext::GetEnumerationIntegerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008785{
8786 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8787 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8788 if (clang_type)
8789 {
8790 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8791 if (enutype)
8792 {
8793 clang::EnumDecl *enum_decl = enutype->getDecl();
8794 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008795 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008796 }
8797 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008798 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008799}
8800
Greg Claytona1e5dc82015-08-11 22:53:00 +00008801CompilerType
8802ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008803{
8804 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8805 {
Greg Claytonf73034f2015-09-08 18:15:05 +00008806 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008807 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008808 return CompilerType();
8809 return CompilerType (ast->getASTContext(),
Greg Claytond8d4a572015-08-11 21:38:15 +00008810 ast->getASTContext()->getMemberPointerType (GetQualType(pointee_type),
8811 GetQualType(type).getTypePtr()));
8812 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008813 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008814}
8815
8816
8817size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008818ClangASTContext::ConvertStringToFloatValue (lldb::opaque_compiler_type_t type, const char *s, uint8_t *dst, size_t dst_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008819{
8820 if (type)
8821 {
8822 clang::QualType qual_type (GetCanonicalQualType(type));
8823 uint32_t count = 0;
8824 bool is_complex = false;
8825 if (IsFloatingPointType (type, count, is_complex))
8826 {
8827 // TODO: handle complex and vector types
8828 if (count != 1)
8829 return false;
8830
8831 llvm::StringRef s_sref(s);
8832 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8833
8834 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8835 const uint64_t byte_size = bit_size / 8;
8836 if (dst_size >= byte_size)
8837 {
8838 if (bit_size == sizeof(float)*8)
8839 {
8840 float float32 = ap_float.convertToFloat();
8841 ::memcpy (dst, &float32, byte_size);
8842 return byte_size;
8843 }
8844 else if (bit_size >= 64)
8845 {
8846 llvm::APInt ap_int(ap_float.bitcastToAPInt());
8847 ::memcpy (dst, ap_int.getRawData(), byte_size);
8848 return byte_size;
8849 }
8850 }
8851 }
8852 }
8853 return 0;
8854}
8855
8856
8857
8858//----------------------------------------------------------------------
8859// Dumping types
8860//----------------------------------------------------------------------
8861#define DEPTH_INCREMENT 2
8862
8863void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008864ClangASTContext::DumpValue (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00008865 Stream *s,
8866 lldb::Format format,
8867 const lldb_private::DataExtractor &data,
8868 lldb::offset_t data_byte_offset,
8869 size_t data_byte_size,
8870 uint32_t bitfield_bit_size,
8871 uint32_t bitfield_bit_offset,
8872 bool show_types,
8873 bool show_summary,
8874 bool verbose,
8875 uint32_t depth)
8876{
8877 if (!type)
8878 return;
8879
8880 clang::QualType qual_type(GetQualType(type));
8881 switch (qual_type->getTypeClass())
8882 {
8883 case clang::Type::Record:
8884 if (GetCompleteType(type))
8885 {
8886 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8887 const clang::RecordDecl *record_decl = record_type->getDecl();
8888 assert(record_decl);
8889 uint32_t field_bit_offset = 0;
8890 uint32_t field_byte_offset = 0;
8891 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8892 uint32_t child_idx = 0;
8893
8894 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8895 if (cxx_record_decl)
8896 {
8897 // We might have base classes to print out first
8898 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8899 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8900 base_class != base_class_end;
8901 ++base_class)
8902 {
8903 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8904
8905 // Skip empty base classes
8906 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8907 continue;
8908
8909 if (base_class->isVirtual())
8910 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8911 else
8912 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8913 field_byte_offset = field_bit_offset / 8;
8914 assert (field_bit_offset % 8 == 0);
8915 if (child_idx == 0)
8916 s->PutChar('{');
8917 else
8918 s->PutChar(',');
8919
8920 clang::QualType base_class_qual_type = base_class->getType();
8921 std::string base_class_type_name(base_class_qual_type.getAsString());
8922
8923 // Indent and print the base class type name
8924 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8925
8926 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8927
8928 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008929 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008930 base_clang_type.DumpValue (exe_ctx,
8931 s, // Stream to dump to
8932 base_clang_type.GetFormat(), // The format with which to display the member
8933 data, // Data buffer containing all bytes for this type
8934 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8935 base_class_type_info.Width / 8, // Size of this type in bytes
8936 0, // Bitfield bit size
8937 0, // Bitfield bit offset
8938 show_types, // Boolean indicating if we should show the variable types
8939 show_summary, // Boolean indicating if we should show a summary for the current type
8940 verbose, // Verbose output?
8941 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8942
8943 ++child_idx;
8944 }
8945 }
8946 uint32_t field_idx = 0;
8947 clang::RecordDecl::field_iterator field, field_end;
8948 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8949 {
8950 // Print the starting squiggly bracket (if this is the
8951 // first member) or comma (for member 2 and beyond) for
8952 // the struct/union/class member.
8953 if (child_idx == 0)
8954 s->PutChar('{');
8955 else
8956 s->PutChar(',');
8957
8958 // Indent
8959 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8960
8961 clang::QualType field_type = field->getType();
8962 // Print the member type if requested
8963 // Figure out the type byte size (field_type_info.first) and
8964 // alignment (field_type_info.second) from the AST context.
8965 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8966 assert(field_idx < record_layout.getFieldCount());
8967 // Figure out the field offset within the current struct/union/class type
8968 field_bit_offset = record_layout.getFieldOffset (field_idx);
8969 field_byte_offset = field_bit_offset / 8;
8970 uint32_t field_bitfield_bit_size = 0;
8971 uint32_t field_bitfield_bit_offset = 0;
8972 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8973 field_bitfield_bit_offset = field_bit_offset % 8;
8974
8975 if (show_types)
8976 {
8977 std::string field_type_name(field_type.getAsString());
8978 if (field_bitfield_bit_size > 0)
8979 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
8980 else
8981 s->Printf("(%s) ", field_type_name.c_str());
8982 }
8983 // Print the member name and equal sign
8984 s->Printf("%s = ", field->getNameAsString().c_str());
8985
8986
8987 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008988 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008989 field_clang_type.DumpValue (exe_ctx,
8990 s, // Stream to dump to
8991 field_clang_type.GetFormat(), // The format with which to display the member
8992 data, // Data buffer containing all bytes for this type
8993 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8994 field_type_info.Width / 8, // Size of this type in bytes
8995 field_bitfield_bit_size, // Bitfield bit size
8996 field_bitfield_bit_offset, // Bitfield bit offset
8997 show_types, // Boolean indicating if we should show the variable types
8998 show_summary, // Boolean indicating if we should show a summary for the current type
8999 verbose, // Verbose output?
9000 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
9001 }
9002
9003 // Indent the trailing squiggly bracket
9004 if (child_idx > 0)
9005 s->Printf("\n%*s}", depth, "");
9006 }
9007 return;
9008
9009 case clang::Type::Enum:
9010 if (GetCompleteType(type))
9011 {
9012 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
9013 const clang::EnumDecl *enum_decl = enutype->getDecl();
9014 assert(enum_decl);
9015 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
9016 lldb::offset_t offset = data_byte_offset;
9017 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
9018 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9019 {
9020 if (enum_pos->getInitVal() == enum_value)
9021 {
9022 s->Printf("%s", enum_pos->getNameAsString().c_str());
9023 return;
9024 }
9025 }
9026 // If we have gotten here we didn't get find the enumerator in the
9027 // enum decl, so just print the integer.
9028 s->Printf("%" PRIi64, enum_value);
9029 }
9030 return;
9031
9032 case clang::Type::ConstantArray:
9033 {
9034 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
9035 bool is_array_of_characters = false;
9036 clang::QualType element_qual_type = array->getElementType();
9037
9038 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
9039 if (canonical_type)
9040 is_array_of_characters = canonical_type->isCharType();
9041
9042 const uint64_t element_count = array->getSize().getLimitedValue();
9043
9044 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
9045
9046 uint32_t element_idx = 0;
9047 uint32_t element_offset = 0;
9048 uint64_t element_byte_size = field_type_info.Width / 8;
9049 uint32_t element_stride = element_byte_size;
9050
9051 if (is_array_of_characters)
9052 {
9053 s->PutChar('"');
9054 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
9055 s->PutChar('"');
9056 return;
9057 }
9058 else
9059 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00009060 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009061 lldb::Format element_format = element_clang_type.GetFormat();
9062
9063 for (element_idx = 0; element_idx < element_count; ++element_idx)
9064 {
9065 // Print the starting squiggly bracket (if this is the
9066 // first member) or comman (for member 2 and beyong) for
9067 // the struct/union/class member.
9068 if (element_idx == 0)
9069 s->PutChar('{');
9070 else
9071 s->PutChar(',');
9072
9073 // Indent and print the index
9074 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
9075
9076 // Figure out the field offset within the current struct/union/class type
9077 element_offset = element_idx * element_stride;
9078
9079 // Dump the value of the member
9080 element_clang_type.DumpValue (exe_ctx,
9081 s, // Stream to dump to
9082 element_format, // The format with which to display the element
9083 data, // Data buffer containing all bytes for this type
9084 data_byte_offset + element_offset,// Offset into "data" where to grab value from
9085 element_byte_size, // Size of this type in bytes
9086 0, // Bitfield bit size
9087 0, // Bitfield bit offset
9088 show_types, // Boolean indicating if we should show the variable types
9089 show_summary, // Boolean indicating if we should show a summary for the current type
9090 verbose, // Verbose output?
9091 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
9092 }
9093
9094 // Indent the trailing squiggly bracket
9095 if (element_idx > 0)
9096 s->Printf("\n%*s}", depth, "");
9097 }
9098 }
9099 return;
9100
9101 case clang::Type::Typedef:
9102 {
9103 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
9104
Greg Claytona1e5dc82015-08-11 22:53:00 +00009105 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009106 lldb::Format typedef_format = typedef_clang_type.GetFormat();
9107 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
9108 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
9109
9110 return typedef_clang_type.DumpValue (exe_ctx,
9111 s, // Stream to dump to
9112 typedef_format, // The format with which to display the element
9113 data, // Data buffer containing all bytes for this type
9114 data_byte_offset, // Offset into "data" where to grab value from
9115 typedef_byte_size, // Size of this type in bytes
9116 bitfield_bit_size, // Bitfield bit size
9117 bitfield_bit_offset,// Bitfield bit offset
9118 show_types, // Boolean indicating if we should show the variable types
9119 show_summary, // Boolean indicating if we should show a summary for the current type
9120 verbose, // Verbose output?
9121 depth); // Scope depth for any types that have children
9122 }
9123 break;
9124
Enrico Granata36f51e42015-12-18 22:41:25 +00009125 case clang::Type::Auto:
9126 {
9127 clang::QualType elaborated_qual_type = llvm::cast<clang::AutoType>(qual_type)->getDeducedType();
9128 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
9129 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
9130 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
9131 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
9132
9133 return elaborated_clang_type.DumpValue (exe_ctx,
9134 s, // Stream to dump to
9135 elaborated_format, // The format with which to display the element
9136 data, // Data buffer containing all bytes for this type
9137 data_byte_offset, // Offset into "data" where to grab value from
9138 elaborated_byte_size, // Size of this type in bytes
9139 bitfield_bit_size, // Bitfield bit size
9140 bitfield_bit_offset,// Bitfield bit offset
9141 show_types, // Boolean indicating if we should show the variable types
9142 show_summary, // Boolean indicating if we should show a summary for the current type
9143 verbose, // Verbose output?
9144 depth); // Scope depth for any types that have children
9145 }
9146 break;
9147
Greg Claytond8d4a572015-08-11 21:38:15 +00009148 case clang::Type::Elaborated:
9149 {
9150 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009151 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009152 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
9153 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
9154 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
9155
9156 return elaborated_clang_type.DumpValue (exe_ctx,
9157 s, // Stream to dump to
9158 elaborated_format, // The format with which to display the element
9159 data, // Data buffer containing all bytes for this type
9160 data_byte_offset, // Offset into "data" where to grab value from
9161 elaborated_byte_size, // Size of this type in bytes
9162 bitfield_bit_size, // Bitfield bit size
9163 bitfield_bit_offset,// Bitfield bit offset
9164 show_types, // Boolean indicating if we should show the variable types
9165 show_summary, // Boolean indicating if we should show a summary for the current type
9166 verbose, // Verbose output?
9167 depth); // Scope depth for any types that have children
9168 }
9169 break;
9170
9171 case clang::Type::Paren:
9172 {
9173 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009174 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009175
9176 lldb::Format desugar_format = desugar_clang_type.GetFormat();
9177 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
9178 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
9179
9180 return desugar_clang_type.DumpValue (exe_ctx,
9181 s, // Stream to dump to
9182 desugar_format, // The format with which to display the element
9183 data, // Data buffer containing all bytes for this type
9184 data_byte_offset, // Offset into "data" where to grab value from
9185 desugar_byte_size, // Size of this type in bytes
9186 bitfield_bit_size, // Bitfield bit size
9187 bitfield_bit_offset,// Bitfield bit offset
9188 show_types, // Boolean indicating if we should show the variable types
9189 show_summary, // Boolean indicating if we should show a summary for the current type
9190 verbose, // Verbose output?
9191 depth); // Scope depth for any types that have children
9192 }
9193 break;
9194
9195 default:
9196 // We are down to a scalar type that we just need to display.
9197 data.Dump(s,
9198 data_byte_offset,
9199 format,
9200 data_byte_size,
9201 1,
9202 UINT32_MAX,
9203 LLDB_INVALID_ADDRESS,
9204 bitfield_bit_size,
9205 bitfield_bit_offset);
9206
9207 if (show_summary)
9208 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
9209 break;
9210 }
9211}
9212
9213
9214
9215
9216bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009217ClangASTContext::DumpTypeValue (lldb::opaque_compiler_type_t type, Stream *s,
Greg Claytond8d4a572015-08-11 21:38:15 +00009218 lldb::Format format,
9219 const lldb_private::DataExtractor &data,
9220 lldb::offset_t byte_offset,
9221 size_t byte_size,
9222 uint32_t bitfield_bit_size,
9223 uint32_t bitfield_bit_offset,
9224 ExecutionContextScope *exe_scope)
9225{
9226 if (!type)
9227 return false;
9228 if (IsAggregateType(type))
9229 {
9230 return false;
9231 }
9232 else
9233 {
9234 clang::QualType qual_type(GetQualType(type));
9235
9236 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9237 switch (type_class)
9238 {
9239 case clang::Type::Typedef:
9240 {
9241 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009242 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009243 if (format == eFormatDefault)
9244 format = typedef_clang_type.GetFormat();
9245 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
9246 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
9247
9248 return typedef_clang_type.DumpTypeValue (s,
9249 format, // The format with which to display the element
9250 data, // Data buffer containing all bytes for this type
9251 byte_offset, // Offset into "data" where to grab value from
9252 typedef_byte_size, // Size of this type in bytes
9253 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
9254 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
9255 exe_scope);
9256 }
9257 break;
9258
9259 case clang::Type::Enum:
9260 // If our format is enum or default, show the enumeration value as
9261 // its enumeration string value, else just display it as requested.
9262 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
9263 {
9264 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
9265 const clang::EnumDecl *enum_decl = enutype->getDecl();
9266 assert(enum_decl);
9267 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
9268 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
9269 lldb::offset_t offset = byte_offset;
9270 if (is_signed)
9271 {
9272 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
9273 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9274 {
9275 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
9276 {
9277 s->PutCString (enum_pos->getNameAsString().c_str());
9278 return true;
9279 }
9280 }
9281 // If we have gotten here we didn't get find the enumerator in the
9282 // enum decl, so just print the integer.
9283 s->Printf("%" PRIi64, enum_svalue);
9284 }
9285 else
9286 {
9287 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
9288 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9289 {
9290 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
9291 {
9292 s->PutCString (enum_pos->getNameAsString().c_str());
9293 return true;
9294 }
9295 }
9296 // If we have gotten here we didn't get find the enumerator in the
9297 // enum decl, so just print the integer.
9298 s->Printf("%" PRIu64, enum_uvalue);
9299 }
9300 return true;
9301 }
9302 // format was not enum, just fall through and dump the value as requested....
Jason Molenda62e06812016-02-16 04:14:33 +00009303 LLVM_FALLTHROUGH;
Greg Claytond8d4a572015-08-11 21:38:15 +00009304
9305 default:
9306 // We are down to a scalar type that we just need to display.
9307 {
9308 uint32_t item_count = 1;
9309 // A few formats, we might need to modify our size and count for depending
9310 // on how we are trying to display the value...
9311 switch (format)
9312 {
9313 default:
9314 case eFormatBoolean:
9315 case eFormatBinary:
9316 case eFormatComplex:
9317 case eFormatCString: // NULL terminated C strings
9318 case eFormatDecimal:
9319 case eFormatEnum:
9320 case eFormatHex:
9321 case eFormatHexUppercase:
9322 case eFormatFloat:
9323 case eFormatOctal:
9324 case eFormatOSType:
9325 case eFormatUnsigned:
9326 case eFormatPointer:
9327 case eFormatVectorOfChar:
9328 case eFormatVectorOfSInt8:
9329 case eFormatVectorOfUInt8:
9330 case eFormatVectorOfSInt16:
9331 case eFormatVectorOfUInt16:
9332 case eFormatVectorOfSInt32:
9333 case eFormatVectorOfUInt32:
9334 case eFormatVectorOfSInt64:
9335 case eFormatVectorOfUInt64:
9336 case eFormatVectorOfFloat32:
9337 case eFormatVectorOfFloat64:
9338 case eFormatVectorOfUInt128:
9339 break;
9340
9341 case eFormatChar:
9342 case eFormatCharPrintable:
9343 case eFormatCharArray:
9344 case eFormatBytes:
9345 case eFormatBytesWithASCII:
9346 item_count = byte_size;
9347 byte_size = 1;
9348 break;
9349
9350 case eFormatUnicode16:
9351 item_count = byte_size / 2;
9352 byte_size = 2;
9353 break;
9354
9355 case eFormatUnicode32:
9356 item_count = byte_size / 4;
9357 byte_size = 4;
9358 break;
9359 }
9360 return data.Dump (s,
9361 byte_offset,
9362 format,
9363 byte_size,
9364 item_count,
9365 UINT32_MAX,
9366 LLDB_INVALID_ADDRESS,
9367 bitfield_bit_size,
9368 bitfield_bit_offset,
9369 exe_scope);
9370 }
9371 break;
9372 }
9373 }
9374 return 0;
9375}
9376
9377
9378
9379void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009380ClangASTContext::DumpSummary (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00009381 Stream *s,
9382 const lldb_private::DataExtractor &data,
9383 lldb::offset_t data_byte_offset,
9384 size_t data_byte_size)
9385{
9386 uint32_t length = 0;
9387 if (IsCStringType (type, length))
9388 {
9389 if (exe_ctx)
9390 {
9391 Process *process = exe_ctx->GetProcessPtr();
9392 if (process)
9393 {
9394 lldb::offset_t offset = data_byte_offset;
9395 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
9396 std::vector<uint8_t> buf;
9397 if (length > 0)
9398 buf.resize (length);
9399 else
9400 buf.resize (256);
9401
9402 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
9403 buf.back() = '\0';
9404 size_t bytes_read;
9405 size_t total_cstr_len = 0;
9406 Error error;
9407 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
9408 {
9409 const size_t len = strlen((const char *)&buf.front());
9410 if (len == 0)
9411 break;
9412 if (total_cstr_len == 0)
9413 s->PutCString (" \"");
9414 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
9415 total_cstr_len += len;
9416 if (len < buf.size())
9417 break;
9418 pointer_address += total_cstr_len;
9419 }
9420 if (total_cstr_len > 0)
9421 s->PutChar ('"');
9422 }
9423 }
9424 }
9425}
9426
9427void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009428ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00009429{
9430 StreamFile s (stdout, false);
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00009431 DumpTypeDescription (type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009432 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
9433 if (metadata)
9434 {
9435 metadata->Dump (&s);
9436 }
9437}
9438
9439void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009440ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type, Stream *s)
Greg Claytond8d4a572015-08-11 21:38:15 +00009441{
9442 if (type)
9443 {
9444 clang::QualType qual_type(GetQualType(type));
9445
9446 llvm::SmallVector<char, 1024> buf;
9447 llvm::raw_svector_ostream llvm_ostrm (buf);
9448
9449 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9450 switch (type_class)
9451 {
9452 case clang::Type::ObjCObject:
9453 case clang::Type::ObjCInterface:
9454 {
9455 GetCompleteType(type);
9456
9457 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
9458 assert (objc_class_type);
9459 if (objc_class_type)
9460 {
9461 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9462 if (class_interface_decl)
9463 {
9464 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
9465 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
9466 }
9467 }
9468 }
9469 break;
9470
9471 case clang::Type::Typedef:
9472 {
9473 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
9474 if (typedef_type)
9475 {
9476 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
9477 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
9478 if (!clang_typedef_name.empty())
9479 {
9480 s->PutCString ("typedef ");
9481 s->PutCString (clang_typedef_name.c_str());
9482 }
9483 }
9484 }
9485 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00009486
9487 case clang::Type::Auto:
9488 CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).DumpTypeDescription(s);
9489 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00009490
9491 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009492 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009493 return;
9494
9495 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009496 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009497 return;
9498
9499 case clang::Type::Record:
9500 {
9501 GetCompleteType(type);
9502
9503 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
9504 const clang::RecordDecl *record_decl = record_type->getDecl();
9505 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
9506
9507 if (cxx_record_decl)
9508 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9509 else
9510 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9511 }
9512 break;
9513
9514 default:
9515 {
9516 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
9517 if (tag_type)
9518 {
9519 clang::TagDecl *tag_decl = tag_type->getDecl();
9520 if (tag_decl)
9521 tag_decl->print(llvm_ostrm, 0);
9522 }
9523 else
9524 {
9525 std::string clang_type_name(qual_type.getAsString());
9526 if (!clang_type_name.empty())
9527 s->PutCString (clang_type_name.c_str());
9528 }
9529 }
9530 }
9531
Greg Claytond8d4a572015-08-11 21:38:15 +00009532 if (buf.size() > 0)
9533 {
9534 s->Write (buf.data(), buf.size());
9535 }
9536 }
9537}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009538
Greg Claytone6b36cd2015-12-08 01:02:08 +00009539void
9540ClangASTContext::DumpTypeName (const CompilerType &type)
9541{
9542 if (IsClangType(type))
9543 {
9544 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
9545
9546 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9547 switch (type_class)
9548 {
9549 case clang::Type::Record:
9550 {
9551 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
9552 if (cxx_record_decl)
9553 printf("class %s", cxx_record_decl->getName().str().c_str());
9554 }
9555 break;
9556
9557 case clang::Type::Enum:
9558 {
9559 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
9560 if (enum_decl)
9561 {
9562 printf("enum %s", enum_decl->getName().str().c_str());
9563 }
9564 }
9565 break;
9566
9567 case clang::Type::ObjCObject:
9568 case clang::Type::ObjCInterface:
9569 {
9570 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
9571 if (objc_class_type)
9572 {
9573 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9574 // We currently can't complete objective C types through the newly added ASTContext
9575 // because it only supports TagDecl objects right now...
9576 if (class_interface_decl)
9577 printf("@class %s", class_interface_decl->getName().str().c_str());
9578 }
9579 }
9580 break;
9581
9582
9583 case clang::Type::Typedef:
9584 printf("typedef %s", llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getName().str().c_str());
9585 break;
9586
Enrico Granata36f51e42015-12-18 22:41:25 +00009587 case clang::Type::Auto:
9588 printf("auto ");
9589 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()));
9590
Greg Claytone6b36cd2015-12-08 01:02:08 +00009591 case clang::Type::Elaborated:
9592 printf("elaborated ");
9593 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
9594
9595 case clang::Type::Paren:
9596 printf("paren ");
9597 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
9598
9599 default:
9600 printf("ClangASTContext::DumpTypeName() type_class = %u", type_class);
9601 break;
9602 }
9603 }
9604
9605}
9606
9607
9608
Greg Clayton8b4edba2015-08-14 20:02:05 +00009609clang::ClassTemplateDecl *
Greg Clayton6071e6f2015-08-26 22:57:51 +00009610ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009611 lldb::AccessType access_type,
9612 const char *parent_name,
9613 int tag_decl_kind,
9614 const ClangASTContext::TemplateParameterInfos &template_param_infos)
9615{
9616 if (template_param_infos.IsValid())
9617 {
9618 std::string template_basename(parent_name);
9619 template_basename.erase (template_basename.find('<'));
9620
9621 return CreateClassTemplateDecl (decl_ctx,
9622 access_type,
9623 template_basename.c_str(),
9624 tag_decl_kind,
9625 template_param_infos);
9626 }
9627 return NULL;
9628}
9629
Greg Clayton6dc8d582015-08-18 22:32:36 +00009630void
9631ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl)
9632{
9633 ClangASTContext *ast = (ClangASTContext *)baton;
9634 SymbolFile *sym_file = ast->GetSymbolFile();
9635 if (sym_file)
9636 {
9637 CompilerType clang_type = GetTypeForDecl (decl);
9638 if (clang_type)
9639 sym_file->CompleteType (clang_type);
9640 }
9641}
9642
9643void
9644ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
9645{
9646 ClangASTContext *ast = (ClangASTContext *)baton;
9647 SymbolFile *sym_file = ast->GetSymbolFile();
9648 if (sym_file)
9649 {
9650 CompilerType clang_type = GetTypeForDecl (decl);
9651 if (clang_type)
9652 sym_file->CompleteType (clang_type);
9653 }
9654}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009655
Greg Clayton261ac3f2015-08-28 01:01:03 +00009656
9657DWARFASTParser *
9658ClangASTContext::GetDWARFParser ()
9659{
9660 if (!m_dwarf_ast_parser_ap)
9661 m_dwarf_ast_parser_ap.reset(new DWARFASTParserClang(*this));
9662 return m_dwarf_ast_parser_ap.get();
9663}
9664
9665
Greg Clayton8b4edba2015-08-14 20:02:05 +00009666bool
Greg Clayton6dc8d582015-08-18 22:32:36 +00009667ClangASTContext::LayoutRecordType(void *baton,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009668 const clang::RecordDecl *record_decl,
9669 uint64_t &bit_size,
9670 uint64_t &alignment,
9671 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
9672 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
9673 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
9674{
Greg Clayton6dc8d582015-08-18 22:32:36 +00009675 ClangASTContext *ast = (ClangASTContext *)baton;
Greg Clayton261ac3f2015-08-28 01:01:03 +00009676 DWARFASTParserClang *dwarf_ast_parser = (DWARFASTParserClang *)ast->GetDWARFParser();
9677 return dwarf_ast_parser->LayoutRecordType(record_decl, bit_size, alignment, field_offsets, base_offsets, vbase_offsets);
Greg Clayton8b4edba2015-08-14 20:02:05 +00009678}
9679
Greg Clayton99558cc42015-08-24 23:46:31 +00009680//----------------------------------------------------------------------
Paul Hermand628cbb2015-09-15 23:44:17 +00009681// CompilerDecl override functions
9682//----------------------------------------------------------------------
9683lldb::VariableSP
9684ClangASTContext::DeclGetVariable (void *opaque_decl)
9685{
9686 if (llvm::dyn_cast<clang::VarDecl>((clang::Decl *)opaque_decl))
9687 {
9688 auto decl_search_it = m_decl_objects.find(opaque_decl);
9689 if (decl_search_it != m_decl_objects.end())
9690 return std::static_pointer_cast<Variable>(decl_search_it->second);
9691 }
9692 return VariableSP();
9693}
9694
9695void
9696ClangASTContext::DeclLinkToObject (void *opaque_decl, std::shared_ptr<void> object)
9697{
9698 if (m_decl_objects.find(opaque_decl) == m_decl_objects.end())
9699 m_decl_objects.insert(std::make_pair(opaque_decl, object));
9700}
9701
9702ConstString
9703ClangASTContext::DeclGetName (void *opaque_decl)
9704{
9705 if (opaque_decl)
9706 {
9707 clang::NamedDecl *nd = llvm::dyn_cast<NamedDecl>((clang::Decl*)opaque_decl);
9708 if (nd != nullptr)
Greg Claytonfe689042015-11-10 17:47:04 +00009709 return ConstString(nd->getDeclName().getAsString());
Paul Hermand628cbb2015-09-15 23:44:17 +00009710 }
9711 return ConstString();
9712}
9713
Greg Claytonfe689042015-11-10 17:47:04 +00009714ConstString
9715ClangASTContext::DeclGetMangledName (void *opaque_decl)
9716{
9717 if (opaque_decl)
9718 {
9719 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>((clang::Decl*)opaque_decl);
9720 if (nd != nullptr && !llvm::isa<clang::ObjCMethodDecl>(nd))
9721 {
9722 clang::MangleContext *mc = getMangleContext();
9723 if (mc && mc->shouldMangleCXXName(nd))
9724 {
9725 llvm::SmallVector<char, 1024> buf;
9726 llvm::raw_svector_ostream llvm_ostrm (buf);
9727 if (llvm::isa<clang::CXXConstructorDecl>(nd))
9728 {
9729 mc->mangleCXXCtor(llvm::dyn_cast<clang::CXXConstructorDecl>(nd), Ctor_Complete, llvm_ostrm);
9730 }
9731 else if (llvm::isa<clang::CXXDestructorDecl>(nd))
9732 {
9733 mc->mangleCXXDtor(llvm::dyn_cast<clang::CXXDestructorDecl>(nd), Dtor_Complete, llvm_ostrm);
9734 }
9735 else
9736 {
9737 mc->mangleName(nd, llvm_ostrm);
9738 }
9739 if (buf.size() > 0)
9740 return ConstString(buf.data(), buf.size());
9741 }
9742 }
9743 }
9744 return ConstString();
9745}
9746
9747CompilerDeclContext
9748ClangASTContext::DeclGetDeclContext (void *opaque_decl)
9749{
9750 if (opaque_decl)
9751 return CompilerDeclContext(this, ((clang::Decl*)opaque_decl)->getDeclContext());
9752 else
9753 return CompilerDeclContext();
9754}
9755
9756CompilerType
9757ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl)
9758{
9759 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9760 return CompilerType(this, func_decl->getReturnType().getAsOpaquePtr());
9761 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9762 return CompilerType(this, objc_method->getReturnType().getAsOpaquePtr());
9763 else
9764 return CompilerType();
9765}
9766
9767size_t
9768ClangASTContext::DeclGetFunctionNumArguments(void *opaque_decl)
9769{
9770 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9771 return func_decl->param_size();
9772 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9773 return objc_method->param_size();
9774 else
9775 return 0;
9776}
9777
9778CompilerType
9779ClangASTContext::DeclGetFunctionArgumentType (void *opaque_decl, size_t idx)
9780{
9781 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9782 {
9783 if (idx < func_decl->param_size())
9784 {
9785 ParmVarDecl *var_decl = func_decl->getParamDecl(idx);
9786 if (var_decl)
9787 return CompilerType(this, var_decl->getOriginalType().getAsOpaquePtr());
9788 }
9789 }
9790 else if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9791 {
9792 if (idx < objc_method->param_size())
9793 return CompilerType(this, objc_method->parameters()[idx]->getOriginalType().getAsOpaquePtr());
9794 }
9795 return CompilerType();
9796}
9797
Paul Hermand628cbb2015-09-15 23:44:17 +00009798//----------------------------------------------------------------------
Greg Clayton99558cc42015-08-24 23:46:31 +00009799// CompilerDeclContext functions
9800//----------------------------------------------------------------------
9801
Greg Claytondfc09622015-12-08 18:39:50 +00009802std::vector<CompilerDecl>
Siva Chandra03ff5c82016-02-05 19:10:04 +00009803ClangASTContext::DeclContextFindDeclByName(void *opaque_decl_ctx,
9804 ConstString name,
9805 const bool ignore_using_decls)
Paul Hermand628cbb2015-09-15 23:44:17 +00009806{
Greg Claytondfc09622015-12-08 18:39:50 +00009807 std::vector<CompilerDecl> found_decls;
Paul Hermand628cbb2015-09-15 23:44:17 +00009808 if (opaque_decl_ctx)
9809 {
9810 DeclContext *root_decl_ctx = (DeclContext *)opaque_decl_ctx;
9811 std::set<DeclContext *> searched;
9812 std::multimap<DeclContext *, DeclContext *> search_queue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009813 SymbolFile *symbol_file = GetSymbolFile();
Paul Hermand628cbb2015-09-15 23:44:17 +00009814
9815 for (clang::DeclContext *decl_context = root_decl_ctx; decl_context != nullptr && found_decls.empty(); decl_context = decl_context->getParent())
9816 {
9817 search_queue.insert(std::make_pair(decl_context, decl_context));
9818
9819 for (auto it = search_queue.find(decl_context); it != search_queue.end(); it++)
9820 {
Eugene Leviantc1ba9fc2015-11-13 11:00:10 +00009821 if (!searched.insert(it->second).second)
9822 continue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009823 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9824
Paul Hermand628cbb2015-09-15 23:44:17 +00009825 for (clang::Decl *child : it->second->decls())
9826 {
Paul Hermanea188fc2015-09-16 18:48:30 +00009827 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
Paul Hermand628cbb2015-09-15 23:44:17 +00009828 {
Siva Chandra03ff5c82016-02-05 19:10:04 +00009829 if (ignore_using_decls)
9830 continue;
Paul Hermand628cbb2015-09-15 23:44:17 +00009831 clang::DeclContext *from = ud->getCommonAncestor();
9832 if (searched.find(ud->getNominatedNamespace()) == searched.end())
9833 search_queue.insert(std::make_pair(from, ud->getNominatedNamespace()));
9834 }
9835 else if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9836 {
Siva Chandra03ff5c82016-02-05 19:10:04 +00009837 if (ignore_using_decls)
9838 continue;
Paul Hermand628cbb2015-09-15 23:44:17 +00009839 for (clang::UsingShadowDecl *usd : ud->shadows())
9840 {
9841 clang::Decl *target = usd->getTargetDecl();
9842 if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target))
9843 {
9844 IdentifierInfo *ii = nd->getIdentifier();
9845 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009846 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermand628cbb2015-09-15 23:44:17 +00009847 }
9848 }
9849 }
Paul Hermanea188fc2015-09-16 18:48:30 +00009850 else if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(child))
9851 {
9852 IdentifierInfo *ii = nd->getIdentifier();
9853 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009854 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermanea188fc2015-09-16 18:48:30 +00009855 }
Paul Hermand628cbb2015-09-15 23:44:17 +00009856 }
9857 }
9858 }
9859 }
9860 return found_decls;
9861}
9862
Dawn Perchikb5925782015-12-12 19:31:41 +00009863// Look for child_decl_ctx's lookup scope in frame_decl_ctx and its parents,
9864// and return the number of levels it took to find it, or LLDB_INVALID_DECL_LEVEL
9865// if not found. If the decl was imported via a using declaration, its name and/or
9866// type, if set, will be used to check that the decl found in the scope is a match.
9867//
9868// The optional name is required by languages (like C++) to handle using declarations
9869// like:
9870//
9871// void poo();
9872// namespace ns {
9873// void foo();
9874// void goo();
9875// }
9876// void bar() {
9877// using ns::foo;
9878// // CountDeclLevels returns 0 for 'foo', 1 for 'poo', and
9879// // LLDB_INVALID_DECL_LEVEL for 'goo'.
9880// }
9881//
9882// The optional type is useful in the case that there's a specific overload
9883// that we're looking for that might otherwise be shadowed, like:
9884//
9885// void foo(int);
9886// namespace ns {
9887// void foo();
9888// }
9889// void bar() {
9890// using ns::foo;
9891// // CountDeclLevels returns 0 for { 'foo', void() },
9892// // 1 for { 'foo', void(int) }, and
9893// // LLDB_INVALID_DECL_LEVEL for { 'foo', void(int, int) }.
9894// }
9895//
9896// NOTE: Because file statics are at the TranslationUnit along with globals, a
9897// function at file scope will return the same level as a function at global scope.
9898// Ideally we'd like to treat the file scope as an additional scope just below the
9899// global scope. More work needs to be done to recognise that, if the decl we're
9900// trying to look up is static, we should compare its source file with that of the
9901// current scope and return a lower number for it.
9902uint32_t
9903ClangASTContext::CountDeclLevels (clang::DeclContext *frame_decl_ctx,
9904 clang::DeclContext *child_decl_ctx,
9905 ConstString *child_name,
9906 CompilerType *child_type)
9907{
9908 if (frame_decl_ctx)
9909 {
9910 std::set<DeclContext *> searched;
9911 std::multimap<DeclContext *, DeclContext *> search_queue;
9912 SymbolFile *symbol_file = GetSymbolFile();
9913
9914 // Get the lookup scope for the decl we're trying to find.
9915 clang::DeclContext *parent_decl_ctx = child_decl_ctx->getParent();
9916
9917 // Look for it in our scope's decl context and its parents.
9918 uint32_t level = 0;
9919 for (clang::DeclContext *decl_ctx = frame_decl_ctx; decl_ctx != nullptr; decl_ctx = decl_ctx->getParent())
9920 {
9921 if (!decl_ctx->isLookupContext())
9922 continue;
9923 if (decl_ctx == parent_decl_ctx)
9924 // Found it!
9925 return level;
9926 search_queue.insert(std::make_pair(decl_ctx, decl_ctx));
9927 for (auto it = search_queue.find(decl_ctx); it != search_queue.end(); it++)
9928 {
9929 if (searched.find(it->second) != searched.end())
9930 continue;
Sean Callanan8c05fb92016-02-12 21:55:05 +00009931
9932 // Currently DWARF has one shared translation unit for all Decls at top level, so this
9933 // would erroneously find using statements anywhere. So don't look at the top-level
9934 // translation unit.
9935 // TODO fix this and add a testcase that depends on it.
9936
9937 if (llvm::isa<clang::TranslationUnitDecl>(it->second))
9938 continue;
9939
Dawn Perchikb5925782015-12-12 19:31:41 +00009940 searched.insert(it->second);
9941 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9942
9943 for (clang::Decl *child : it->second->decls())
9944 {
9945 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
9946 {
9947 clang::DeclContext *ns = ud->getNominatedNamespace();
9948 if (ns == parent_decl_ctx)
9949 // Found it!
9950 return level;
9951 clang::DeclContext *from = ud->getCommonAncestor();
9952 if (searched.find(ns) == searched.end())
9953 search_queue.insert(std::make_pair(from, ns));
9954 }
9955 else if (child_name)
9956 {
9957 if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9958 {
9959 for (clang::UsingShadowDecl *usd : ud->shadows())
9960 {
9961 clang::Decl *target = usd->getTargetDecl();
9962 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target);
9963 if (!nd)
9964 continue;
9965 // Check names.
9966 IdentifierInfo *ii = nd->getIdentifier();
9967 if (ii == nullptr || !ii->getName().equals(child_name->AsCString(nullptr)))
9968 continue;
9969 // Check types, if one was provided.
9970 if (child_type)
9971 {
9972 CompilerType clang_type = ClangASTContext::GetTypeForDecl(nd);
9973 if (!AreTypesSame(clang_type, *child_type, /*ignore_qualifiers=*/true))
9974 continue;
9975 }
9976 // Found it!
9977 return level;
9978 }
9979 }
9980 }
9981 }
9982 }
9983 ++level;
9984 }
9985 }
9986 return LLDB_INVALID_DECL_LEVEL;
9987}
9988
Greg Clayton99558cc42015-08-24 23:46:31 +00009989bool
9990ClangASTContext::DeclContextIsStructUnionOrClass (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00009991{
Greg Clayton99558cc42015-08-24 23:46:31 +00009992 if (opaque_decl_ctx)
9993 return ((clang::DeclContext *)opaque_decl_ctx)->isRecord();
9994 else
9995 return false;
Greg Clayton8b4edba2015-08-14 20:02:05 +00009996}
9997
Greg Clayton99558cc42015-08-24 23:46:31 +00009998ConstString
9999ClangASTContext::DeclContextGetName (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +000010000{
Greg Clayton99558cc42015-08-24 23:46:31 +000010001 if (opaque_decl_ctx)
10002 {
10003 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
10004 if (named_decl)
10005 return ConstString(named_decl->getName());
10006 }
10007 return ConstString();
10008}
10009
Siva Chandra9293fc42016-01-07 23:32:34 +000010010ConstString
10011ClangASTContext::DeclContextGetScopeQualifiedName (void *opaque_decl_ctx)
10012{
10013 if (opaque_decl_ctx)
10014 {
10015 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
10016 if (named_decl)
10017 return ConstString(llvm::StringRef(named_decl->getQualifiedNameAsString()));
10018 }
10019 return ConstString();
10020}
10021
Greg Clayton99558cc42015-08-24 23:46:31 +000010022bool
10023ClangASTContext::DeclContextIsClassMethod (void *opaque_decl_ctx,
10024 lldb::LanguageType *language_ptr,
10025 bool *is_instance_method_ptr,
10026 ConstString *language_object_name_ptr)
10027{
10028 if (opaque_decl_ctx)
10029 {
10030 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
10031 if (ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
10032 {
10033 if (is_instance_method_ptr)
10034 *is_instance_method_ptr = objc_method->isInstanceMethod();
10035 if (language_ptr)
10036 *language_ptr = eLanguageTypeObjC;
10037 if (language_object_name_ptr)
10038 language_object_name_ptr->SetCString("self");
10039 return true;
10040 }
10041 else if (CXXMethodDecl *cxx_method = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
10042 {
10043 if (is_instance_method_ptr)
10044 *is_instance_method_ptr = cxx_method->isInstance();
10045 if (language_ptr)
10046 *language_ptr = eLanguageTypeC_plus_plus;
10047 if (language_object_name_ptr)
10048 language_object_name_ptr->SetCString("this");
10049 return true;
10050 }
10051 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
10052 {
10053 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
10054 if (metadata && metadata->HasObjectPtr())
10055 {
10056 if (is_instance_method_ptr)
10057 *is_instance_method_ptr = true;
10058 if (language_ptr)
10059 *language_ptr = eLanguageTypeObjC;
10060 if (language_object_name_ptr)
10061 language_object_name_ptr->SetCString (metadata->GetObjectPtrName());
10062 return true;
10063 }
10064 }
10065 }
10066 return false;
10067}
10068
10069clang::DeclContext *
10070ClangASTContext::DeclContextGetAsDeclContext (const CompilerDeclContext &dc)
10071{
10072 if (dc.IsClang())
10073 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
10074 return nullptr;
10075}
10076
10077
10078ObjCMethodDecl *
10079ClangASTContext::DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc)
10080{
10081 if (dc.IsClang())
10082 return llvm::dyn_cast<clang::ObjCMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10083 return nullptr;
10084}
10085
10086CXXMethodDecl *
10087ClangASTContext::DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc)
10088{
10089 if (dc.IsClang())
10090 return llvm::dyn_cast<clang::CXXMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10091 return nullptr;
10092}
10093
10094clang::FunctionDecl *
10095ClangASTContext::DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc)
10096{
10097 if (dc.IsClang())
10098 return llvm::dyn_cast<clang::FunctionDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10099 return nullptr;
10100}
10101
10102clang::NamespaceDecl *
10103ClangASTContext::DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc)
10104{
10105 if (dc.IsClang())
10106 return llvm::dyn_cast<clang::NamespaceDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10107 return nullptr;
10108}
10109
10110ClangASTMetadata *
10111ClangASTContext::DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object)
10112{
10113 clang::ASTContext *ast = DeclContextGetClangASTContext (dc);
10114 if (ast)
10115 return ClangASTContext::GetMetadata (ast, object);
10116 return nullptr;
10117}
10118
10119clang::ASTContext *
10120ClangASTContext::DeclContextGetClangASTContext (const CompilerDeclContext &dc)
10121{
Greg Claytonf73034f2015-09-08 18:15:05 +000010122 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
10123 if (ast)
10124 return ast->getASTContext();
Greg Clayton99558cc42015-08-24 23:46:31 +000010125 return nullptr;
Greg Clayton8b4edba2015-08-14 20:02:05 +000010126}
10127
Jim Ingham151c0322015-09-15 21:13:50 +000010128ClangASTContextForExpressions::ClangASTContextForExpressions (Target &target) :
10129 ClangASTContext (target.GetArchitecture().GetTriple().getTriple().c_str()),
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010130 m_target_wp(target.shared_from_this()),
10131 m_persistent_variables (new ClangPersistentVariables)
Jim Ingham151c0322015-09-15 21:13:50 +000010132{
10133}
10134
10135UserExpression *
10136ClangASTContextForExpressions::GetUserExpression (const char *expr,
10137 const char *expr_prefix,
10138 lldb::LanguageType language,
Jim Ingham19a63fc2015-11-03 02:11:24 +000010139 Expression::ResultType desired_type,
10140 const EvaluateExpressionOptions &options)
Jim Ingham151c0322015-09-15 21:13:50 +000010141{
10142 TargetSP target_sp = m_target_wp.lock();
10143 if (!target_sp)
10144 return nullptr;
10145
Jim Ingham19a63fc2015-11-03 02:11:24 +000010146 return new ClangUserExpression(*target_sp.get(), expr, expr_prefix, language, desired_type, options);
Jim Ingham151c0322015-09-15 21:13:50 +000010147}
10148
10149FunctionCaller *
10150ClangASTContextForExpressions::GetFunctionCaller (const CompilerType &return_type,
10151 const Address& function_address,
10152 const ValueList &arg_value_list,
10153 const char *name)
10154{
10155 TargetSP target_sp = m_target_wp.lock();
10156 if (!target_sp)
10157 return nullptr;
10158
10159 Process *process = target_sp->GetProcessSP().get();
10160 if (!process)
10161 return nullptr;
10162
10163 return new ClangFunctionCaller (*process, return_type, function_address, arg_value_list, name);
10164}
10165
10166UtilityFunction *
10167ClangASTContextForExpressions::GetUtilityFunction (const char *text,
10168 const char *name)
10169{
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010170 TargetSP target_sp = m_target_wp.lock();
Jim Ingham151c0322015-09-15 21:13:50 +000010171 if (!target_sp)
10172 return nullptr;
10173
10174 return new ClangUtilityFunction(*target_sp.get(), text, name);
10175}
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010176
10177PersistentExpressionState *
10178ClangASTContextForExpressions::GetPersistentExpressionState ()
10179{
10180 return m_persistent_variables.get();
10181}