blob: 541b24ee0fac3e8ac47e0b37ebd37d4820164113 [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) ||
108 Language::LanguageIsObjC (language);
109 }
110}
111
Enrico Granata2267ad42014-09-16 17:28:40 +0000112typedef lldb_private::ThreadSafeDenseMap<clang::ASTContext *, ClangASTContext*> ClangASTMap;
Enrico Granata5d84a692014-08-19 21:46:37 +0000113
114static ClangASTMap &
115GetASTMap()
116{
Enrico Granata2267ad42014-09-16 17:28:40 +0000117 static ClangASTMap *g_map_ptr = nullptr;
118 static std::once_flag g_once_flag;
119 std::call_once(g_once_flag, []() {
120 g_map_ptr = new ClangASTMap(); // leaked on purpose to avoid spins
121 });
122 return *g_map_ptr;
Enrico Granata5d84a692014-08-19 21:46:37 +0000123}
124
125
Greg Clayton57ee3062013-07-11 22:46:58 +0000126clang::AccessSpecifier
127ClangASTContext::ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000128{
129 switch (access)
130 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000131 default: break;
132 case eAccessNone: return AS_none;
133 case eAccessPublic: return AS_public;
134 case eAccessPrivate: return AS_private;
135 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000136 }
137 return AS_none;
138}
139
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000140static void
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000141ParseLangArgs (LangOptions &Opts, InputKind IK, const char* triple)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000142{
143 // FIXME: Cleanup per-file based stuff.
144
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000145 // Set some properties which depend solely on the input kind; it would be nice
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000146 // to move these to the language standard, and have the driver resolve the
147 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000148 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000149 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000150 } else if (IK == IK_ObjC ||
151 IK == IK_ObjCXX ||
152 IK == IK_PreprocessedObjC ||
153 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000154 Opts.ObjC1 = Opts.ObjC2 = 1;
155 }
156
157 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
158
159 if (LangStd == LangStandard::lang_unspecified) {
160 // Based on the base language, pick one.
161 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000162 case IK_None:
163 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000164 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000165 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000166 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000167 LangStd = LangStandard::lang_opencl;
168 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000169 case IK_CUDA:
Artem Belevich52210ae2015-03-19 18:12:26 +0000170 case IK_PreprocessedCuda:
Sean Callananfb0b7582011-03-15 00:17:19 +0000171 LangStd = LangStandard::lang_cuda;
172 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000173 case IK_Asm:
174 case IK_C:
175 case IK_PreprocessedC:
176 case IK_ObjC:
177 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000178 LangStd = LangStandard::lang_gnu99;
179 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000180 case IK_CXX:
181 case IK_PreprocessedCXX:
182 case IK_ObjCXX:
183 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000184 LangStd = LangStandard::lang_gnucxx98;
185 break;
186 }
187 }
188
189 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
Filipe Cabecinhase818ca22012-11-12 21:26:32 +0000190 Opts.LineComment = Std.hasLineComments();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000191 Opts.C99 = Std.isC99();
192 Opts.CPlusPlus = Std.isCPlusPlus();
Chandler Carruth38336a12013-01-02 12:55:00 +0000193 Opts.CPlusPlus11 = Std.isCPlusPlus11();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000194 Opts.Digraphs = Std.hasDigraphs();
195 Opts.GNUMode = Std.isGNUMode();
196 Opts.GNUInline = !Std.isC99();
197 Opts.HexFloats = Std.hasHexFloats();
198 Opts.ImplicitInt = Std.hasImplicitInt();
Enrico Granatac921e342013-01-10 02:37:22 +0000199
200 Opts.WChar = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000201
202 // OpenCL has some additional defaults.
203 if (LangStd == LangStandard::lang_opencl) {
204 Opts.OpenCL = 1;
205 Opts.AltiVec = 1;
206 Opts.CXXOperatorNames = 1;
207 Opts.LaxVectorConversions = 1;
208 }
209
210 // OpenCL and C++ both have bool, true, false keywords.
211 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
212
213// if (Opts.CPlusPlus)
214// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
215//
216// if (Args.hasArg(OPT_fobjc_gc_only))
217// Opts.setGCMode(LangOptions::GCOnly);
218// else if (Args.hasArg(OPT_fobjc_gc))
219// Opts.setGCMode(LangOptions::HybridGC);
220//
221// if (Args.hasArg(OPT_print_ivar_layout))
222// Opts.ObjCGCBitmapPrint = 1;
223//
224// if (Args.hasArg(OPT_faltivec))
225// Opts.AltiVec = 1;
226//
227// if (Args.hasArg(OPT_pthread))
228// Opts.POSIXThreads = 1;
229//
230// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
231// "default");
232// if (Vis == "default")
Sean Callanan37f76e52013-02-19 19:16:37 +0000233 Opts.setValueVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000234// else if (Vis == "hidden")
235// Opts.setVisibilityMode(LangOptions::Hidden);
236// else if (Vis == "protected")
237// Opts.setVisibilityMode(LangOptions::Protected);
238// else
239// Diags.Report(diag::err_drv_invalid_value)
240// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
241
242// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
243
244 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
245 // is specified, or -std is set to a conforming mode.
246 Opts.Trigraphs = !Opts.GNUMode;
247// if (Args.hasArg(OPT_trigraphs))
248// Opts.Trigraphs = 1;
249//
250// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
251// OPT_fno_dollars_in_identifiers,
252// !Opts.AsmPreprocessor);
253// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
254// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
255// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
256// if (Args.hasArg(OPT_fno_lax_vector_conversions))
257// Opts.LaxVectorConversions = 0;
258// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
259// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
260// Opts.Blocks = Args.hasArg(OPT_fblocks);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000261 Opts.CharIsSigned = ArchSpec(triple).CharIsSignedByDefault();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000262// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
263// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
264// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
265// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
266// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
267// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
268// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
269// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
270// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
271// Diags);
272// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
273// Opts.ObjCConstantStringClass = getLastArgValue(Args,
274// OPT_fconstant_string_class);
275// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
276// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
277// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
278// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
279// Opts.Static = Args.hasArg(OPT_static_define);
280 Opts.OptimizeSize = 0;
281
282 // FIXME: Eliminate this dependency.
283// unsigned Opt =
284// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
285// Opts.Optimize = Opt != 0;
286 unsigned Opt = 0;
287
288 // This is the __NO_INLINE__ define, which just depends on things like the
289 // optimization level and -fno-inline, not actually whether the backend has
290 // inlining enabled.
291 //
292 // FIXME: This is affected by other options (-fno-inline).
Sean Callanan3d654b32012-09-24 22:25:51 +0000293 Opts.NoInlineDefine = !Opt;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000294
295// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
296// switch (SSP) {
297// default:
298// Diags.Report(diag::err_drv_invalid_value)
299// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
300// break;
301// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
302// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
303// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
304// }
305}
306
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000307
Greg Claytonf73034f2015-09-08 18:15:05 +0000308ClangASTContext::ClangASTContext (const char *target_triple) :
309 TypeSystem (TypeSystem::eKindClang),
Greg Clayton6dc8d582015-08-18 22:32:36 +0000310 m_target_triple (),
311 m_ast_ap (),
312 m_language_options_ap (),
313 m_source_manager_ap (),
314 m_diagnostics_engine_ap (),
315 m_target_options_rp (),
316 m_target_info_ap (),
317 m_identifier_table_ap (),
318 m_selector_table_ap (),
319 m_builtins_ap (),
Ed Masted4612ad2014-04-20 13:17:36 +0000320 m_callback_tag_decl (nullptr),
321 m_callback_objc_decl (nullptr),
322 m_callback_baton (nullptr),
Greg Claytond8d4a572015-08-11 21:38:15 +0000323 m_pointer_byte_size (0),
Greg Clayton261ac3f2015-08-28 01:01:03 +0000324 m_ast_owned (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000325{
326 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000327 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000328}
329
330//----------------------------------------------------------------------
331// Destructor
332//----------------------------------------------------------------------
333ClangASTContext::~ClangASTContext()
334{
Enrico Granata5d84a692014-08-19 21:46:37 +0000335 if (m_ast_ap.get())
336 {
Enrico Granata2267ad42014-09-16 17:28:40 +0000337 GetASTMap().Erase(m_ast_ap.get());
Greg Claytond8d4a572015-08-11 21:38:15 +0000338 if (!m_ast_owned)
339 m_ast_ap.release();
Enrico Granata5d84a692014-08-19 21:46:37 +0000340 }
341
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000342 m_builtins_ap.reset();
343 m_selector_table_ap.reset();
344 m_identifier_table_ap.reset();
345 m_target_info_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000346 m_target_options_rp.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000347 m_diagnostics_engine_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000348 m_source_manager_ap.reset();
349 m_language_options_ap.reset();
Greg Clayton6beaaa62011-01-17 03:46:26 +0000350 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000351}
352
Greg Clayton56939cb2015-09-17 22:23:34 +0000353ConstString
354ClangASTContext::GetPluginNameStatic()
355{
356 return ConstString("clang");
357}
358
359ConstString
360ClangASTContext::GetPluginName()
361{
362 return ClangASTContext::GetPluginNameStatic();
363}
364
365uint32_t
366ClangASTContext::GetPluginVersion()
367{
368 return 1;
369}
370
371lldb::TypeSystemSP
Tamas Berghammer3a6b82b2015-10-09 12:06:10 +0000372ClangASTContext::CreateInstance (lldb::LanguageType language,
373 lldb_private::Module *module,
374 Target *target)
Greg Clayton56939cb2015-09-17 22:23:34 +0000375{
376 if (ClangASTContextSupportsLanguage(language))
377 {
Greg Clayton5beec212015-10-08 21:04:34 +0000378 ArchSpec arch;
379 if (module)
380 arch = module->GetArchitecture();
381 else if (target)
382 arch = target->GetArchitecture();
383
384 if (arch.IsValid())
Greg Clayton56939cb2015-09-17 22:23:34 +0000385 {
Greg Clayton5beec212015-10-08 21:04:34 +0000386 ArchSpec fixed_arch = arch;
387 // LLVM wants this to be set to iOS or MacOSX; if we're working on
388 // a bare-boards type image, change the triple for llvm's benefit.
389 if (fixed_arch.GetTriple().getVendor() == llvm::Triple::Apple &&
390 fixed_arch.GetTriple().getOS() == llvm::Triple::UnknownOS)
Greg Clayton56939cb2015-09-17 22:23:34 +0000391 {
Greg Clayton5beec212015-10-08 21:04:34 +0000392 if (fixed_arch.GetTriple().getArch() == llvm::Triple::arm ||
393 fixed_arch.GetTriple().getArch() == llvm::Triple::aarch64 ||
394 fixed_arch.GetTriple().getArch() == llvm::Triple::thumb)
Greg Clayton56939cb2015-09-17 22:23:34 +0000395 {
Greg Clayton5beec212015-10-08 21:04:34 +0000396 fixed_arch.GetTriple().setOS(llvm::Triple::IOS);
Greg Clayton56939cb2015-09-17 22:23:34 +0000397 }
Greg Clayton5beec212015-10-08 21:04:34 +0000398 else
399 {
400 fixed_arch.GetTriple().setOS(llvm::Triple::MacOSX);
401 }
402 }
403
404 if (module)
405 {
406 std::shared_ptr<ClangASTContext> ast_sp(new ClangASTContext);
407 if (ast_sp)
408 {
409 ast_sp->SetArchitecture (fixed_arch);
410 }
411 return ast_sp;
412 }
Sean Callanana3444ff2015-11-10 22:54:42 +0000413 else if (target && target->IsValid())
Greg Clayton5beec212015-10-08 21:04:34 +0000414 {
415 std::shared_ptr<ClangASTContextForExpressions> ast_sp(new ClangASTContextForExpressions(*target));
416 if (ast_sp)
417 {
418 ast_sp->SetArchitecture(fixed_arch);
419 ast_sp->m_scratch_ast_source_ap.reset (new ClangASTSource(target->shared_from_this()));
420 ast_sp->m_scratch_ast_source_ap->InstallASTContext(ast_sp->getASTContext());
421 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(ast_sp->m_scratch_ast_source_ap->CreateProxy());
422 ast_sp->SetExternalSource(proxy_ast_source);
423 return ast_sp;
424 }
Greg Clayton56939cb2015-09-17 22:23:34 +0000425 }
426 }
Greg Clayton56939cb2015-09-17 22:23:34 +0000427 }
428 return lldb::TypeSystemSP();
429}
430
Sean Callananfe38c852015-10-08 23:07:53 +0000431void
432ClangASTContext::EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions)
433{
434 static std::vector<lldb::LanguageType> s_supported_languages_for_types({
435 lldb::eLanguageTypeC89,
436 lldb::eLanguageTypeC,
437 lldb::eLanguageTypeC11,
438 lldb::eLanguageTypeC_plus_plus,
439 lldb::eLanguageTypeC99,
440 lldb::eLanguageTypeObjC,
441 lldb::eLanguageTypeObjC_plus_plus,
442 lldb::eLanguageTypeC_plus_plus_03,
443 lldb::eLanguageTypeC_plus_plus_11,
444 lldb::eLanguageTypeC11,
445 lldb::eLanguageTypeC_plus_plus_14});
446
447 static std::vector<lldb::LanguageType> s_supported_languages_for_expressions({
448 lldb::eLanguageTypeC_plus_plus,
449 lldb::eLanguageTypeObjC_plus_plus,
450 lldb::eLanguageTypeC_plus_plus_03,
451 lldb::eLanguageTypeC_plus_plus_11,
452 lldb::eLanguageTypeC_plus_plus_14});
453
454 languages_for_types.insert(s_supported_languages_for_types.begin(), s_supported_languages_for_types.end());
455 languages_for_expressions.insert(s_supported_languages_for_expressions.begin(), s_supported_languages_for_expressions.end());
456}
457
Greg Clayton56939cb2015-09-17 22:23:34 +0000458
459void
460ClangASTContext::Initialize()
461{
462 PluginManager::RegisterPlugin (GetPluginNameStatic(),
463 "clang base AST context plug-in",
Sean Callananfe38c852015-10-08 23:07:53 +0000464 CreateInstance,
465 EnumerateSupportedLanguages);
Greg Clayton56939cb2015-09-17 22:23:34 +0000466}
467
468void
469ClangASTContext::Terminate()
470{
471 PluginManager::UnregisterPlugin (CreateInstance);
472}
473
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000474
475void
476ClangASTContext::Clear()
477{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000478 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000479 m_language_options_ap.reset();
480 m_source_manager_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000481 m_diagnostics_engine_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000482 m_target_options_rp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000483 m_target_info_ap.reset();
484 m_identifier_table_ap.reset();
485 m_selector_table_ap.reset();
486 m_builtins_ap.reset();
Greg Clayton57ee3062013-07-11 22:46:58 +0000487 m_pointer_byte_size = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000488}
489
490const char *
491ClangASTContext::GetTargetTriple ()
492{
493 return m_target_triple.c_str();
494}
495
496void
497ClangASTContext::SetTargetTriple (const char *target_triple)
498{
499 Clear();
500 m_target_triple.assign(target_triple);
501}
502
Greg Clayton514487e2011-02-15 21:59:32 +0000503void
504ClangASTContext::SetArchitecture (const ArchSpec &arch)
505{
Greg Clayton880cbb02011-07-30 01:26:02 +0000506 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000507}
508
Greg Clayton6beaaa62011-01-17 03:46:26 +0000509bool
510ClangASTContext::HasExternalSource ()
511{
512 ASTContext *ast = getASTContext();
513 if (ast)
Ed Masted4612ad2014-04-20 13:17:36 +0000514 return ast->getExternalSource () != nullptr;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000515 return false;
516}
517
518void
Todd Fiala955fe6f2014-02-27 17:18:23 +0000519ClangASTContext::SetExternalSource (llvm::IntrusiveRefCntPtr<ExternalASTSource> &ast_source_ap)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000520{
521 ASTContext *ast = getASTContext();
522 if (ast)
523 {
524 ast->setExternalSource (ast_source_ap);
525 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
526 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
527 }
528}
529
530void
531ClangASTContext::RemoveExternalSource ()
532{
533 ASTContext *ast = getASTContext();
534
535 if (ast)
536 {
Todd Fiala955fe6f2014-02-27 17:18:23 +0000537 llvm::IntrusiveRefCntPtr<ExternalASTSource> empty_ast_source_ap;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000538 ast->setExternalSource (empty_ast_source_ap);
539 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
540 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
541 }
542}
543
Greg Claytond8d4a572015-08-11 21:38:15 +0000544void
545ClangASTContext::setASTContext(clang::ASTContext *ast_ctx)
546{
547 if (!m_ast_owned) {
548 m_ast_ap.release();
549 }
550 m_ast_owned = false;
551 m_ast_ap.reset(ast_ctx);
552 GetASTMap().Insert(ast_ctx, this);
553}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554
555ASTContext *
556ClangASTContext::getASTContext()
557{
Ed Masted4612ad2014-04-20 13:17:36 +0000558 if (m_ast_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000559 {
Greg Claytond8d4a572015-08-11 21:38:15 +0000560 m_ast_owned = true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000561 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
562 *getSourceManager(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000563 *getIdentifierTable(),
564 *getSelectorTable(),
Alp Tokercf55e882014-05-03 15:05:45 +0000565 *getBuiltinContext()));
Sean Callanan6d61b632015-04-09 17:42:48 +0000566
567 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Greg Clayton28eb7bf2015-05-07 00:07:44 +0000568
569 // This can be NULL if we don't know anything about the architecture or if the
570 // target for an architecture isn't enabled in the llvm/clang that we built
571 TargetInfo *target_info = getTargetInfo();
572 if (target_info)
573 m_ast_ap->InitBuiltinTypes(*target_info);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000574
Greg Clayton6beaaa62011-01-17 03:46:26 +0000575 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
576 {
577 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
578 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
579 }
580
Enrico Granata2267ad42014-09-16 17:28:40 +0000581 GetASTMap().Insert(m_ast_ap.get(), this);
Greg Clayton6dc8d582015-08-18 22:32:36 +0000582
583 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> ast_source_ap (new ClangExternalASTSourceCallbacks (ClangASTContext::CompleteTagDecl,
584 ClangASTContext::CompleteObjCInterfaceDecl,
585 nullptr,
586 ClangASTContext::LayoutRecordType,
587 this));
588 SetExternalSource (ast_source_ap);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000589 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000590 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000591}
592
Enrico Granata5d84a692014-08-19 21:46:37 +0000593ClangASTContext*
594ClangASTContext::GetASTContext (clang::ASTContext* ast)
595{
Enrico Granata2267ad42014-09-16 17:28:40 +0000596 ClangASTContext *clang_ast = GetASTMap().Lookup(ast);
Enrico Granata5d84a692014-08-19 21:46:37 +0000597 return clang_ast;
598}
599
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000600Builtin::Context *
601ClangASTContext::getBuiltinContext()
602{
Ed Masted4612ad2014-04-20 13:17:36 +0000603 if (m_builtins_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000604 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000605 return m_builtins_ap.get();
606}
607
608IdentifierTable *
609ClangASTContext::getIdentifierTable()
610{
Ed Masted4612ad2014-04-20 13:17:36 +0000611 if (m_identifier_table_ap.get() == nullptr)
612 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), nullptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000613 return m_identifier_table_ap.get();
614}
615
616LangOptions *
617ClangASTContext::getLanguageOptions()
618{
Ed Masted4612ad2014-04-20 13:17:36 +0000619 if (m_language_options_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000620 {
621 m_language_options_ap.reset(new LangOptions());
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000622 ParseLangArgs(*m_language_options_ap, IK_ObjCXX, GetTargetTriple());
Greg Clayton94e5d782010-06-13 17:34:29 +0000623// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000624 }
625 return m_language_options_ap.get();
626}
627
628SelectorTable *
629ClangASTContext::getSelectorTable()
630{
Ed Masted4612ad2014-04-20 13:17:36 +0000631 if (m_selector_table_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000632 m_selector_table_ap.reset (new SelectorTable());
633 return m_selector_table_ap.get();
634}
635
Sean Callanan79439e82010-11-18 02:56:27 +0000636clang::FileManager *
637ClangASTContext::getFileManager()
638{
Ed Masted4612ad2014-04-20 13:17:36 +0000639 if (m_file_manager_ap.get() == nullptr)
Greg Clayton38a61402010-12-02 23:20:03 +0000640 {
641 clang::FileSystemOptions file_system_options;
642 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
643 }
Sean Callanan79439e82010-11-18 02:56:27 +0000644 return m_file_manager_ap.get();
645}
646
Greg Claytone1a916a2010-07-21 22:12:05 +0000647clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000648ClangASTContext::getSourceManager()
649{
Ed Masted4612ad2014-04-20 13:17:36 +0000650 if (m_source_manager_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000651 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000652 return m_source_manager_ap.get();
653}
654
Sean Callanan880e6802011-10-07 23:18:13 +0000655clang::DiagnosticsEngine *
656ClangASTContext::getDiagnosticsEngine()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000657{
Ed Masted4612ad2014-04-20 13:17:36 +0000658 if (m_diagnostics_engine_ap.get() == nullptr)
Greg Claytona651b532010-11-19 21:46:54 +0000659 {
660 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callananec8f1ef2012-10-25 01:00:25 +0000661 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
Greg Claytona651b532010-11-19 21:46:54 +0000662 }
Sean Callanan880e6802011-10-07 23:18:13 +0000663 return m_diagnostics_engine_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000664}
665
Greg Claytonfe689042015-11-10 17:47:04 +0000666clang::MangleContext *
667ClangASTContext::getMangleContext()
668{
669 if (m_mangle_ctx_ap.get() == nullptr)
670 m_mangle_ctx_ap.reset (getASTContext()->createMangleContext());
671 return m_mangle_ctx_ap.get();
672}
673
Sean Callanan880e6802011-10-07 23:18:13 +0000674class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000675{
676public:
Sean Callanan880e6802011-10-07 23:18:13 +0000677 NullDiagnosticConsumer ()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000678 {
679 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
680 }
681
Sean Callanan880e6802011-10-07 23:18:13 +0000682 void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000683 {
684 if (m_log)
685 {
Sean Callanan5b26f272012-02-04 08:49:35 +0000686 llvm::SmallVector<char, 32> diag_str(10);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000687 info.FormatDiagnostic(diag_str);
688 diag_str.push_back('\0');
689 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
690 }
691 }
Sean Callanan880e6802011-10-07 23:18:13 +0000692
693 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
694 {
695 return new NullDiagnosticConsumer ();
696 }
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000697private:
Greg Clayton5160ce52013-03-27 23:08:40 +0000698 Log * m_log;
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000699};
700
Sean Callanan880e6802011-10-07 23:18:13 +0000701DiagnosticConsumer *
702ClangASTContext::getDiagnosticConsumer()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000703{
Ed Masted4612ad2014-04-20 13:17:36 +0000704 if (m_diagnostic_consumer_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000705 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000706
Sean Callanan880e6802011-10-07 23:18:13 +0000707 return m_diagnostic_consumer_ap.get();
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000708}
709
Jason Molenda45938b92014-07-08 23:46:39 +0000710std::shared_ptr<TargetOptions> &
711ClangASTContext::getTargetOptions() {
Alp Tokeredc902f2014-07-05 03:06:05 +0000712 if (m_target_options_rp.get() == nullptr && !m_target_triple.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000713 {
Alp Toker5f838642014-07-06 05:36:57 +0000714 m_target_options_rp = std::make_shared<TargetOptions>();
Alp Tokeredc902f2014-07-05 03:06:05 +0000715 if (m_target_options_rp.get() != nullptr)
Sean Callananc5069ad2012-10-17 22:11:14 +0000716 m_target_options_rp->Triple = m_target_triple;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000717 }
Alp Toker5f838642014-07-06 05:36:57 +0000718 return m_target_options_rp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000719}
720
721
722TargetInfo *
723ClangASTContext::getTargetInfo()
724{
Greg Clayton70512312012-05-08 01:45:38 +0000725 // target_triple should be something like "x86_64-apple-macosx"
Ed Masted4612ad2014-04-20 13:17:36 +0000726 if (m_target_info_ap.get() == nullptr && !m_target_triple.empty())
Greg Clayton38d880a2012-11-16 21:35:22 +0000727 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), getTargetOptions()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000728 return m_target_info_ap.get();
729}
730
731#pragma mark Basic Types
732
733static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000734QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000735{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000736 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000737 if (qual_type_bit_size == bit_size)
738 return true;
739 return false;
740}
Greg Clayton56939cb2015-09-17 22:23:34 +0000741
Greg Claytona1e5dc82015-08-11 22:53:00 +0000742CompilerType
Greg Clayton56939cb2015-09-17 22:23:34 +0000743ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, size_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000744{
Greg Clayton57ee3062013-07-11 22:46:58 +0000745 return ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (getASTContext(), encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000746}
747
Greg Claytona1e5dc82015-08-11 22:53:00 +0000748CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +0000749ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000750{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000751 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +0000752 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000753 switch (encoding)
754 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000755 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000756 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000757 return CompilerType (ast, ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000758 break;
759
Greg Claytonc86103d2010-08-05 01:57:25 +0000760 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000761 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000762 return CompilerType (ast, ast->UnsignedCharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000763 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000764 return CompilerType (ast, ast->UnsignedShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000765 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000766 return CompilerType (ast, ast->UnsignedIntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000767 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000768 return CompilerType (ast, ast->UnsignedLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000769 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000770 return CompilerType (ast, ast->UnsignedLongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000771 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000772 return CompilerType (ast, ast->UnsignedInt128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000773 break;
774
Greg Claytonc86103d2010-08-05 01:57:25 +0000775 case eEncodingSint:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000776 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000777 return CompilerType (ast, ast->CharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000778 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000779 return CompilerType (ast, ast->ShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000780 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000781 return CompilerType (ast, ast->IntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000782 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000783 return CompilerType (ast, ast->LongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000784 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000785 return CompilerType (ast, ast->LongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000786 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000787 return CompilerType (ast, ast->Int128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000788 break;
789
Greg Claytonc86103d2010-08-05 01:57:25 +0000790 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000791 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000792 return CompilerType (ast, ast->FloatTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000793 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000794 return CompilerType (ast, ast->DoubleTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +0000795 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000796 return CompilerType (ast, ast->LongDoubleTy);
Greg Claytondee40e72015-11-03 23:23:22 +0000797 if (QualTypeMatchesBitSize (bit_size, ast, ast->HalfTy))
798 return CompilerType (ast, ast->HalfTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000799 break;
800
Greg Claytonc86103d2010-08-05 01:57:25 +0000801 case eEncodingVector:
Johnny Chenc79c93a2012-03-07 01:12:24 +0000802 // Sanity check that bit_size is a multiple of 8's.
803 if (bit_size && !(bit_size & 0x7u))
Greg Claytona1e5dc82015-08-11 22:53:00 +0000804 return CompilerType (ast, ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8));
Johnny Chenc79c93a2012-03-07 01:12:24 +0000805 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000806 }
807
Greg Claytona1e5dc82015-08-11 22:53:00 +0000808 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000809}
810
Greg Clayton57ee3062013-07-11 22:46:58 +0000811
812
813lldb::BasicType
814ClangASTContext::GetBasicTypeEnumeration (const ConstString &name)
815{
816 if (name)
817 {
818 typedef UniqueCStringMap<lldb::BasicType> TypeNameToBasicTypeMap;
819 static TypeNameToBasicTypeMap g_type_map;
820 static std::once_flag g_once_flag;
821 std::call_once(g_once_flag, [](){
822 // "void"
823 g_type_map.Append(ConstString("void").GetCString(), eBasicTypeVoid);
824
825 // "char"
826 g_type_map.Append(ConstString("char").GetCString(), eBasicTypeChar);
827 g_type_map.Append(ConstString("signed char").GetCString(), eBasicTypeSignedChar);
828 g_type_map.Append(ConstString("unsigned char").GetCString(), eBasicTypeUnsignedChar);
829 g_type_map.Append(ConstString("wchar_t").GetCString(), eBasicTypeWChar);
830 g_type_map.Append(ConstString("signed wchar_t").GetCString(), eBasicTypeSignedWChar);
831 g_type_map.Append(ConstString("unsigned wchar_t").GetCString(), eBasicTypeUnsignedWChar);
832 // "short"
833 g_type_map.Append(ConstString("short").GetCString(), eBasicTypeShort);
834 g_type_map.Append(ConstString("short int").GetCString(), eBasicTypeShort);
835 g_type_map.Append(ConstString("unsigned short").GetCString(), eBasicTypeUnsignedShort);
836 g_type_map.Append(ConstString("unsigned short int").GetCString(), eBasicTypeUnsignedShort);
837
838 // "int"
839 g_type_map.Append(ConstString("int").GetCString(), eBasicTypeInt);
840 g_type_map.Append(ConstString("signed int").GetCString(), eBasicTypeInt);
841 g_type_map.Append(ConstString("unsigned int").GetCString(), eBasicTypeUnsignedInt);
842 g_type_map.Append(ConstString("unsigned").GetCString(), eBasicTypeUnsignedInt);
843
844 // "long"
845 g_type_map.Append(ConstString("long").GetCString(), eBasicTypeLong);
846 g_type_map.Append(ConstString("long int").GetCString(), eBasicTypeLong);
847 g_type_map.Append(ConstString("unsigned long").GetCString(), eBasicTypeUnsignedLong);
848 g_type_map.Append(ConstString("unsigned long int").GetCString(), eBasicTypeUnsignedLong);
849
850 // "long long"
851 g_type_map.Append(ConstString("long long").GetCString(), eBasicTypeLongLong);
852 g_type_map.Append(ConstString("long long int").GetCString(), eBasicTypeLongLong);
853 g_type_map.Append(ConstString("unsigned long long").GetCString(), eBasicTypeUnsignedLongLong);
854 g_type_map.Append(ConstString("unsigned long long int").GetCString(), eBasicTypeUnsignedLongLong);
855
856 // "int128"
857 g_type_map.Append(ConstString("__int128_t").GetCString(), eBasicTypeInt128);
858 g_type_map.Append(ConstString("__uint128_t").GetCString(), eBasicTypeUnsignedInt128);
859
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000860 // Miscellaneous
Greg Clayton57ee3062013-07-11 22:46:58 +0000861 g_type_map.Append(ConstString("bool").GetCString(), eBasicTypeBool);
862 g_type_map.Append(ConstString("float").GetCString(), eBasicTypeFloat);
863 g_type_map.Append(ConstString("double").GetCString(), eBasicTypeDouble);
864 g_type_map.Append(ConstString("long double").GetCString(), eBasicTypeLongDouble);
865 g_type_map.Append(ConstString("id").GetCString(), eBasicTypeObjCID);
866 g_type_map.Append(ConstString("SEL").GetCString(), eBasicTypeObjCSel);
867 g_type_map.Append(ConstString("nullptr").GetCString(), eBasicTypeNullPtr);
868 g_type_map.Sort();
869 });
870
871 return g_type_map.Find(name.GetCString(), eBasicTypeInvalid);
872 }
873 return eBasicTypeInvalid;
874}
875
Greg Claytona1e5dc82015-08-11 22:53:00 +0000876CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000877ClangASTContext::GetBasicType (ASTContext *ast, const ConstString &name)
878{
879 if (ast)
880 {
881 lldb::BasicType basic_type = ClangASTContext::GetBasicTypeEnumeration (name);
882 return ClangASTContext::GetBasicType (ast, basic_type);
883 }
Greg Claytona1e5dc82015-08-11 22:53:00 +0000884 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +0000885}
886
887uint32_t
888ClangASTContext::GetPointerByteSize ()
889{
890 if (m_pointer_byte_size == 0)
Enrico Granata1cd5e922015-01-28 00:07:51 +0000891 m_pointer_byte_size = GetBasicType(lldb::eBasicTypeVoid).GetPointerType().GetByteSize(nullptr);
Greg Clayton57ee3062013-07-11 22:46:58 +0000892 return m_pointer_byte_size;
893}
894
Greg Claytona1e5dc82015-08-11 22:53:00 +0000895CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000896ClangASTContext::GetBasicType (lldb::BasicType basic_type)
897{
898 return GetBasicType (getASTContext(), basic_type);
899}
900
Greg Claytona1e5dc82015-08-11 22:53:00 +0000901CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +0000902ClangASTContext::GetBasicType (ASTContext *ast, lldb::BasicType basic_type)
903{
904 if (ast)
905 {
Bruce Mitchener48ea9002015-09-23 00:18:24 +0000906 lldb::opaque_compiler_type_t clang_type = nullptr;
Greg Clayton57ee3062013-07-11 22:46:58 +0000907
908 switch (basic_type)
909 {
910 case eBasicTypeInvalid:
911 case eBasicTypeOther:
912 break;
913 case eBasicTypeVoid:
914 clang_type = ast->VoidTy.getAsOpaquePtr();
915 break;
916 case eBasicTypeChar:
917 clang_type = ast->CharTy.getAsOpaquePtr();
918 break;
919 case eBasicTypeSignedChar:
920 clang_type = ast->SignedCharTy.getAsOpaquePtr();
921 break;
922 case eBasicTypeUnsignedChar:
923 clang_type = ast->UnsignedCharTy.getAsOpaquePtr();
924 break;
925 case eBasicTypeWChar:
926 clang_type = ast->getWCharType().getAsOpaquePtr();
927 break;
928 case eBasicTypeSignedWChar:
929 clang_type = ast->getSignedWCharType().getAsOpaquePtr();
930 break;
931 case eBasicTypeUnsignedWChar:
932 clang_type = ast->getUnsignedWCharType().getAsOpaquePtr();
933 break;
934 case eBasicTypeChar16:
935 clang_type = ast->Char16Ty.getAsOpaquePtr();
936 break;
937 case eBasicTypeChar32:
938 clang_type = ast->Char32Ty.getAsOpaquePtr();
939 break;
940 case eBasicTypeShort:
941 clang_type = ast->ShortTy.getAsOpaquePtr();
942 break;
943 case eBasicTypeUnsignedShort:
944 clang_type = ast->UnsignedShortTy.getAsOpaquePtr();
945 break;
946 case eBasicTypeInt:
947 clang_type = ast->IntTy.getAsOpaquePtr();
948 break;
949 case eBasicTypeUnsignedInt:
950 clang_type = ast->UnsignedIntTy.getAsOpaquePtr();
951 break;
952 case eBasicTypeLong:
953 clang_type = ast->LongTy.getAsOpaquePtr();
954 break;
955 case eBasicTypeUnsignedLong:
956 clang_type = ast->UnsignedLongTy.getAsOpaquePtr();
957 break;
958 case eBasicTypeLongLong:
959 clang_type = ast->LongLongTy.getAsOpaquePtr();
960 break;
961 case eBasicTypeUnsignedLongLong:
962 clang_type = ast->UnsignedLongLongTy.getAsOpaquePtr();
963 break;
964 case eBasicTypeInt128:
965 clang_type = ast->Int128Ty.getAsOpaquePtr();
966 break;
967 case eBasicTypeUnsignedInt128:
968 clang_type = ast->UnsignedInt128Ty.getAsOpaquePtr();
969 break;
970 case eBasicTypeBool:
971 clang_type = ast->BoolTy.getAsOpaquePtr();
972 break;
973 case eBasicTypeHalf:
974 clang_type = ast->HalfTy.getAsOpaquePtr();
975 break;
976 case eBasicTypeFloat:
977 clang_type = ast->FloatTy.getAsOpaquePtr();
978 break;
979 case eBasicTypeDouble:
980 clang_type = ast->DoubleTy.getAsOpaquePtr();
981 break;
982 case eBasicTypeLongDouble:
983 clang_type = ast->LongDoubleTy.getAsOpaquePtr();
984 break;
985 case eBasicTypeFloatComplex:
986 clang_type = ast->FloatComplexTy.getAsOpaquePtr();
987 break;
988 case eBasicTypeDoubleComplex:
989 clang_type = ast->DoubleComplexTy.getAsOpaquePtr();
990 break;
991 case eBasicTypeLongDoubleComplex:
992 clang_type = ast->LongDoubleComplexTy.getAsOpaquePtr();
993 break;
994 case eBasicTypeObjCID:
995 clang_type = ast->getObjCIdType().getAsOpaquePtr();
996 break;
997 case eBasicTypeObjCClass:
998 clang_type = ast->getObjCClassType().getAsOpaquePtr();
999 break;
1000 case eBasicTypeObjCSel:
1001 clang_type = ast->getObjCSelType().getAsOpaquePtr();
1002 break;
1003 case eBasicTypeNullPtr:
1004 clang_type = ast->NullPtrTy.getAsOpaquePtr();
1005 break;
1006 }
1007
1008 if (clang_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001009 return CompilerType (GetASTContext(ast), clang_type);
Greg Clayton57ee3062013-07-11 22:46:58 +00001010 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001011 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +00001012}
1013
1014
Greg Claytona1e5dc82015-08-11 22:53:00 +00001015CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001016ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
1017{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001018 ASTContext *ast = getASTContext();
Sean Callanan38d4df52012-04-03 01:10:10 +00001019
1020#define streq(a,b) strcmp(a,b) == 0
Ed Masted4612ad2014-04-20 13:17:36 +00001021 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001022 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001023 {
1024 switch (dw_ate)
1025 {
Sean Callanan38d4df52012-04-03 01:10:10 +00001026 default:
1027 break;
Greg Clayton605684e2011-10-28 23:06:08 +00001028
Sean Callanan38d4df52012-04-03 01:10:10 +00001029 case DW_ATE_address:
1030 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001031 return CompilerType (ast, ast->VoidPtrTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001032 break;
1033
1034 case DW_ATE_boolean:
1035 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001036 return CompilerType (ast, ast->BoolTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001037 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001038 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001039 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001040 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001041 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001042 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001043 break;
1044
1045 case DW_ATE_lo_user:
1046 // This has been seen to mean DW_AT_complex_integer
1047 if (type_name)
Greg Clayton605684e2011-10-28 23:06:08 +00001048 {
Sean Callanan38d4df52012-04-03 01:10:10 +00001049 if (::strstr(type_name, "complex"))
1050 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001051 CompilerType complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
1052 return CompilerType (ast, ast->getComplexType (GetQualType(complex_int_clang_type)));
Sean Callanan38d4df52012-04-03 01:10:10 +00001053 }
Greg Clayton605684e2011-10-28 23:06:08 +00001054 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001055 break;
1056
1057 case DW_ATE_complex_float:
1058 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001059 return CompilerType (ast, ast->FloatComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001060 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001061 return CompilerType (ast, ast->DoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001062 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001063 return CompilerType (ast, ast->LongDoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001064 else
Greg Clayton605684e2011-10-28 23:06:08 +00001065 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001066 CompilerType complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
1067 return CompilerType (ast, ast->getComplexType (GetQualType(complex_float_clang_type)));
Greg Clayton605684e2011-10-28 23:06:08 +00001068 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001069 break;
1070
1071 case DW_ATE_float:
Greg Clayton8012cad2014-11-17 19:39:20 +00001072 if (streq(type_name, "float") && QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001073 return CompilerType (ast, ast->FloatTy);
Greg Clayton8012cad2014-11-17 19:39:20 +00001074 if (streq(type_name, "double") && QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001075 return CompilerType (ast, ast->DoubleTy);
Greg Clayton8012cad2014-11-17 19:39:20 +00001076 if (streq(type_name, "long double") && QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001077 return CompilerType (ast, ast->LongDoubleTy);
Bruce Mitchenere171da52015-07-22 00:16:02 +00001078 // Fall back to not requiring a name match
Sean Callanan38d4df52012-04-03 01:10:10 +00001079 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001080 return CompilerType (ast, ast->FloatTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001081 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001082 return CompilerType (ast, ast->DoubleTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001083 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001084 return CompilerType (ast, ast->LongDoubleTy);
Greg Claytondee40e72015-11-03 23:23:22 +00001085 if (QualTypeMatchesBitSize (bit_size, ast, ast->HalfTy))
1086 return CompilerType (ast, ast->HalfTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001087 break;
1088
1089 case DW_ATE_signed:
1090 if (type_name)
1091 {
1092 if (streq(type_name, "wchar_t") &&
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001093 QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy) &&
Greg Clayton28eb7bf2015-05-07 00:07:44 +00001094 (getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001095 return CompilerType (ast, ast->WCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001096 if (streq(type_name, "void") &&
1097 QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001098 return CompilerType (ast, ast->VoidTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001099 if (strstr(type_name, "long long") &&
1100 QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001101 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001102 if (strstr(type_name, "long") &&
1103 QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001104 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001105 if (strstr(type_name, "short") &&
1106 QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001107 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001108 if (strstr(type_name, "char"))
1109 {
1110 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001111 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001112 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001113 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001114 }
1115 if (strstr(type_name, "int"))
1116 {
1117 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001118 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001119 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001120 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001121 }
1122 }
1123 // We weren't able to match up a type name, just search by size
1124 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001125 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001126 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001127 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001128 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001129 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001130 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001131 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001132 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001133 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001134 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001135 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001136 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001137
Sean Callanan38d4df52012-04-03 01:10:10 +00001138 case DW_ATE_signed_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001139 if (ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
Sean Callanan38d4df52012-04-03 01:10:10 +00001140 {
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001141 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001142 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001143 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001144 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001145 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001146 break;
1147
1148 case DW_ATE_unsigned:
1149 if (type_name)
1150 {
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001151 if (streq(type_name, "wchar_t"))
1152 {
1153 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
1154 {
Greg Clayton28eb7bf2015-05-07 00:07:44 +00001155 if (!(getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001156 return CompilerType (ast, ast->WCharTy);
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001157 }
1158 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001159 if (strstr(type_name, "long long"))
1160 {
1161 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001162 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001163 }
1164 else if (strstr(type_name, "long"))
1165 {
1166 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001167 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001168 }
1169 else if (strstr(type_name, "short"))
1170 {
1171 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001172 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001173 }
1174 else if (strstr(type_name, "char"))
1175 {
1176 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001177 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001178 }
1179 else if (strstr(type_name, "int"))
1180 {
1181 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001182 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001183 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001184 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001185 }
1186 }
1187 // We weren't able to match up a type name, just search by size
1188 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001189 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001190 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001191 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001192 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001193 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001194 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001195 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001196 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001197 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001198 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001199 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001200 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001201
Sean Callanan38d4df52012-04-03 01:10:10 +00001202 case DW_ATE_unsigned_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001203 if (!ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
1204 {
1205 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001206 return CompilerType (ast, ast->CharTy);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001207 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001208 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001209 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001210 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001211 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001212 break;
1213
1214 case DW_ATE_imaginary_float:
1215 break;
1216
1217 case DW_ATE_UTF:
1218 if (type_name)
1219 {
1220 if (streq(type_name, "char16_t"))
1221 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001222 return CompilerType (ast, ast->Char16Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001223 }
1224 else if (streq(type_name, "char32_t"))
1225 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001226 return CompilerType (ast, ast->Char32Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001227 }
1228 }
1229 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001230 }
1231 }
1232 // This assert should fire for anything that we don't catch above so we know
1233 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +00001234 if (type_name)
1235 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001236 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 +00001237 }
1238 else
1239 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001240 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 +00001241 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001242 return CompilerType ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001243}
1244
Greg Claytona1e5dc82015-08-11 22:53:00 +00001245CompilerType
Sean Callanan77502262011-05-12 23:54:16 +00001246ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
1247{
Greg Clayton57ee3062013-07-11 22:46:58 +00001248 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001249 return CompilerType (ast, ast->UnknownAnyTy);
1250 return CompilerType();
Sean Callanan77502262011-05-12 23:54:16 +00001251}
1252
Greg Claytona1e5dc82015-08-11 22:53:00 +00001253CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001254ClangASTContext::GetCStringType (bool is_const)
1255{
Greg Clayton57ee3062013-07-11 22:46:58 +00001256 ASTContext *ast = getASTContext();
1257 QualType char_type(ast->CharTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001258
1259 if (is_const)
1260 char_type.addConst();
1261
Greg Claytona1e5dc82015-08-11 22:53:00 +00001262 return CompilerType (ast, ast->getPointerType(char_type));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001263}
1264
Sean Callanan09ab4b72011-11-30 22:11:59 +00001265clang::DeclContext *
1266ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
1267{
1268 return ast->getTranslationUnitDecl();
1269}
1270
Greg Clayton526e5af2010-11-13 03:52:47 +00001271clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001272ClangASTContext::CopyDecl (ASTContext *dst_ast,
1273 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001274 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001275{
Sean Callanan79439e82010-11-18 02:56:27 +00001276 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001277 FileManager file_manager (file_system_options);
1278 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001279 *src_ast, file_manager,
1280 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001281
1282 return importer.Import(source_decl);
1283}
1284
Sean Callanan23a30272010-07-16 00:00:27 +00001285bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00001286ClangASTContext::AreTypesSame (CompilerType type1,
1287 CompilerType type2,
Greg Clayton84db9102012-03-26 23:03:23 +00001288 bool ignore_qualifiers)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001289{
Greg Claytonf73034f2015-09-08 18:15:05 +00001290 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type1.GetTypeSystem());
1291 if (!ast || ast != type2.GetTypeSystem())
Greg Clayton57ee3062013-07-11 22:46:58 +00001292 return false;
1293
1294 if (type1.GetOpaqueQualType() == type2.GetOpaqueQualType())
Greg Clayton55995eb2012-04-06 17:38:55 +00001295 return true;
1296
Greg Claytond8d4a572015-08-11 21:38:15 +00001297 QualType type1_qual = GetQualType(type1);
1298 QualType type2_qual = GetQualType(type2);
Sean Callanan5056ab02012-02-18 02:01:03 +00001299
1300 if (ignore_qualifiers)
1301 {
1302 type1_qual = type1_qual.getUnqualifiedType();
1303 type2_qual = type2_qual.getUnqualifiedType();
1304 }
1305
Greg Claytonf73034f2015-09-08 18:15:05 +00001306 return ast->getASTContext()->hasSameType (type1_qual, type2_qual);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001307}
1308
Greg Claytona1e5dc82015-08-11 22:53:00 +00001309CompilerType
Sean Callanan9998acd2014-12-05 01:21:59 +00001310ClangASTContext::GetTypeForDecl (clang::NamedDecl *decl)
1311{
1312 if (clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
1313 return GetTypeForDecl(interface_decl);
1314 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
1315 return GetTypeForDecl(tag_decl);
Greg Claytona1e5dc82015-08-11 22:53:00 +00001316 return CompilerType();
Sean Callanan9998acd2014-12-05 01:21:59 +00001317}
1318
Greg Clayton6beaaa62011-01-17 03:46:26 +00001319
Greg Claytona1e5dc82015-08-11 22:53:00 +00001320CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001321ClangASTContext::GetTypeForDecl (TagDecl *decl)
1322{
1323 // No need to call the getASTContext() accessor (which can create the AST
1324 // if it isn't created yet, because we can't have created a decl in this
1325 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001326 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001327 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001328 return CompilerType (ast, ast->getTagDeclType(decl));
1329 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001330}
1331
Greg Claytona1e5dc82015-08-11 22:53:00 +00001332CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001333ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1334{
1335 // No need to call the getASTContext() accessor (which can create the AST
1336 // if it isn't created yet, because we can't have created a decl in this
1337 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001338 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001339 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001340 return CompilerType (ast, ast->getObjCInterfaceType(decl));
1341 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001342}
1343
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001344#pragma mark Structure, Unions, Classes
1345
Greg Claytona1e5dc82015-08-11 22:53:00 +00001346CompilerType
Greg Claytonc4ffd662013-03-08 01:37:30 +00001347ClangASTContext::CreateRecordType (DeclContext *decl_ctx,
1348 AccessType access_type,
1349 const char *name,
1350 int kind,
1351 LanguageType language,
1352 ClangASTMetadata *metadata)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001353{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001354 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001355 assert (ast != nullptr);
Sean Callananad880762012-04-18 01:06:17 +00001356
Ed Masted4612ad2014-04-20 13:17:36 +00001357 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001358 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001359
Greg Clayton9e409562010-07-28 02:04:09 +00001360
Greg Claytone1be9962011-08-24 23:50:00 +00001361 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001362 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001363 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001364 bool isInternal = false;
Sean Callananad880762012-04-18 01:06:17 +00001365 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
Greg Clayton9e409562010-07-28 02:04:09 +00001366 }
1367
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001368 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1369 // we will need to update this code. I was told to currently always use
1370 // the CXXRecordDecl class since we often don't know from debug information
1371 // if something is struct or a class, so we default to always use the more
1372 // complete definition just in case.
Sean Callanan11e32d32014-02-18 00:31:38 +00001373
1374 bool is_anonymous = (!name) || (!name[0]);
1375
Greg Claytonf0705c82011-10-22 03:33:13 +00001376 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1377 (TagDecl::TagKind)kind,
1378 decl_ctx,
1379 SourceLocation(),
1380 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001381 is_anonymous ? nullptr : &ast->Idents.get(name));
Sean Callanan11e32d32014-02-18 00:31:38 +00001382
1383 if (is_anonymous)
1384 decl->setAnonymousStructOrUnion(true);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001385
Greg Claytonc4ffd662013-03-08 01:37:30 +00001386 if (decl)
Greg Clayton55561e92011-10-26 03:31:36 +00001387 {
Greg Claytonc4ffd662013-03-08 01:37:30 +00001388 if (metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001389 SetMetadata(ast, decl, *metadata);
Greg Claytonc4ffd662013-03-08 01:37:30 +00001390
Greg Clayton55561e92011-10-26 03:31:36 +00001391 if (access_type != eAccessNone)
1392 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Claytonc4ffd662013-03-08 01:37:30 +00001393
1394 if (decl_ctx)
1395 decl_ctx->addDecl (decl);
1396
Greg Claytona1e5dc82015-08-11 22:53:00 +00001397 return CompilerType(ast, ast->getTagDeclType(decl));
Greg Clayton55561e92011-10-26 03:31:36 +00001398 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001399 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001400}
1401
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001402static TemplateParameterList *
1403CreateTemplateParameterList (ASTContext *ast,
Sean Callanan3d654b32012-09-24 22:25:51 +00001404 const ClangASTContext::TemplateParameterInfos &template_param_infos,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001405 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1406{
1407 const bool parameter_pack = false;
1408 const bool is_typename = false;
1409 const unsigned depth = 0;
1410 const size_t num_template_params = template_param_infos.GetSize();
1411 for (size_t i=0; i<num_template_params; ++i)
1412 {
1413 const char *name = template_param_infos.names[i];
Greg Clayton283b2652013-04-23 22:38:02 +00001414
Ed Masted4612ad2014-04-20 13:17:36 +00001415 IdentifierInfo *identifier_info = nullptr;
Greg Clayton283b2652013-04-23 22:38:02 +00001416 if (name && name[0])
1417 identifier_info = &ast->Idents.get(name);
Sean Callanan3d654b32012-09-24 22:25:51 +00001418 if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001419 {
1420 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1421 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1422 SourceLocation(),
1423 SourceLocation(),
1424 depth,
1425 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001426 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001427 template_param_infos.args[i].getIntegralType(),
1428 parameter_pack,
Ed Masted4612ad2014-04-20 13:17:36 +00001429 nullptr));
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001430
1431 }
1432 else
1433 {
1434 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1435 ast->getTranslationUnitDecl(), // Is this the right decl context?
1436 SourceLocation(),
1437 SourceLocation(),
1438 depth,
1439 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001440 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001441 is_typename,
1442 parameter_pack));
1443 }
1444 }
1445
1446 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1447 SourceLocation(),
1448 SourceLocation(),
1449 &template_param_decls.front(),
1450 template_param_decls.size(),
1451 SourceLocation());
1452 return template_param_list;
1453}
1454
1455clang::FunctionTemplateDecl *
1456ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1457 clang::FunctionDecl *func_decl,
1458 const char *name,
1459 const TemplateParameterInfos &template_param_infos)
1460{
1461// /// \brief Create a function template node.
1462 ASTContext *ast = getASTContext();
1463
1464 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1465
1466 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1467 template_param_infos,
1468 template_param_decls);
1469 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1470 decl_ctx,
1471 func_decl->getLocation(),
1472 func_decl->getDeclName(),
1473 template_param_list,
1474 func_decl);
1475
1476 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1477 i < template_param_decl_count;
1478 ++i)
1479 {
1480 // TODO: verify which decl context we should put template_param_decls into..
1481 template_param_decls[i]->setDeclContext (func_decl);
1482 }
1483
1484 return func_tmpl_decl;
1485}
1486
1487void
1488ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1489 clang::FunctionTemplateDecl *func_tmpl_decl,
1490 const TemplateParameterInfos &infos)
1491{
1492 TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1493 infos.args.data(),
1494 infos.args.size());
1495
1496 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1497 &template_args,
Ed Masted4612ad2014-04-20 13:17:36 +00001498 nullptr);
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001499}
1500
1501
Greg Claytonf0705c82011-10-22 03:33:13 +00001502ClassTemplateDecl *
1503ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001504 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001505 const char *class_name,
1506 int kind,
1507 const TemplateParameterInfos &template_param_infos)
1508{
1509 ASTContext *ast = getASTContext();
1510
Ed Masted4612ad2014-04-20 13:17:36 +00001511 ClassTemplateDecl *class_template_decl = nullptr;
1512 if (decl_ctx == nullptr)
Greg Claytonf0705c82011-10-22 03:33:13 +00001513 decl_ctx = ast->getTranslationUnitDecl();
1514
1515 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1516 DeclarationName decl_name (&identifier_info);
1517
1518 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001519
1520 for (NamedDecl *decl : result)
Greg Claytonf0705c82011-10-22 03:33:13 +00001521 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001522 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
Greg Claytonf0705c82011-10-22 03:33:13 +00001523 if (class_template_decl)
1524 return class_template_decl;
1525 }
1526
1527 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf0705c82011-10-22 03:33:13 +00001528
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001529 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1530 template_param_infos,
1531 template_param_decls);
Greg Claytonf0705c82011-10-22 03:33:13 +00001532
1533 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1534 (TagDecl::TagKind)kind,
1535 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1536 SourceLocation(),
1537 SourceLocation(),
1538 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001539
1540 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1541 i < template_param_decl_count;
1542 ++i)
1543 {
1544 template_param_decls[i]->setDeclContext (template_cxx_decl);
1545 }
1546
Sean Callananb5c79622011-11-19 01:35:08 +00001547 // With templated classes, we say that a class is templated with
1548 // specializations, but that the bare class has no functions.
Sean Callananfa4fab72013-02-01 06:55:48 +00001549 //template_cxx_decl->startDefinition();
1550 //template_cxx_decl->completeDefinition();
Sean Callananb5c79622011-11-19 01:35:08 +00001551
Greg Claytonf0705c82011-10-22 03:33:13 +00001552 class_template_decl = ClassTemplateDecl::Create (*ast,
1553 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1554 SourceLocation(),
1555 decl_name,
1556 template_param_list,
1557 template_cxx_decl,
Ed Masted4612ad2014-04-20 13:17:36 +00001558 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001559
1560 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001561 {
Greg Clayton55561e92011-10-26 03:31:36 +00001562 if (access_type != eAccessNone)
1563 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan5b26f272012-02-04 08:49:35 +00001564
1565 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1566 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1567
Greg Claytonf0705c82011-10-22 03:33:13 +00001568 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001569
1570#ifdef LLDB_CONFIGURATION_DEBUG
1571 VerifyDecl(class_template_decl);
1572#endif
1573 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001574
1575 return class_template_decl;
1576}
1577
1578
1579ClassTemplateSpecializationDecl *
1580ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1581 ClassTemplateDecl *class_template_decl,
1582 int kind,
1583 const TemplateParameterInfos &template_param_infos)
1584{
1585 ASTContext *ast = getASTContext();
1586 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1587 (TagDecl::TagKind)kind,
1588 decl_ctx,
1589 SourceLocation(),
1590 SourceLocation(),
1591 class_template_decl,
1592 &template_param_infos.args.front(),
1593 template_param_infos.args.size(),
Ed Masted4612ad2014-04-20 13:17:36 +00001594 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001595
Sean Callananfa4fab72013-02-01 06:55:48 +00001596 class_template_specialization_decl->setSpecializationKind(TSK_ExplicitSpecialization);
1597
Greg Claytonf0705c82011-10-22 03:33:13 +00001598 return class_template_specialization_decl;
1599}
1600
Greg Claytona1e5dc82015-08-11 22:53:00 +00001601CompilerType
Greg Claytonf0705c82011-10-22 03:33:13 +00001602ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1603{
1604 if (class_template_specialization_decl)
1605 {
1606 ASTContext *ast = getASTContext();
1607 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001608 return CompilerType(ast, ast->getTagDeclType(class_template_specialization_decl));
Greg Claytonf0705c82011-10-22 03:33:13 +00001609 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001610 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001611}
1612
Greg Clayton090d0982011-06-19 03:43:27 +00001613static inline bool
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001614check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001615{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001616 // Special-case call since it can take any number of operands
1617 if(op_kind == OO_Call)
1618 return true;
1619
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001620 // The parameter count doesn't include "this"
Greg Clayton090d0982011-06-19 03:43:27 +00001621 if (num_params == 0)
1622 return unary;
1623 if (num_params == 1)
1624 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001625 else
Greg Clayton090d0982011-06-19 03:43:27 +00001626 return false;
1627}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001628
Greg Clayton090d0982011-06-19 03:43:27 +00001629bool
1630ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
1631{
Sean Callanan5b26f272012-02-04 08:49:35 +00001632 switch (op_kind)
1633 {
1634 default:
1635 break;
1636 // C++ standard allows any number of arguments to new/delete
1637 case OO_New:
1638 case OO_Array_New:
1639 case OO_Delete:
1640 case OO_Array_Delete:
1641 return true;
1642 }
1643
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001644#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 +00001645 switch (op_kind)
1646 {
1647#include "clang/Basic/OperatorKinds.def"
1648 default: break;
1649 }
1650 return false;
1651}
1652
Greg Clayton57ee3062013-07-11 22:46:58 +00001653clang::AccessSpecifier
1654ClangASTContext::UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs)
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001655{
1656 clang::AccessSpecifier ret = lhs;
1657
1658 // Make the access equal to the stricter of the field and the nested field's access
1659 switch (ret)
1660 {
1661 case clang::AS_none:
1662 break;
1663 case clang::AS_private:
1664 break;
1665 case clang::AS_protected:
1666 if (rhs == AS_private)
1667 ret = AS_private;
1668 break;
1669 case clang::AS_public:
1670 ret = rhs;
1671 break;
1672 }
1673
1674 return ret;
1675}
1676
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001677bool
1678ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1679{
1680 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1681}
1682
1683bool
1684ClangASTContext::FieldIsBitfield
1685(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001686 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001687 FieldDecl* field,
1688 uint32_t& bitfield_bit_size
1689)
1690{
Ed Masted4612ad2014-04-20 13:17:36 +00001691 if (ast == nullptr || field == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001692 return false;
1693
1694 if (field->isBitField())
1695 {
1696 Expr* bit_width_expr = field->getBitWidth();
1697 if (bit_width_expr)
1698 {
1699 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001700 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001701 {
1702 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1703 return true;
1704 }
1705 }
1706 }
1707 return false;
1708}
1709
1710bool
1711ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1712{
Ed Masted4612ad2014-04-20 13:17:36 +00001713 if (record_decl == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001714 return false;
1715
1716 if (!record_decl->field_empty())
1717 return true;
1718
1719 // No fields, lets check this is a CXX record and check the base classes
1720 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1721 if (cxx_record_decl)
1722 {
1723 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1724 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1725 base_class != base_class_end;
1726 ++base_class)
1727 {
1728 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1729 if (RecordHasFields(base_class_decl))
1730 return true;
1731 }
1732 }
1733 return false;
1734}
1735
Greg Clayton8cf05932010-07-22 18:30:50 +00001736#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001737
Greg Claytona1e5dc82015-08-11 22:53:00 +00001738CompilerType
Sean Callananad880762012-04-18 01:06:17 +00001739ClangASTContext::CreateObjCClass
Greg Clayton8cf05932010-07-22 18:30:50 +00001740(
1741 const char *name,
1742 DeclContext *decl_ctx,
1743 bool isForwardDecl,
Sean Callananad880762012-04-18 01:06:17 +00001744 bool isInternal,
Jim Ingham379397632012-10-27 02:54:13 +00001745 ClangASTMetadata *metadata
Greg Clayton8cf05932010-07-22 18:30:50 +00001746)
1747{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001748 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001749 assert (ast != nullptr);
Greg Clayton8cf05932010-07-22 18:30:50 +00001750 assert (name && name[0]);
Ed Masted4612ad2014-04-20 13:17:36 +00001751 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001752 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00001753
Greg Clayton6beaaa62011-01-17 03:46:26 +00001754 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001755 decl_ctx,
1756 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001757 &ast->Idents.get(name),
Ed Masted4612ad2014-04-20 13:17:36 +00001758 nullptr,
Pavel Labath67add942015-07-07 10:11:16 +00001759 nullptr,
Greg Clayton8cf05932010-07-22 18:30:50 +00001760 SourceLocation(),
Sean Callanan5b26f272012-02-04 08:49:35 +00001761 /*isForwardDecl,*/
Greg Clayton8cf05932010-07-22 18:30:50 +00001762 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00001763
Jim Ingham379397632012-10-27 02:54:13 +00001764 if (decl && metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001765 SetMetadata(ast, decl, *metadata);
Sean Callananad880762012-04-18 01:06:17 +00001766
Greg Claytona1e5dc82015-08-11 22:53:00 +00001767 return CompilerType (ast, ast->getObjCInterfaceType(decl));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001768}
1769
1770static inline bool
1771BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
1772{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001773 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001774}
1775
Greg Clayton57ee3062013-07-11 22:46:58 +00001776uint32_t
1777ClangASTContext::GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001778{
1779 uint32_t num_bases = 0;
1780 if (cxx_record_decl)
1781 {
1782 if (omit_empty_base_classes)
1783 {
1784 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1785 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1786 base_class != base_class_end;
1787 ++base_class)
1788 {
1789 // Skip empty base classes
1790 if (omit_empty_base_classes)
1791 {
1792 if (BaseSpecifierIsEmpty (base_class))
1793 continue;
1794 }
1795 ++num_bases;
1796 }
1797 }
1798 else
1799 num_bases = cxx_record_decl->getNumBases();
1800 }
1801 return num_bases;
1802}
1803
1804
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001805#pragma mark Namespace Declarations
1806
1807NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00001808ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001809{
Ed Masted4612ad2014-04-20 13:17:36 +00001810 NamespaceDecl *namespace_decl = nullptr;
Greg Clayton9d3d6882011-10-31 23:51:19 +00001811 ASTContext *ast = getASTContext();
1812 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
Ed Masted4612ad2014-04-20 13:17:36 +00001813 if (decl_ctx == nullptr)
Greg Clayton9d3d6882011-10-31 23:51:19 +00001814 decl_ctx = translation_unit_decl;
1815
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001816 if (name)
1817 {
Greg Clayton030a2042011-10-14 21:34:45 +00001818 IdentifierInfo &identifier_info = ast->Idents.get(name);
1819 DeclarationName decl_name (&identifier_info);
1820 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001821 for (NamedDecl *decl : result)
Greg Clayton030a2042011-10-14 21:34:45 +00001822 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001823 namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
Greg Clayton030a2042011-10-14 21:34:45 +00001824 if (namespace_decl)
1825 return namespace_decl;
1826 }
1827
Sean Callanan5b26f272012-02-04 08:49:35 +00001828 namespace_decl = NamespaceDecl::Create(*ast,
1829 decl_ctx,
1830 false,
1831 SourceLocation(),
1832 SourceLocation(),
1833 &identifier_info,
Ed Masted4612ad2014-04-20 13:17:36 +00001834 nullptr);
Greg Clayton030a2042011-10-14 21:34:45 +00001835
Greg Clayton9d3d6882011-10-31 23:51:19 +00001836 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001837 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001838 else
1839 {
1840 if (decl_ctx == translation_unit_decl)
1841 {
1842 namespace_decl = translation_unit_decl->getAnonymousNamespace();
1843 if (namespace_decl)
1844 return namespace_decl;
1845
Sean Callanan5b26f272012-02-04 08:49:35 +00001846 namespace_decl = NamespaceDecl::Create(*ast,
1847 decl_ctx,
1848 false,
1849 SourceLocation(),
1850 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001851 nullptr,
1852 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001853 translation_unit_decl->setAnonymousNamespace (namespace_decl);
1854 translation_unit_decl->addDecl (namespace_decl);
1855 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
1856 }
1857 else
1858 {
1859 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
1860 if (parent_namespace_decl)
1861 {
1862 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
1863 if (namespace_decl)
1864 return namespace_decl;
Sean Callanan5b26f272012-02-04 08:49:35 +00001865 namespace_decl = NamespaceDecl::Create(*ast,
1866 decl_ctx,
1867 false,
1868 SourceLocation(),
1869 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001870 nullptr,
1871 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001872 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
1873 parent_namespace_decl->addDecl (namespace_decl);
1874 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
1875 }
1876 else
1877 {
1878 // BAD!!!
1879 }
1880 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001881 }
1882#ifdef LLDB_CONFIGURATION_DEBUG
1883 VerifyDecl(namespace_decl);
1884#endif
Greg Clayton030a2042011-10-14 21:34:45 +00001885 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001886}
1887
1888
Paul Hermand628cbb2015-09-15 23:44:17 +00001889clang::BlockDecl *
1890ClangASTContext::CreateBlockDeclaration (clang::DeclContext *ctx)
1891{
1892 if (ctx != nullptr)
1893 {
1894 clang::BlockDecl *decl = clang::BlockDecl::Create(*getASTContext(), ctx, clang::SourceLocation());
1895 ctx->addDecl(decl);
1896 return decl;
1897 }
1898 return nullptr;
1899}
1900
Paul Hermanea188fc2015-09-16 18:48:30 +00001901clang::DeclContext *
1902FindLCABetweenDecls(clang::DeclContext *left, clang::DeclContext *right, clang::DeclContext *root)
1903{
1904 if (root == nullptr)
1905 return nullptr;
1906
1907 std::set<clang::DeclContext *> path_left;
1908 for (clang::DeclContext *d = left; d != nullptr; d = d->getParent())
1909 path_left.insert(d);
1910
1911 for (clang::DeclContext *d = right; d != nullptr; d = d->getParent())
1912 if (path_left.find(d) != path_left.end())
1913 return d;
1914
1915 return nullptr;
1916}
1917
Paul Hermand628cbb2015-09-15 23:44:17 +00001918clang::UsingDirectiveDecl *
1919ClangASTContext::CreateUsingDirectiveDeclaration (clang::DeclContext *decl_ctx, clang::NamespaceDecl *ns_decl)
1920{
1921 if (decl_ctx != nullptr && ns_decl != nullptr)
1922 {
Paul Hermanea188fc2015-09-16 18:48:30 +00001923 clang::TranslationUnitDecl *translation_unit = (clang::TranslationUnitDecl *)GetTranslationUnitDecl(getASTContext());
Paul Hermand628cbb2015-09-15 23:44:17 +00001924 clang::UsingDirectiveDecl *using_decl = clang::UsingDirectiveDecl::Create(*getASTContext(),
1925 decl_ctx,
1926 clang::SourceLocation(),
1927 clang::SourceLocation(),
1928 clang::NestedNameSpecifierLoc(),
1929 clang::SourceLocation(),
1930 ns_decl,
Paul Hermanea188fc2015-09-16 18:48:30 +00001931 FindLCABetweenDecls(decl_ctx, ns_decl, translation_unit));
Paul Hermand628cbb2015-09-15 23:44:17 +00001932 decl_ctx->addDecl(using_decl);
1933 return using_decl;
1934 }
1935 return nullptr;
1936}
1937
1938clang::UsingDecl *
1939ClangASTContext::CreateUsingDeclaration (clang::DeclContext *current_decl_ctx, clang::NamedDecl *target)
1940{
1941 if (current_decl_ctx != nullptr && target != nullptr)
1942 {
1943 clang::UsingDecl *using_decl = clang::UsingDecl::Create(*getASTContext(),
1944 current_decl_ctx,
1945 clang::SourceLocation(),
1946 clang::NestedNameSpecifierLoc(),
1947 clang::DeclarationNameInfo(),
1948 false);
1949 clang::UsingShadowDecl *shadow_decl = clang::UsingShadowDecl::Create(*getASTContext(),
1950 current_decl_ctx,
1951 clang::SourceLocation(),
1952 using_decl,
1953 target);
1954 using_decl->addShadowDecl(shadow_decl);
1955 current_decl_ctx->addDecl(using_decl);
1956 return using_decl;
1957 }
1958 return nullptr;
1959}
1960
1961clang::VarDecl *
1962ClangASTContext::CreateVariableDeclaration (clang::DeclContext *decl_context, const char *name, clang::QualType type)
1963{
1964 if (decl_context != nullptr)
1965 {
1966 clang::VarDecl *var_decl = clang::VarDecl::Create(*getASTContext(),
1967 decl_context,
1968 clang::SourceLocation(),
1969 clang::SourceLocation(),
1970 name && name[0] ? &getASTContext()->Idents.getOwn(name) : nullptr,
1971 type,
1972 nullptr,
1973 clang::SC_None);
1974 var_decl->setAccess(clang::AS_public);
1975 decl_context->addDecl(var_decl);
Paul Hermand628cbb2015-09-15 23:44:17 +00001976 return var_decl;
1977 }
1978 return nullptr;
1979}
1980
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001981#pragma mark Function Types
1982
1983FunctionDecl *
Greg Clayton57ee3062013-07-11 22:46:58 +00001984ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx,
1985 const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00001986 const CompilerType &function_clang_type,
Greg Clayton57ee3062013-07-11 22:46:58 +00001987 int storage,
1988 bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001989{
Ed Masted4612ad2014-04-20 13:17:36 +00001990 FunctionDecl *func_decl = nullptr;
Greg Clayton147e1fa2011-10-14 22:47:18 +00001991 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001992 if (decl_ctx == nullptr)
Greg Clayton147e1fa2011-10-14 22:47:18 +00001993 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001994
Greg Clayton0d551042013-06-28 21:08:47 +00001995
1996 const bool hasWrittenPrototype = true;
1997 const bool isConstexprSpecified = false;
1998
Greg Clayton147e1fa2011-10-14 22:47:18 +00001999 if (name && name[0])
2000 {
2001 func_decl = FunctionDecl::Create (*ast,
2002 decl_ctx,
2003 SourceLocation(),
2004 SourceLocation(),
2005 DeclarationName (&ast->Idents.get(name)),
Greg Claytond8d4a572015-08-11 21:38:15 +00002006 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00002007 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00002008 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00002009 is_inline,
2010 hasWrittenPrototype,
2011 isConstexprSpecified);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002012 }
Greg Clayton147e1fa2011-10-14 22:47:18 +00002013 else
2014 {
2015 func_decl = FunctionDecl::Create (*ast,
2016 decl_ctx,
2017 SourceLocation(),
2018 SourceLocation(),
2019 DeclarationName (),
Greg Claytond8d4a572015-08-11 21:38:15 +00002020 GetQualType(function_clang_type),
Ed Masted4612ad2014-04-20 13:17:36 +00002021 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00002022 (clang::StorageClass)storage,
Greg Clayton0d551042013-06-28 21:08:47 +00002023 is_inline,
2024 hasWrittenPrototype,
2025 isConstexprSpecified);
Greg Clayton147e1fa2011-10-14 22:47:18 +00002026 }
2027 if (func_decl)
2028 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00002029
2030#ifdef LLDB_CONFIGURATION_DEBUG
2031 VerifyDecl(func_decl);
2032#endif
2033
Greg Clayton147e1fa2011-10-14 22:47:18 +00002034 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002035}
2036
Greg Claytona1e5dc82015-08-11 22:53:00 +00002037CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00002038ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002039 const CompilerType& result_type,
2040 const CompilerType *args,
Sean Callananc81256a2010-09-16 20:40:25 +00002041 unsigned num_args,
2042 bool is_variadic,
2043 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002044{
Ed Masted4612ad2014-04-20 13:17:36 +00002045 assert (ast != nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002046 std::vector<QualType> qual_type_args;
2047 for (unsigned i=0; i<num_args; ++i)
Greg Claytond8d4a572015-08-11 21:38:15 +00002048 qual_type_args.push_back (GetQualType(args[i]));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002049
2050 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00002051 FunctionProtoType::ExtProtoInfo proto_info;
2052 proto_info.Variadic = is_variadic;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00002053 proto_info.ExceptionSpec = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00002054 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00002055 proto_info.RefQualifier = RQ_None;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00002056
Greg Claytona1e5dc82015-08-11 22:53:00 +00002057 return CompilerType (ast, ast->getFunctionType (GetQualType(result_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00002058 qual_type_args,
Greg Claytond8d4a572015-08-11 21:38:15 +00002059 proto_info));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002060}
2061
2062ParmVarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00002063ClangASTContext::CreateParameterDeclaration (const char *name, const CompilerType &param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002064{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002065 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002066 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00002067 return ParmVarDecl::Create(*ast,
2068 ast->getTranslationUnitDecl(),
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002069 SourceLocation(),
Sean Callananfb0b7582011-03-15 00:17:19 +00002070 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00002071 name && name[0] ? &ast->Idents.get(name) : nullptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00002072 GetQualType(param_type),
Ed Masted4612ad2014-04-20 13:17:36 +00002073 nullptr,
Shawn Best3ab672d2014-10-31 23:20:13 +00002074 (clang::StorageClass)storage,
Ed Masted4612ad2014-04-20 13:17:36 +00002075 nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002076}
2077
2078void
2079ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
2080{
2081 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00002082 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002083}
2084
2085
2086#pragma mark Array Types
2087
Greg Claytona1e5dc82015-08-11 22:53:00 +00002088CompilerType
2089ClangASTContext::CreateArrayType (const CompilerType &element_type,
Greg Clayton1c8ef472013-04-05 23:27:21 +00002090 size_t element_count,
2091 bool is_vector)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002092{
Greg Clayton57ee3062013-07-11 22:46:58 +00002093 if (element_type.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002094 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002095 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002096 assert (ast != nullptr);
Greg Clayton4ef877f2012-12-06 02:33:54 +00002097
Greg Clayton1c8ef472013-04-05 23:27:21 +00002098 if (is_vector)
2099 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00002100 return CompilerType (ast, ast->getExtVectorType(GetQualType(element_type), element_count));
Greg Clayton4ef877f2012-12-06 02:33:54 +00002101 }
2102 else
2103 {
Greg Clayton1c8ef472013-04-05 23:27:21 +00002104
2105 llvm::APInt ap_element_count (64, element_count);
2106 if (element_count == 0)
2107 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00002108 return CompilerType (ast, ast->getIncompleteArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00002109 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00002110 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00002111 }
2112 else
2113 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00002114 return CompilerType (ast, ast->getConstantArrayType (GetQualType(element_type),
Greg Clayton57ee3062013-07-11 22:46:58 +00002115 ap_element_count,
2116 ArrayType::Normal,
Greg Claytond8d4a572015-08-11 21:38:15 +00002117 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00002118 }
Greg Clayton4ef877f2012-12-06 02:33:54 +00002119 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002120 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002121 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002122}
2123
Greg Claytona1e5dc82015-08-11 22:53:00 +00002124CompilerType
Enrico Granata76b08d52014-10-29 23:08:02 +00002125ClangASTContext::GetOrCreateStructForIdentifier (const ConstString &type_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002126 const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields,
Enrico Granataa449e862014-10-30 00:53:28 +00002127 bool packed)
Enrico Granata76b08d52014-10-29 23:08:02 +00002128{
Greg Claytona1e5dc82015-08-11 22:53:00 +00002129 CompilerType type;
Enrico Granata76b08d52014-10-29 23:08:02 +00002130 if ((type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
2131 return type;
2132 type = CreateRecordType(nullptr, lldb::eAccessPublic, type_name.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC);
Greg Claytond8d4a572015-08-11 21:38:15 +00002133 StartTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00002134 for (const auto& field : type_fields)
Greg Claytond8d4a572015-08-11 21:38:15 +00002135 AddFieldToRecordType(type, field.first, field.second, lldb::eAccessPublic, 0);
Enrico Granataa449e862014-10-30 00:53:28 +00002136 if (packed)
Greg Claytond8d4a572015-08-11 21:38:15 +00002137 SetIsPacked(type);
2138 CompleteTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00002139 return type;
2140}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002141
2142#pragma mark Enumeration Types
2143
Greg Claytona1e5dc82015-08-11 22:53:00 +00002144CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00002145ClangASTContext::CreateEnumerationType
Greg Claytonca512b32011-01-14 04:54:56 +00002146(
Greg Claytond8d4a572015-08-11 21:38:15 +00002147 const char *name,
2148 DeclContext *decl_ctx,
2149 const Declaration &decl,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002150 const CompilerType &integer_clang_type
Greg Claytond8d4a572015-08-11 21:38:15 +00002151 )
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002152{
2153 // TODO: Do something intelligent with the Declaration object passed in
2154 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00002155 ASTContext *ast = getASTContext();
Greg Claytond8d4a572015-08-11 21:38:15 +00002156
Greg Claytone02b8502010-10-12 04:29:14 +00002157 // TODO: ask about these...
Greg Claytond8d4a572015-08-11 21:38:15 +00002158 // const bool IsScoped = false;
2159 // const bool IsFixed = false;
2160
Greg Clayton6beaaa62011-01-17 03:46:26 +00002161 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00002162 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00002163 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00002164 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00002165 name && name[0] ? &ast->Idents.get(name) : nullptr,
2166 nullptr,
Sean Callanan48114472010-12-13 01:26:27 +00002167 false, // IsScoped
2168 false, // IsScopedUsingClassTag
2169 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00002170
2171
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002172 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00002173 {
2174 // TODO: check if we should be setting the promotion type too?
Greg Claytond8d4a572015-08-11 21:38:15 +00002175 enum_decl->setIntegerType(GetQualType(integer_clang_type));
Sean Callanan2652ad22011-01-18 01:03:44 +00002176
2177 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
2178
Greg Claytona1e5dc82015-08-11 22:53:00 +00002179 return CompilerType (ast, ast->getTagDeclType(enum_decl));
Greg Clayton83ff3892010-09-12 23:17:56 +00002180 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002181 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002182}
2183
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002184// Disable this for now since I can't seem to get a nicely formatted float
2185// out of the APFloat class without just getting the float, double or quad
2186// and then using a formatted print on it which defeats the purpose. We ideally
2187// would like to get perfect string values for any kind of float semantics
2188// so we can support remote targets. The code below also requires a patch to
2189// llvm::APInt.
2190//bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002191//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 +00002192//{
2193// uint32_t count = 0;
2194// bool is_complex = false;
2195// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
2196// {
2197// unsigned num_bytes_per_float = byte_size / count;
2198// unsigned num_bits_per_float = num_bytes_per_float * 8;
2199//
2200// float_str.clear();
2201// uint32_t i;
2202// for (i=0; i<count; i++)
2203// {
2204// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
2205// bool is_ieee = false;
2206// APFloat ap_float(ap_int, is_ieee);
2207// char s[1024];
2208// unsigned int hex_digits = 0;
2209// bool upper_case = false;
2210//
2211// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
2212// {
2213// if (i > 0)
2214// float_str.append(", ");
2215// float_str.append(s);
2216// if (i == 1 && is_complex)
2217// float_str.append(1, 'i');
2218// }
2219// }
2220// return !float_str.empty();
2221// }
2222// return false;
2223//}
2224
Greg Claytona1e5dc82015-08-11 22:53:00 +00002225CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002226ClangASTContext::GetIntTypeFromBitSize (clang::ASTContext *ast,
2227 size_t bit_size, bool is_signed)
2228{
2229 if (ast)
2230 {
2231 if (is_signed)
2232 {
2233 if (bit_size == ast->getTypeSize(ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002234 return CompilerType(ast, ast->SignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002235
2236 if (bit_size == ast->getTypeSize(ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002237 return CompilerType(ast, ast->ShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002238
2239 if (bit_size == ast->getTypeSize(ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002240 return CompilerType(ast, ast->IntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002241
2242 if (bit_size == ast->getTypeSize(ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002243 return CompilerType(ast, ast->LongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002244
2245 if (bit_size == ast->getTypeSize(ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002246 return CompilerType(ast, ast->LongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002247
2248 if (bit_size == ast->getTypeSize(ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002249 return CompilerType(ast, ast->Int128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002250 }
2251 else
2252 {
2253 if (bit_size == ast->getTypeSize(ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002254 return CompilerType(ast, ast->UnsignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002255
2256 if (bit_size == ast->getTypeSize(ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002257 return CompilerType(ast, ast->UnsignedShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002258
2259 if (bit_size == ast->getTypeSize(ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002260 return CompilerType(ast, ast->UnsignedIntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002261
2262 if (bit_size == ast->getTypeSize(ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002263 return CompilerType(ast, ast->UnsignedLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002264
2265 if (bit_size == ast->getTypeSize(ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002266 return CompilerType(ast, ast->UnsignedLongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002267
2268 if (bit_size == ast->getTypeSize(ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002269 return CompilerType(ast, ast->UnsignedInt128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002270 }
2271 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002272 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002273}
2274
Greg Claytona1e5dc82015-08-11 22:53:00 +00002275CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002276ClangASTContext::GetPointerSizedIntType (clang::ASTContext *ast, bool is_signed)
2277{
2278 if (ast)
2279 return GetIntTypeFromBitSize(ast, ast->getTypeSize(ast->VoidPtrTy), is_signed);
Greg Claytona1e5dc82015-08-11 22:53:00 +00002280 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002281}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002282
Greg Claytone6b36cd2015-12-08 01:02:08 +00002283void
2284ClangASTContext::DumpDeclContextHiearchy (clang::DeclContext *decl_ctx)
2285{
2286 if (decl_ctx)
2287 {
2288 DumpDeclContextHiearchy (decl_ctx->getParent());
2289
2290 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl_ctx);
2291 if (named_decl)
2292 {
2293 printf ("%20s: %s\n", decl_ctx->getDeclKindName(), named_decl->getDeclName().getAsString().c_str());
2294 }
2295 else
2296 {
2297 printf ("%20s\n", decl_ctx->getDeclKindName());
2298 }
2299 }
2300}
2301
2302void
2303ClangASTContext::DumpDeclHiearchy (clang::Decl *decl)
2304{
2305 if (decl == nullptr)
2306 return;
2307 DumpDeclContextHiearchy(decl->getDeclContext());
2308
2309 clang::RecordDecl *record_decl = llvm::dyn_cast<clang::RecordDecl>(decl);
2310 if (record_decl)
2311 {
2312 printf ("%20s: %s%s\n", decl->getDeclKindName(), record_decl->getDeclName().getAsString().c_str(), record_decl->isInjectedClassName() ? " (injected class name)" : "");
2313
2314 }
2315 else
2316 {
2317 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl);
2318 if (named_decl)
2319 {
2320 printf ("%20s: %s\n", decl->getDeclKindName(), named_decl->getDeclName().getAsString().c_str());
2321 }
2322 else
2323 {
2324 printf ("%20s\n", decl->getDeclKindName());
2325 }
2326 }
2327}
2328
2329bool
2330ClangASTContext::DeclsAreEquivalent (clang::Decl *lhs_decl, clang::Decl *rhs_decl)
2331{
2332 if (lhs_decl && rhs_decl)
2333 {
2334 //----------------------------------------------------------------------
2335 // Make sure the decl kinds match first
2336 //----------------------------------------------------------------------
2337 const clang::Decl::Kind lhs_decl_kind = lhs_decl->getKind();
2338 const clang::Decl::Kind rhs_decl_kind = rhs_decl->getKind();
2339
2340 if (lhs_decl_kind == rhs_decl_kind)
2341 {
2342 //------------------------------------------------------------------
2343 // Now check that the decl contexts kinds are all equivalent
2344 // before we have to check any names of the decl contexts...
2345 //------------------------------------------------------------------
2346 clang::DeclContext *lhs_decl_ctx = lhs_decl->getDeclContext();
2347 clang::DeclContext *rhs_decl_ctx = rhs_decl->getDeclContext();
2348 if (lhs_decl_ctx && rhs_decl_ctx)
2349 {
2350 while (1)
2351 {
2352 if (lhs_decl_ctx && rhs_decl_ctx)
2353 {
2354 const clang::Decl::Kind lhs_decl_ctx_kind = lhs_decl_ctx->getDeclKind();
2355 const clang::Decl::Kind rhs_decl_ctx_kind = rhs_decl_ctx->getDeclKind();
2356 if (lhs_decl_ctx_kind == rhs_decl_ctx_kind)
2357 {
2358 lhs_decl_ctx = lhs_decl_ctx->getParent();
2359 rhs_decl_ctx = rhs_decl_ctx->getParent();
2360
2361 if (lhs_decl_ctx == nullptr && rhs_decl_ctx == nullptr)
2362 break;
2363 }
2364 else
2365 return false;
2366 }
2367 else
2368 return false;
2369 }
2370
2371 //--------------------------------------------------------------
2372 // Now make sure the name of the decls match
2373 //--------------------------------------------------------------
2374 clang::NamedDecl *lhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(lhs_decl);
2375 clang::NamedDecl *rhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(rhs_decl);
2376 if (lhs_named_decl && rhs_named_decl)
2377 {
2378 clang::DeclarationName lhs_decl_name = lhs_named_decl->getDeclName();
2379 clang::DeclarationName rhs_decl_name = rhs_named_decl->getDeclName();
2380 if (lhs_decl_name.getNameKind() == rhs_decl_name.getNameKind())
2381 {
2382 if (lhs_decl_name.getAsString() != rhs_decl_name.getAsString())
2383 return false;
2384 }
2385 else
2386 return false;
2387 }
2388 else
2389 return false;
2390
2391 //--------------------------------------------------------------
2392 // We know that the decl context kinds all match, so now we need
2393 // to make sure the names match as well
2394 //--------------------------------------------------------------
2395 lhs_decl_ctx = lhs_decl->getDeclContext();
2396 rhs_decl_ctx = rhs_decl->getDeclContext();
2397 while (1)
2398 {
2399 switch (lhs_decl_ctx->getDeclKind())
2400 {
2401 case clang::Decl::TranslationUnit:
2402 // We don't care about the translation unit names
2403 return true;
2404 default:
2405 {
2406 clang::NamedDecl *lhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(lhs_decl_ctx);
2407 clang::NamedDecl *rhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(rhs_decl_ctx);
2408 if (lhs_named_decl && rhs_named_decl)
2409 {
2410 clang::DeclarationName lhs_decl_name = lhs_named_decl->getDeclName();
2411 clang::DeclarationName rhs_decl_name = rhs_named_decl->getDeclName();
2412 if (lhs_decl_name.getNameKind() == rhs_decl_name.getNameKind())
2413 {
2414 if (lhs_decl_name.getAsString() != rhs_decl_name.getAsString())
2415 return false;
2416 }
2417 else
2418 return false;
2419 }
2420 else
2421 return false;
2422 }
2423 break;
2424
2425 }
2426 lhs_decl_ctx = lhs_decl_ctx->getParent();
2427 rhs_decl_ctx = rhs_decl_ctx->getParent();
2428 }
2429 }
2430 }
2431 }
2432 return false;
2433}
Enrico Granata86027e92012-03-24 01:11:14 +00002434bool
Greg Claytona2721472011-06-25 00:44:06 +00002435ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
2436 clang::Decl *decl)
2437{
2438 if (!decl)
2439 return false;
2440
2441 ExternalASTSource *ast_source = ast->getExternalSource();
2442
2443 if (!ast_source)
2444 return false;
2445
2446 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
2447 {
Greg Clayton219cf312012-03-30 00:51:13 +00002448 if (tag_decl->isCompleteDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002449 return true;
2450
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00002451 if (!tag_decl->hasExternalLexicalStorage())
2452 return false;
2453
Greg Claytona2721472011-06-25 00:44:06 +00002454 ast_source->CompleteType(tag_decl);
2455
2456 return !tag_decl->getTypeForDecl()->isIncompleteType();
2457 }
2458 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
2459 {
Sean Callanan5b26f272012-02-04 08:49:35 +00002460 if (objc_interface_decl->getDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002461 return true;
2462
2463 if (!objc_interface_decl->hasExternalLexicalStorage())
2464 return false;
2465
2466 ast_source->CompleteType(objc_interface_decl);
2467
Sean Callanan5b26f272012-02-04 08:49:35 +00002468 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytona2721472011-06-25 00:44:06 +00002469 }
2470 else
2471 {
2472 return false;
2473 }
2474}
2475
Sean Callanan60217122012-04-13 00:10:03 +00002476void
Greg Claytond0029442013-03-27 01:48:02 +00002477ClangASTContext::SetMetadataAsUserID (const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002478 user_id_t user_id)
2479{
2480 ClangASTMetadata meta_data;
2481 meta_data.SetUserID (user_id);
2482 SetMetadata (object, meta_data);
2483}
2484
2485void
Sean Callanan60217122012-04-13 00:10:03 +00002486ClangASTContext::SetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002487 const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002488 ClangASTMetadata &metadata)
Sean Callanan60217122012-04-13 00:10:03 +00002489{
2490 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002491 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002492
2493 if (external_source)
2494 external_source->SetMetadata(object, metadata);
2495}
2496
Jim Ingham379397632012-10-27 02:54:13 +00002497ClangASTMetadata *
Sean Callanan60217122012-04-13 00:10:03 +00002498ClangASTContext::GetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002499 const void *object)
Sean Callanan60217122012-04-13 00:10:03 +00002500{
2501 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002502 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002503
2504 if (external_source && external_source->HasMetadata(object))
2505 return external_source->GetMetadata(object);
2506 else
Ed Masted4612ad2014-04-20 13:17:36 +00002507 return nullptr;
Sean Callanan60217122012-04-13 00:10:03 +00002508}
2509
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002510clang::DeclContext *
2511ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
2512{
Sean Callanana87bee82011-08-19 06:19:25 +00002513 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002514}
2515
2516clang::DeclContext *
2517ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
2518{
Sean Callanana87bee82011-08-19 06:19:25 +00002519 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002520}
2521
Greg Claytond8d4a572015-08-11 21:38:15 +00002522bool
2523ClangASTContext::SetTagTypeKind (clang::QualType tag_qual_type, int kind) const
2524{
2525 const clang::Type *clang_type = tag_qual_type.getTypePtr();
2526 if (clang_type)
2527 {
2528 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(clang_type);
2529 if (tag_type)
2530 {
2531 clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(tag_type->getDecl());
2532 if (tag_decl)
2533 {
2534 tag_decl->setTagKind ((clang::TagDecl::TagKind)kind);
2535 return true;
2536 }
2537 }
2538 }
2539 return false;
2540}
2541
2542
2543bool
2544ClangASTContext::SetDefaultAccessForRecordFields (clang::RecordDecl* record_decl,
2545 int default_accessibility,
2546 int *assigned_accessibilities,
2547 size_t num_assigned_accessibilities)
2548{
2549 if (record_decl)
2550 {
2551 uint32_t field_idx;
2552 clang::RecordDecl::field_iterator field, field_end;
2553 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2554 field != field_end;
2555 ++field, ++field_idx)
2556 {
2557 // If no accessibility was assigned, assign the correct one
2558 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2559 field->setAccess ((clang::AccessSpecifier)default_accessibility);
2560 }
2561 return true;
2562 }
2563 return false;
2564}
2565
2566clang::DeclContext *
Greg Clayton99558cc42015-08-24 23:46:31 +00002567ClangASTContext::GetDeclContextForType (const CompilerType& type)
2568{
2569 return GetDeclContextForType(GetQualType(type));
2570}
2571
2572clang::DeclContext *
Greg Claytond8d4a572015-08-11 21:38:15 +00002573ClangASTContext::GetDeclContextForType (clang::QualType type)
2574{
2575 if (type.isNull())
2576 return nullptr;
2577
2578 clang::QualType qual_type = type.getCanonicalType();
2579 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2580 switch (type_class)
2581 {
Greg Claytond8d4a572015-08-11 21:38:15 +00002582 case clang::Type::ObjCInterface: return llvm::cast<clang::ObjCObjectType>(qual_type.getTypePtr())->getInterface();
2583 case clang::Type::ObjCObjectPointer: return GetDeclContextForType (llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
2584 case clang::Type::Record: return llvm::cast<clang::RecordType>(qual_type)->getDecl();
2585 case clang::Type::Enum: return llvm::cast<clang::EnumType>(qual_type)->getDecl();
2586 case clang::Type::Typedef: return GetDeclContextForType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
2587 case clang::Type::Elaborated: return GetDeclContextForType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
2588 case clang::Type::Paren: return GetDeclContextForType (llvm::cast<clang::ParenType>(qual_type)->desugar());
Greg Clayton99558cc42015-08-24 23:46:31 +00002589 default:
2590 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00002591 }
2592 // No DeclContext in this type...
2593 return nullptr;
2594}
2595
2596static bool
2597GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true)
2598{
2599 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2600 switch (type_class)
2601 {
2602 case clang::Type::ConstantArray:
2603 case clang::Type::IncompleteArray:
2604 case clang::Type::VariableArray:
Greg Claytond8d4a572015-08-11 21:38:15 +00002605 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002606 const clang::ArrayType *array_type = llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
2607
2608 if (array_type)
2609 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
2610 }
2611 break;
2612 case clang::Type::Record:
2613 {
2614 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2615 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00002616 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002617 if (cxx_record_decl->hasExternalLexicalStorage())
Greg Claytond8d4a572015-08-11 21:38:15 +00002618 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002619 const bool is_complete = cxx_record_decl->isCompleteDefinition();
2620 const bool fields_loaded = cxx_record_decl->hasLoadedFieldsFromExternalStorage();
2621 if (is_complete && fields_loaded)
2622 return true;
2623
2624 if (!allow_completion)
2625 return false;
2626
2627 // Call the field_begin() accessor to for it to use the external source
2628 // to load the fields...
2629 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2630 if (external_ast_source)
Greg Claytond8d4a572015-08-11 21:38:15 +00002631 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002632 external_ast_source->CompleteType(cxx_record_decl);
2633 if (cxx_record_decl->isCompleteDefinition())
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002634 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002635 cxx_record_decl->setHasLoadedFieldsFromExternalStorage (true);
2636 cxx_record_decl->field_begin();
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002637 }
2638 }
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002639 }
2640 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00002641 const clang::TagType *tag_type = llvm::cast<clang::TagType>(qual_type.getTypePtr());
2642 return !tag_type->isIncompleteType();
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002643 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002644 break;
Greg Claytone6b36cd2015-12-08 01:02:08 +00002645
2646 case clang::Type::Enum:
2647 {
2648 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
2649 if (tag_type)
2650 {
2651 clang::TagDecl *tag_decl = tag_type->getDecl();
2652 if (tag_decl)
2653 {
2654 if (tag_decl->getDefinition())
2655 return true;
2656
2657 if (!allow_completion)
2658 return false;
2659
2660 if (tag_decl->hasExternalLexicalStorage())
2661 {
2662 if (ast)
2663 {
2664 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2665 if (external_ast_source)
2666 {
2667 external_ast_source->CompleteType(tag_decl);
2668 return !tag_type->isIncompleteType();
2669 }
2670 }
2671 }
2672 return false;
2673 }
2674 }
2675
2676 }
2677 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00002678 case clang::Type::ObjCObject:
2679 case clang::Type::ObjCInterface:
Greg Claytond8d4a572015-08-11 21:38:15 +00002680 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002681 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
2682 if (objc_class_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002683 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002684 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2685 // We currently can't complete objective C types through the newly added ASTContext
2686 // because it only supports TagDecl objects right now...
2687 if (class_interface_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00002688 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002689 if (class_interface_decl->getDefinition())
2690 return true;
2691
2692 if (!allow_completion)
2693 return false;
2694
2695 if (class_interface_decl->hasExternalLexicalStorage())
Greg Claytond8d4a572015-08-11 21:38:15 +00002696 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002697 if (ast)
Greg Claytond8d4a572015-08-11 21:38:15 +00002698 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002699 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2700 if (external_ast_source)
2701 {
2702 external_ast_source->CompleteType (class_interface_decl);
2703 return !objc_class_type->isIncompleteType();
2704 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002705 }
2706 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00002707 return false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002708 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002709 }
2710 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002711 break;
2712
2713 case clang::Type::Typedef:
2714 return GetCompleteQualType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
2715
2716 case clang::Type::Elaborated:
2717 return GetCompleteQualType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType(), allow_completion);
2718
2719 case clang::Type::Paren:
2720 return GetCompleteQualType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar(), allow_completion);
Greg Claytone6b36cd2015-12-08 01:02:08 +00002721
2722 case clang::Type::Attributed:
2723 return GetCompleteQualType (ast, llvm::cast<clang::AttributedType>(qual_type)->getModifiedType(), allow_completion);
2724
Greg Claytond8d4a572015-08-11 21:38:15 +00002725 default:
2726 break;
2727 }
2728
2729 return true;
2730}
2731
2732static clang::ObjCIvarDecl::AccessControl
2733ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
2734{
2735 switch (access)
2736 {
2737 case eAccessNone: return clang::ObjCIvarDecl::None;
2738 case eAccessPublic: return clang::ObjCIvarDecl::Public;
2739 case eAccessPrivate: return clang::ObjCIvarDecl::Private;
2740 case eAccessProtected: return clang::ObjCIvarDecl::Protected;
2741 case eAccessPackage: return clang::ObjCIvarDecl::Package;
2742 }
2743 return clang::ObjCIvarDecl::None;
2744}
2745
2746
2747//----------------------------------------------------------------------
2748// Tests
2749//----------------------------------------------------------------------
2750
2751bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002752ClangASTContext::IsAggregateType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002753{
2754 clang::QualType qual_type (GetCanonicalQualType(type));
2755
2756 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2757 switch (type_class)
2758 {
2759 case clang::Type::IncompleteArray:
2760 case clang::Type::VariableArray:
2761 case clang::Type::ConstantArray:
2762 case clang::Type::ExtVector:
2763 case clang::Type::Vector:
2764 case clang::Type::Record:
2765 case clang::Type::ObjCObject:
2766 case clang::Type::ObjCInterface:
2767 return true;
2768 case clang::Type::Elaborated:
2769 return IsAggregateType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2770 case clang::Type::Typedef:
2771 return IsAggregateType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2772 case clang::Type::Paren:
2773 return IsAggregateType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2774 default:
2775 break;
2776 }
2777 // The clang type does have a value
2778 return false;
2779}
2780
2781bool
Enrico Granata7123e2b2015-11-07 02:06:57 +00002782ClangASTContext::IsAnonymousType (lldb::opaque_compiler_type_t type)
2783{
2784 clang::QualType qual_type (GetCanonicalQualType(type));
2785
2786 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2787 switch (type_class)
2788 {
2789 case clang::Type::Record:
2790 {
2791 if (const clang::RecordType *record_type = llvm::dyn_cast_or_null<clang::RecordType>(qual_type.getTypePtrOrNull()))
2792 {
2793 if (const clang::RecordDecl *record_decl = record_type->getDecl())
2794 {
2795 return record_decl->isAnonymousStructOrUnion();
2796 }
2797 }
2798 break;
2799 }
2800 case clang::Type::Elaborated:
2801 return IsAnonymousType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
2802 case clang::Type::Typedef:
2803 return IsAnonymousType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2804 case clang::Type::Paren:
2805 return IsAnonymousType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
2806 default:
2807 break;
2808 }
2809 // The clang type does have a value
2810 return false;
2811}
2812
2813bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002814ClangASTContext::IsArrayType (lldb::opaque_compiler_type_t type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002815 CompilerType *element_type_ptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00002816 uint64_t *size,
2817 bool *is_incomplete)
2818{
2819 clang::QualType qual_type (GetCanonicalQualType(type));
2820
2821 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2822 switch (type_class)
2823 {
2824 default:
2825 break;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002826
Greg Claytond8d4a572015-08-11 21:38:15 +00002827 case clang::Type::ConstantArray:
2828 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002829 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::ConstantArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002830 if (size)
2831 *size = llvm::cast<clang::ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002832 if (is_incomplete)
2833 *is_incomplete = false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002834 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002835
Greg Claytond8d4a572015-08-11 21:38:15 +00002836 case clang::Type::IncompleteArray:
2837 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002838 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::IncompleteArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002839 if (size)
2840 *size = 0;
2841 if (is_incomplete)
2842 *is_incomplete = true;
2843 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002844
Greg Claytond8d4a572015-08-11 21:38:15 +00002845 case clang::Type::VariableArray:
2846 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002847 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::VariableArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002848 if (size)
2849 *size = 0;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002850 if (is_incomplete)
2851 *is_incomplete = false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002852 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002853
Greg Claytond8d4a572015-08-11 21:38:15 +00002854 case clang::Type::DependentSizedArray:
2855 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00002856 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::DependentSizedArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002857 if (size)
2858 *size = 0;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002859 if (is_incomplete)
2860 *is_incomplete = false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002861 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00002862
Greg Claytond8d4a572015-08-11 21:38:15 +00002863 case clang::Type::Typedef:
2864 return IsArrayType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2865 element_type_ptr,
2866 size,
2867 is_incomplete);
2868 case clang::Type::Elaborated:
2869 return IsArrayType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
2870 element_type_ptr,
2871 size,
2872 is_incomplete);
2873 case clang::Type::Paren:
2874 return IsArrayType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
2875 element_type_ptr,
2876 size,
2877 is_incomplete);
2878 }
2879 if (element_type_ptr)
2880 element_type_ptr->Clear();
2881 if (size)
2882 *size = 0;
2883 if (is_incomplete)
2884 *is_incomplete = false;
Bruce Mitchener778e7ab2015-09-16 00:00:16 +00002885 return false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002886}
2887
2888bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002889ClangASTContext::IsVectorType (lldb::opaque_compiler_type_t type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002890 CompilerType *element_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00002891 uint64_t *size)
2892{
2893 clang::QualType qual_type (GetCanonicalQualType(type));
2894
2895 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2896 switch (type_class)
2897 {
2898 case clang::Type::Vector:
2899 {
2900 const clang::VectorType *vector_type = qual_type->getAs<clang::VectorType>();
2901 if (vector_type)
2902 {
2903 if (size)
2904 *size = vector_type->getNumElements();
2905 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002906 *element_type = CompilerType(getASTContext(), vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002907 }
2908 return true;
2909 }
2910 break;
2911 case clang::Type::ExtVector:
2912 {
2913 const clang::ExtVectorType *ext_vector_type = qual_type->getAs<clang::ExtVectorType>();
2914 if (ext_vector_type)
2915 {
2916 if (size)
2917 *size = ext_vector_type->getNumElements();
2918 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00002919 *element_type = CompilerType(getASTContext(), ext_vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002920 }
2921 return true;
2922 }
2923 default:
2924 break;
2925 }
2926 return false;
2927}
2928
2929bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002930ClangASTContext::IsRuntimeGeneratedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002931{
2932 clang::DeclContext* decl_ctx = ClangASTContext::GetASTContext(getASTContext())->GetDeclContextForType(GetQualType(type));
2933 if (!decl_ctx)
2934 return false;
2935
2936 if (!llvm::isa<clang::ObjCInterfaceDecl>(decl_ctx))
2937 return false;
2938
2939 clang::ObjCInterfaceDecl *result_iface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
2940
2941 ClangASTMetadata* ast_metadata = ClangASTContext::GetMetadata(getASTContext(), result_iface_decl);
2942 if (!ast_metadata)
2943 return false;
2944 return (ast_metadata->GetISAPtr() != 0);
2945}
2946
2947bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002948ClangASTContext::IsCharType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002949{
2950 return GetQualType(type).getUnqualifiedType()->isCharType();
2951}
2952
2953
2954bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002955ClangASTContext::IsCompleteType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002956{
2957 const bool allow_completion = false;
2958 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
2959}
2960
2961bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002962ClangASTContext::IsConst(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002963{
2964 return GetQualType(type).isConstQualified();
2965}
2966
2967bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002968ClangASTContext::IsCStringType (lldb::opaque_compiler_type_t type, uint32_t &length)
Greg Claytond8d4a572015-08-11 21:38:15 +00002969{
Greg Claytona1e5dc82015-08-11 22:53:00 +00002970 CompilerType pointee_or_element_clang_type;
Greg Claytond8d4a572015-08-11 21:38:15 +00002971 length = 0;
2972 Flags type_flags (GetTypeInfo (type, &pointee_or_element_clang_type));
2973
2974 if (!pointee_or_element_clang_type.IsValid())
2975 return false;
2976
2977 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
2978 {
2979 if (pointee_or_element_clang_type.IsCharType())
2980 {
2981 if (type_flags.Test (eTypeIsArray))
2982 {
2983 // We know the size of the array and it could be a C string
2984 // since it is an array of characters
2985 length = llvm::cast<clang::ConstantArrayType>(GetCanonicalQualType(type).getTypePtr())->getSize().getLimitedValue();
2986 }
2987 return true;
2988
2989 }
2990 }
2991 return false;
2992}
2993
2994bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002995ClangASTContext::IsFunctionType (lldb::opaque_compiler_type_t type, bool *is_variadic_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00002996{
2997 if (type)
2998 {
2999 clang::QualType qual_type (GetCanonicalQualType(type));
3000
3001 if (qual_type->isFunctionType())
3002 {
3003 if (is_variadic_ptr)
3004 {
3005 const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3006 if (function_proto_type)
3007 *is_variadic_ptr = function_proto_type->isVariadic();
3008 else
3009 *is_variadic_ptr = false;
3010 }
3011 return true;
3012 }
3013
3014 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3015 switch (type_class)
3016 {
3017 default:
3018 break;
3019 case clang::Type::Typedef:
3020 return IsFunctionType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), nullptr);
3021 case clang::Type::Elaborated:
3022 return IsFunctionType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), nullptr);
3023 case clang::Type::Paren:
3024 return IsFunctionType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), nullptr);
3025 case clang::Type::LValueReference:
3026 case clang::Type::RValueReference:
3027 {
3028 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3029 if (reference_type)
3030 return IsFunctionType(reference_type->getPointeeType().getAsOpaquePtr(), nullptr);
3031 }
3032 break;
3033 }
3034 }
3035 return false;
3036}
3037
3038// Used to detect "Homogeneous Floating-point Aggregates"
3039uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003040ClangASTContext::IsHomogeneousAggregate (lldb::opaque_compiler_type_t type, CompilerType* base_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003041{
3042 if (!type)
3043 return 0;
3044
3045 clang::QualType qual_type(GetCanonicalQualType(type));
3046 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3047 switch (type_class)
3048 {
3049 case clang::Type::Record:
3050 if (GetCompleteType (type))
3051 {
3052 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3053 if (cxx_record_decl)
3054 {
3055 if (cxx_record_decl->getNumBases() ||
3056 cxx_record_decl->isDynamicClass())
3057 return 0;
3058 }
3059 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3060 if (record_type)
3061 {
3062 const clang::RecordDecl *record_decl = record_type->getDecl();
3063 if (record_decl)
3064 {
3065 // We are looking for a structure that contains only floating point types
3066 clang::RecordDecl::field_iterator field_pos, field_end = record_decl->field_end();
3067 uint32_t num_fields = 0;
3068 bool is_hva = false;
3069 bool is_hfa = false;
3070 clang::QualType base_qual_type;
3071 for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos)
3072 {
3073 clang::QualType field_qual_type = field_pos->getType();
3074 if (field_qual_type->isFloatingType())
3075 {
3076 if (field_qual_type->isComplexType())
3077 return 0;
3078 else
3079 {
3080 if (num_fields == 0)
3081 base_qual_type = field_qual_type;
3082 else
3083 {
3084 if (is_hva)
3085 return 0;
3086 is_hfa = true;
3087 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
3088 return 0;
3089 }
3090 }
3091 }
3092 else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType())
3093 {
3094 const clang::VectorType *array = field_qual_type.getTypePtr()->getAs<clang::VectorType>();
3095 if (array && array->getNumElements() <= 4)
3096 {
3097 if (num_fields == 0)
3098 base_qual_type = array->getElementType();
3099 else
3100 {
3101 if (is_hfa)
3102 return 0;
3103 is_hva = true;
3104 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
3105 return 0;
3106 }
3107 }
3108 else
3109 return 0;
3110 }
3111 else
3112 return 0;
3113 ++num_fields;
3114 }
3115 if (base_type_ptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003116 *base_type_ptr = CompilerType (getASTContext(), base_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003117 return num_fields;
3118 }
3119 }
3120 }
3121 break;
3122
3123 case clang::Type::Typedef:
3124 return IsHomogeneousAggregate(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), base_type_ptr);
3125
3126 case clang::Type::Elaborated:
3127 return IsHomogeneousAggregate(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), base_type_ptr);
3128 default:
3129 break;
3130 }
3131 return 0;
3132}
3133
3134size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003135ClangASTContext::GetNumberOfFunctionArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003136{
3137 if (type)
3138 {
3139 clang::QualType qual_type (GetCanonicalQualType(type));
3140 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3141 if (func)
3142 return func->getNumParams();
3143 }
3144 return 0;
3145}
3146
Greg Claytona1e5dc82015-08-11 22:53:00 +00003147CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003148ClangASTContext::GetFunctionArgumentAtIndex (lldb::opaque_compiler_type_t type, const size_t index)
Greg Claytond8d4a572015-08-11 21:38:15 +00003149{
3150 if (type)
3151 {
3152 clang::QualType qual_type (GetCanonicalQualType(type));
3153 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3154 if (func)
3155 {
3156 if (index < func->getNumParams())
Greg Claytona1e5dc82015-08-11 22:53:00 +00003157 return CompilerType(getASTContext(), func->getParamType(index));
Greg Claytond8d4a572015-08-11 21:38:15 +00003158 }
3159 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003160 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003161}
3162
3163bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003164ClangASTContext::IsFunctionPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003165{
3166 if (type)
3167 {
3168 clang::QualType qual_type (GetCanonicalQualType(type));
3169
3170 if (qual_type->isFunctionPointerType())
3171 return true;
3172
3173 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3174 switch (type_class)
3175 {
3176 default:
3177 break;
3178 case clang::Type::Typedef:
3179 return IsFunctionPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3180 case clang::Type::Elaborated:
3181 return IsFunctionPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3182 case clang::Type::Paren:
3183 return IsFunctionPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
3184
3185 case clang::Type::LValueReference:
3186 case clang::Type::RValueReference:
3187 {
3188 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3189 if (reference_type)
3190 return IsFunctionPointerType(reference_type->getPointeeType().getAsOpaquePtr());
3191 }
3192 break;
3193 }
3194 }
3195 return false;
3196
3197}
3198
3199bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003200ClangASTContext::IsIntegerType (lldb::opaque_compiler_type_t type, bool &is_signed)
Greg Claytond8d4a572015-08-11 21:38:15 +00003201{
3202 if (!type)
3203 return false;
3204
3205 clang::QualType qual_type (GetCanonicalQualType(type));
3206 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3207
3208 if (builtin_type)
3209 {
3210 if (builtin_type->isInteger())
3211 {
3212 is_signed = builtin_type->isSignedInteger();
3213 return true;
3214 }
3215 }
3216
3217 return false;
3218}
3219
3220bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003221ClangASTContext::IsPointerType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003222{
3223 if (type)
3224 {
3225 clang::QualType qual_type (GetCanonicalQualType(type));
3226 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3227 switch (type_class)
3228 {
3229 case clang::Type::Builtin:
3230 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3231 {
3232 default:
3233 break;
3234 case clang::BuiltinType::ObjCId:
3235 case clang::BuiltinType::ObjCClass:
3236 return true;
3237 }
3238 return false;
3239 case clang::Type::ObjCObjectPointer:
3240 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003241 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003242 return true;
3243 case clang::Type::BlockPointer:
3244 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003245 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003246 return true;
3247 case clang::Type::Pointer:
3248 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003249 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003250 return true;
3251 case clang::Type::MemberPointer:
3252 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003253 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003254 return true;
3255 case clang::Type::Typedef:
3256 return IsPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
3257 case clang::Type::Elaborated:
3258 return IsPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3259 case clang::Type::Paren:
3260 return IsPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3261 default:
3262 break;
3263 }
3264 }
3265 if (pointee_type)
3266 pointee_type->Clear();
3267 return false;
3268}
3269
3270
3271bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003272ClangASTContext::IsPointerOrReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003273{
3274 if (type)
3275 {
3276 clang::QualType qual_type (GetCanonicalQualType(type));
3277 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3278 switch (type_class)
3279 {
3280 case clang::Type::Builtin:
3281 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3282 {
3283 default:
3284 break;
3285 case clang::BuiltinType::ObjCId:
3286 case clang::BuiltinType::ObjCClass:
3287 return true;
3288 }
3289 return false;
3290 case clang::Type::ObjCObjectPointer:
3291 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003292 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003293 return true;
3294 case clang::Type::BlockPointer:
3295 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003296 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003297 return true;
3298 case clang::Type::Pointer:
3299 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003300 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003301 return true;
3302 case clang::Type::MemberPointer:
3303 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003304 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003305 return true;
3306 case clang::Type::LValueReference:
3307 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003308 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003309 return true;
3310 case clang::Type::RValueReference:
3311 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003312 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003313 return true;
3314 case clang::Type::Typedef:
3315 return IsPointerOrReferenceType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
3316 case clang::Type::Elaborated:
3317 return IsPointerOrReferenceType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3318 case clang::Type::Paren:
3319 return IsPointerOrReferenceType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3320 default:
3321 break;
3322 }
3323 }
3324 if (pointee_type)
3325 pointee_type->Clear();
3326 return false;
3327}
3328
3329
3330bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003331ClangASTContext::IsReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool* is_rvalue)
Greg Claytond8d4a572015-08-11 21:38:15 +00003332{
3333 if (type)
3334 {
3335 clang::QualType qual_type (GetCanonicalQualType(type));
3336 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3337
3338 switch (type_class)
3339 {
3340 case clang::Type::LValueReference:
3341 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003342 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003343 if (is_rvalue)
3344 *is_rvalue = false;
3345 return true;
3346 case clang::Type::RValueReference:
3347 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003348 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003349 if (is_rvalue)
3350 *is_rvalue = true;
3351 return true;
3352 case clang::Type::Typedef:
3353 return IsReferenceType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type, is_rvalue);
3354 case clang::Type::Elaborated:
3355 return IsReferenceType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type, is_rvalue);
3356 case clang::Type::Paren:
3357 return IsReferenceType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type, is_rvalue);
3358
3359 default:
3360 break;
3361 }
3362 }
3363 if (pointee_type)
3364 pointee_type->Clear();
3365 return false;
3366}
3367
3368bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003369ClangASTContext::IsFloatingPointType (lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex)
Greg Claytond8d4a572015-08-11 21:38:15 +00003370{
3371 if (type)
3372 {
3373 clang::QualType qual_type (GetCanonicalQualType(type));
3374
3375 if (const clang::BuiltinType *BT = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal()))
3376 {
3377 clang::BuiltinType::Kind kind = BT->getKind();
3378 if (kind >= clang::BuiltinType::Float && kind <= clang::BuiltinType::LongDouble)
3379 {
3380 count = 1;
3381 is_complex = false;
3382 return true;
3383 }
3384 }
3385 else if (const clang::ComplexType *CT = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal()))
3386 {
3387 if (IsFloatingPointType (CT->getElementType().getAsOpaquePtr(), count, is_complex))
3388 {
3389 count = 2;
3390 is_complex = true;
3391 return true;
3392 }
3393 }
3394 else if (const clang::VectorType *VT = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal()))
3395 {
3396 if (IsFloatingPointType (VT->getElementType().getAsOpaquePtr(), count, is_complex))
3397 {
3398 count = VT->getNumElements();
3399 is_complex = false;
3400 return true;
3401 }
3402 }
3403 }
3404 count = 0;
3405 is_complex = false;
3406 return false;
3407}
3408
3409
3410bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003411ClangASTContext::IsDefined(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003412{
3413 if (!type)
3414 return false;
3415
3416 clang::QualType qual_type(GetQualType(type));
3417 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
3418 if (tag_type)
3419 {
3420 clang::TagDecl *tag_decl = tag_type->getDecl();
3421 if (tag_decl)
3422 return tag_decl->isCompleteDefinition();
3423 return false;
3424 }
3425 else
3426 {
3427 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3428 if (objc_class_type)
3429 {
3430 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3431 if (class_interface_decl)
3432 return class_interface_decl->getDefinition() != nullptr;
3433 return false;
3434 }
3435 }
3436 return true;
3437}
3438
3439bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003440ClangASTContext::IsObjCClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003441{
3442 if (type)
3443 {
3444 clang::QualType qual_type (GetCanonicalQualType(type));
3445
3446 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3447
3448 if (obj_pointer_type)
3449 return obj_pointer_type->isObjCClassType();
3450 }
3451 return false;
3452}
3453
3454bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003455ClangASTContext::IsObjCObjectOrInterfaceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003456{
Ryan Brown57bee1e2015-09-14 22:45:11 +00003457 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00003458 return GetCanonicalQualType(type)->isObjCObjectOrInterfaceType();
3459 return false;
3460}
3461
3462bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003463ClangASTContext::IsPolymorphicClass (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003464{
3465 if (type)
3466 {
3467 clang::QualType qual_type(GetCanonicalQualType(type));
3468 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3469 switch (type_class)
3470 {
3471 case clang::Type::Record:
3472 if (GetCompleteType(type))
3473 {
3474 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3475 const clang::RecordDecl *record_decl = record_type->getDecl();
3476 if (record_decl)
3477 {
3478 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3479 if (cxx_record_decl)
3480 return cxx_record_decl->isPolymorphic();
3481 }
3482 }
3483 break;
3484
3485 default:
3486 break;
3487 }
3488 }
3489 return false;
3490}
3491
3492bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003493ClangASTContext::IsPossibleDynamicType (lldb::opaque_compiler_type_t type, CompilerType *dynamic_pointee_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00003494 bool check_cplusplus,
3495 bool check_objc)
3496{
3497 clang::QualType pointee_qual_type;
3498 if (type)
3499 {
3500 clang::QualType qual_type (GetCanonicalQualType(type));
3501 bool success = false;
3502 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3503 switch (type_class)
3504 {
3505 case clang::Type::Builtin:
3506 if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
3507 {
3508 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003509 dynamic_pointee_type->SetCompilerType(this, type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003510 return true;
3511 }
3512 break;
3513
3514 case clang::Type::ObjCObjectPointer:
3515 if (check_objc)
3516 {
3517 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003518 dynamic_pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003519 return true;
3520 }
3521 break;
3522
3523 case clang::Type::Pointer:
3524 pointee_qual_type = llvm::cast<clang::PointerType>(qual_type)->getPointeeType();
3525 success = true;
3526 break;
3527
3528 case clang::Type::LValueReference:
3529 case clang::Type::RValueReference:
3530 pointee_qual_type = llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType();
3531 success = true;
3532 break;
3533
3534 case clang::Type::Typedef:
3535 return IsPossibleDynamicType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3536 dynamic_pointee_type,
3537 check_cplusplus,
3538 check_objc);
3539
3540 case clang::Type::Elaborated:
3541 return IsPossibleDynamicType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3542 dynamic_pointee_type,
3543 check_cplusplus,
3544 check_objc);
3545
3546 case clang::Type::Paren:
3547 return IsPossibleDynamicType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
3548 dynamic_pointee_type,
3549 check_cplusplus,
3550 check_objc);
3551 default:
3552 break;
3553 }
3554
3555 if (success)
3556 {
3557 // Check to make sure what we are pointing too is a possible dynamic C++ type
3558 // We currently accept any "void *" (in case we have a class that has been
3559 // watered down to an opaque pointer) and virtual C++ classes.
3560 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
3561 switch (pointee_type_class)
3562 {
3563 case clang::Type::Builtin:
3564 switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind())
3565 {
3566 case clang::BuiltinType::UnknownAny:
3567 case clang::BuiltinType::Void:
3568 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003569 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003570 return true;
Zachary Turnerdd07e002015-09-16 18:08:45 +00003571 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00003572 break;
3573 }
3574 break;
3575
3576 case clang::Type::Record:
3577 if (check_cplusplus)
3578 {
3579 clang::CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
3580 if (cxx_record_decl)
3581 {
3582 bool is_complete = cxx_record_decl->isCompleteDefinition();
3583
3584 if (is_complete)
3585 success = cxx_record_decl->isDynamicClass();
3586 else
3587 {
3588 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), cxx_record_decl);
3589 if (metadata)
3590 success = metadata->GetIsDynamicCXXType();
3591 else
3592 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00003593 is_complete = CompilerType(getASTContext(), pointee_qual_type).GetCompleteType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003594 if (is_complete)
3595 success = cxx_record_decl->isDynamicClass();
3596 else
3597 success = false;
3598 }
3599 }
3600
3601 if (success)
3602 {
3603 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003604 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003605 return true;
3606 }
3607 }
3608 }
3609 break;
3610
3611 case clang::Type::ObjCObject:
3612 case clang::Type::ObjCInterface:
3613 if (check_objc)
3614 {
3615 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003616 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003617 return true;
3618 }
3619 break;
3620
3621 default:
3622 break;
3623 }
3624 }
3625 }
3626 if (dynamic_pointee_type)
3627 dynamic_pointee_type->Clear();
3628 return false;
3629}
3630
3631
3632bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003633ClangASTContext::IsScalarType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003634{
3635 if (!type)
3636 return false;
3637
3638 return (GetTypeInfo (type, nullptr) & eTypeIsScalar) != 0;
3639}
3640
3641bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003642ClangASTContext::IsTypedefType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003643{
3644 if (!type)
3645 return false;
3646 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
3647}
3648
3649bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003650ClangASTContext::IsVoidType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003651{
3652 if (!type)
3653 return false;
3654 return GetCanonicalQualType(type)->isVoidType();
3655}
3656
3657bool
Greg Clayton56939cb2015-09-17 22:23:34 +00003658ClangASTContext::SupportsLanguage (lldb::LanguageType language)
3659{
3660 return ClangASTContextSupportsLanguage(language);
3661}
3662
3663bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003664ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003665{
3666 if (type)
3667 {
3668 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003669 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00003670 {
Ryan Brown57bee1e2015-09-14 22:45:11 +00003671 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3672 if (cxx_record_decl)
3673 {
3674 class_name.assign(cxx_record_decl->getIdentifier()->getNameStart());
3675 return true;
3676 }
Greg Claytond8d4a572015-08-11 21:38:15 +00003677 }
3678 }
3679 class_name.clear();
3680 return false;
3681}
3682
3683
3684bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003685ClangASTContext::IsCXXClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003686{
3687 if (!type)
3688 return false;
3689
3690 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003691 if (!qual_type.isNull() && qual_type->getAsCXXRecordDecl() != nullptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003692 return true;
3693 return false;
3694}
3695
3696bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003697ClangASTContext::IsBeingDefined (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003698{
3699 if (!type)
3700 return false;
3701 clang::QualType qual_type (GetCanonicalQualType(type));
3702 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
3703 if (tag_type)
3704 return tag_type->isBeingDefined();
3705 return false;
3706}
3707
3708bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003709ClangASTContext::IsObjCObjectPointerType (const CompilerType& type, CompilerType *class_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003710{
3711 if (!type)
3712 return false;
3713
3714 clang::QualType qual_type (GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00003715
3716 if (!qual_type.isNull() && qual_type->isObjCObjectPointerType())
Greg Claytond8d4a572015-08-11 21:38:15 +00003717 {
3718 if (class_type_ptr)
3719 {
3720 if (!qual_type->isObjCClassType() &&
3721 !qual_type->isObjCIdType())
3722 {
3723 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3724 if (obj_pointer_type == nullptr)
3725 class_type_ptr->Clear();
3726 else
Greg Clayton99558cc42015-08-24 23:46:31 +00003727 class_type_ptr->SetCompilerType (type.GetTypeSystem(), clang::QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003728 }
3729 }
3730 return true;
3731 }
3732 if (class_type_ptr)
3733 class_type_ptr->Clear();
3734 return false;
3735}
3736
3737bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003738ClangASTContext::GetObjCClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00003739{
3740 if (!type)
3741 return false;
3742
3743 clang::QualType qual_type (GetCanonicalQualType(type));
3744
3745 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3746 if (object_type)
3747 {
3748 const clang::ObjCInterfaceDecl *interface = object_type->getInterface();
3749 if (interface)
3750 {
3751 class_name = interface->getNameAsString();
3752 return true;
3753 }
3754 }
3755 return false;
3756}
3757
3758
3759//----------------------------------------------------------------------
3760// Type Completion
3761//----------------------------------------------------------------------
3762
3763bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003764ClangASTContext::GetCompleteType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003765{
3766 if (!type)
3767 return false;
3768 const bool allow_completion = true;
3769 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
3770}
3771
3772ConstString
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003773ClangASTContext::GetTypeName (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003774{
3775 std::string type_name;
3776 if (type)
3777 {
3778 clang::PrintingPolicy printing_policy (getASTContext()->getPrintingPolicy());
3779 clang::QualType qual_type(GetQualType(type));
3780 printing_policy.SuppressTagKeyword = true;
3781 printing_policy.LangOpts.WChar = true;
3782 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
3783 if (typedef_type)
3784 {
3785 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
3786 type_name = typedef_decl->getQualifiedNameAsString();
3787 }
3788 else
3789 {
3790 type_name = qual_type.getAsString(printing_policy);
3791 }
3792 }
3793 return ConstString(type_name);
3794}
3795
3796uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003797ClangASTContext::GetTypeInfo (lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003798{
3799 if (!type)
3800 return 0;
3801
3802 if (pointee_or_element_clang_type)
3803 pointee_or_element_clang_type->Clear();
3804
3805 clang::QualType qual_type (GetQualType(type));
3806
3807 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3808 switch (type_class)
3809 {
3810 case clang::Type::Builtin:
3811 {
3812 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3813
3814 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
3815 switch (builtin_type->getKind())
3816 {
3817 case clang::BuiltinType::ObjCId:
3818 case clang::BuiltinType::ObjCClass:
3819 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003820 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003821 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3822 break;
3823
3824 case clang::BuiltinType::ObjCSel:
3825 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003826 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->CharTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00003827 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
3828 break;
3829
3830 case clang::BuiltinType::Bool:
3831 case clang::BuiltinType::Char_U:
3832 case clang::BuiltinType::UChar:
3833 case clang::BuiltinType::WChar_U:
3834 case clang::BuiltinType::Char16:
3835 case clang::BuiltinType::Char32:
3836 case clang::BuiltinType::UShort:
3837 case clang::BuiltinType::UInt:
3838 case clang::BuiltinType::ULong:
3839 case clang::BuiltinType::ULongLong:
3840 case clang::BuiltinType::UInt128:
3841 case clang::BuiltinType::Char_S:
3842 case clang::BuiltinType::SChar:
3843 case clang::BuiltinType::WChar_S:
3844 case clang::BuiltinType::Short:
3845 case clang::BuiltinType::Int:
3846 case clang::BuiltinType::Long:
3847 case clang::BuiltinType::LongLong:
3848 case clang::BuiltinType::Int128:
3849 case clang::BuiltinType::Float:
3850 case clang::BuiltinType::Double:
3851 case clang::BuiltinType::LongDouble:
3852 builtin_type_flags |= eTypeIsScalar;
3853 if (builtin_type->isInteger())
3854 {
3855 builtin_type_flags |= eTypeIsInteger;
3856 if (builtin_type->isSignedInteger())
3857 builtin_type_flags |= eTypeIsSigned;
3858 }
3859 else if (builtin_type->isFloatingPoint())
3860 builtin_type_flags |= eTypeIsFloat;
3861 break;
3862 default:
3863 break;
3864 }
3865 return builtin_type_flags;
3866 }
3867
3868 case clang::Type::BlockPointer:
3869 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003870 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003871 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
3872
3873 case clang::Type::Complex:
3874 {
3875 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
3876 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal());
3877 if (complex_type)
3878 {
3879 clang::QualType complex_element_type (complex_type->getElementType());
3880 if (complex_element_type->isIntegerType())
3881 complex_type_flags |= eTypeIsFloat;
3882 else if (complex_element_type->isFloatingType())
3883 complex_type_flags |= eTypeIsInteger;
3884 }
3885 return complex_type_flags;
3886 }
3887 break;
3888
3889 case clang::Type::ConstantArray:
3890 case clang::Type::DependentSizedArray:
3891 case clang::Type::IncompleteArray:
3892 case clang::Type::VariableArray:
3893 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003894 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ArrayType>(qual_type.getTypePtr())->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003895 return eTypeHasChildren | eTypeIsArray;
3896
3897 case clang::Type::DependentName: return 0;
3898 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
3899 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
3900 case clang::Type::Decltype: return 0;
3901
3902 case clang::Type::Enum:
3903 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003904 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::EnumType>(qual_type)->getDecl()->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003905 return eTypeIsEnumeration | eTypeHasValue;
3906
3907 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003908 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003909 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003910 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003911
3912 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
3913 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
3914 case clang::Type::InjectedClassName: return 0;
3915
3916 case clang::Type::LValueReference:
3917 case clang::Type::RValueReference:
3918 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003919 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003920 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
3921
3922 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
3923
3924 case clang::Type::ObjCObjectPointer:
3925 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003926 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003927 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
3928
3929 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3930 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
3931
3932 case clang::Type::Pointer:
3933 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003934 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003935 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
3936
3937 case clang::Type::Record:
3938 if (qual_type->getAsCXXRecordDecl())
3939 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
3940 else
3941 return eTypeHasChildren | eTypeIsStructUnion;
3942 break;
3943 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
3944 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
3945 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
3946
3947 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00003948 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 +00003949 case clang::Type::TypeOfExpr: return 0;
3950 case clang::Type::TypeOf: return 0;
3951 case clang::Type::UnresolvedUsing: return 0;
3952
3953 case clang::Type::ExtVector:
3954 case clang::Type::Vector:
3955 {
3956 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
3957 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal());
3958 if (vector_type)
3959 {
3960 if (vector_type->isIntegerType())
3961 vector_type_flags |= eTypeIsFloat;
3962 else if (vector_type->isFloatingType())
3963 vector_type_flags |= eTypeIsInteger;
3964 }
3965 return vector_type_flags;
3966 }
3967 default: return 0;
3968 }
3969 return 0;
3970}
3971
3972
3973
3974lldb::LanguageType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003975ClangASTContext::GetMinimumLanguage (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003976{
3977 if (!type)
3978 return lldb::eLanguageTypeC;
3979
3980 // If the type is a reference, then resolve it to what it refers to first:
3981 clang::QualType qual_type (GetCanonicalQualType(type).getNonReferenceType());
3982 if (qual_type->isAnyPointerType())
3983 {
3984 if (qual_type->isObjCObjectPointerType())
3985 return lldb::eLanguageTypeObjC;
3986
3987 clang::QualType pointee_type (qual_type->getPointeeType());
3988 if (pointee_type->getPointeeCXXRecordDecl() != nullptr)
3989 return lldb::eLanguageTypeC_plus_plus;
3990 if (pointee_type->isObjCObjectOrInterfaceType())
3991 return lldb::eLanguageTypeObjC;
3992 if (pointee_type->isObjCClassType())
3993 return lldb::eLanguageTypeObjC;
3994 if (pointee_type.getTypePtr() == getASTContext()->ObjCBuiltinIdTy.getTypePtr())
3995 return lldb::eLanguageTypeObjC;
3996 }
3997 else
3998 {
3999 if (qual_type->isObjCObjectOrInterfaceType())
4000 return lldb::eLanguageTypeObjC;
4001 if (qual_type->getAsCXXRecordDecl())
4002 return lldb::eLanguageTypeC_plus_plus;
4003 switch (qual_type->getTypeClass())
4004 {
4005 default:
4006 break;
4007 case clang::Type::Builtin:
4008 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4009 {
4010 default:
4011 case clang::BuiltinType::Void:
4012 case clang::BuiltinType::Bool:
4013 case clang::BuiltinType::Char_U:
4014 case clang::BuiltinType::UChar:
4015 case clang::BuiltinType::WChar_U:
4016 case clang::BuiltinType::Char16:
4017 case clang::BuiltinType::Char32:
4018 case clang::BuiltinType::UShort:
4019 case clang::BuiltinType::UInt:
4020 case clang::BuiltinType::ULong:
4021 case clang::BuiltinType::ULongLong:
4022 case clang::BuiltinType::UInt128:
4023 case clang::BuiltinType::Char_S:
4024 case clang::BuiltinType::SChar:
4025 case clang::BuiltinType::WChar_S:
4026 case clang::BuiltinType::Short:
4027 case clang::BuiltinType::Int:
4028 case clang::BuiltinType::Long:
4029 case clang::BuiltinType::LongLong:
4030 case clang::BuiltinType::Int128:
4031 case clang::BuiltinType::Float:
4032 case clang::BuiltinType::Double:
4033 case clang::BuiltinType::LongDouble:
4034 break;
4035
4036 case clang::BuiltinType::NullPtr:
4037 return eLanguageTypeC_plus_plus;
4038
4039 case clang::BuiltinType::ObjCId:
4040 case clang::BuiltinType::ObjCClass:
4041 case clang::BuiltinType::ObjCSel:
4042 return eLanguageTypeObjC;
4043
4044 case clang::BuiltinType::Dependent:
4045 case clang::BuiltinType::Overload:
4046 case clang::BuiltinType::BoundMember:
4047 case clang::BuiltinType::UnknownAny:
4048 break;
4049 }
4050 break;
4051 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004052 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
Greg Claytond8d4a572015-08-11 21:38:15 +00004053 }
4054 }
4055 return lldb::eLanguageTypeC;
4056}
4057
4058lldb::TypeClass
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004059ClangASTContext::GetTypeClass (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004060{
4061 if (!type)
4062 return lldb::eTypeClassInvalid;
4063
4064 clang::QualType qual_type(GetQualType(type));
4065
4066 switch (qual_type->getTypeClass())
4067 {
4068 case clang::Type::UnaryTransform: break;
4069 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
4070 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
4071 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
4072 case clang::Type::VariableArray: return lldb::eTypeClassArray;
4073 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
4074 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
4075 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
4076 case clang::Type::ExtVector: return lldb::eTypeClassVector;
4077 case clang::Type::Vector: return lldb::eTypeClassVector;
4078 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
4079 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
4080 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
4081 case clang::Type::Pointer: return lldb::eTypeClassPointer;
4082 case clang::Type::LValueReference: return lldb::eTypeClassReference;
4083 case clang::Type::RValueReference: return lldb::eTypeClassReference;
4084 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
4085 case clang::Type::Complex:
4086 if (qual_type->isComplexType())
4087 return lldb::eTypeClassComplexFloat;
4088 else
4089 return lldb::eTypeClassComplexInteger;
4090 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
4091 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
4092 case clang::Type::Record:
4093 {
4094 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4095 const clang::RecordDecl *record_decl = record_type->getDecl();
4096 if (record_decl->isUnion())
4097 return lldb::eTypeClassUnion;
4098 else if (record_decl->isStruct())
4099 return lldb::eTypeClassStruct;
4100 else
4101 return lldb::eTypeClassClass;
4102 }
4103 break;
4104 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
4105 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
4106 case clang::Type::UnresolvedUsing: break;
4107 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004108 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00004109 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004110 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00004111
4112 case clang::Type::Attributed: break;
4113 case clang::Type::TemplateTypeParm: break;
4114 case clang::Type::SubstTemplateTypeParm: break;
4115 case clang::Type::SubstTemplateTypeParmPack:break;
4116 case clang::Type::Auto: break;
4117 case clang::Type::InjectedClassName: break;
4118 case clang::Type::DependentName: break;
4119 case clang::Type::DependentTemplateSpecialization: break;
4120 case clang::Type::PackExpansion: break;
4121
4122 case clang::Type::TypeOfExpr: break;
4123 case clang::Type::TypeOf: break;
4124 case clang::Type::Decltype: break;
4125 case clang::Type::TemplateSpecialization: break;
4126 case clang::Type::Atomic: break;
4127
4128 // pointer type decayed from an array or function type.
4129 case clang::Type::Decayed: break;
4130 case clang::Type::Adjusted: break;
4131 }
4132 // We don't know hot to display this type...
4133 return lldb::eTypeClassOther;
4134
4135}
4136
4137unsigned
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004138ClangASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004139{
4140 if (type)
4141 return GetQualType(type).getQualifiers().getCVRQualifiers();
4142 return 0;
4143}
4144
4145//----------------------------------------------------------------------
4146// Creating related types
4147//----------------------------------------------------------------------
4148
Greg Claytona1e5dc82015-08-11 22:53:00 +00004149CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004150ClangASTContext::GetArrayElementType (lldb::opaque_compiler_type_t type, uint64_t *stride)
Greg Claytond8d4a572015-08-11 21:38:15 +00004151{
4152 if (type)
4153 {
4154 clang::QualType qual_type(GetCanonicalQualType(type));
4155
4156 const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
4157
4158 if (!array_eletype)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004159 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004160
Greg Claytona1e5dc82015-08-11 22:53:00 +00004161 CompilerType element_type (getASTContext(), array_eletype->getCanonicalTypeUnqualified());
Greg Claytond8d4a572015-08-11 21:38:15 +00004162
4163 // TODO: the real stride will be >= this value.. find the real one!
4164 if (stride)
4165 *stride = element_type.GetByteSize(nullptr);
4166
4167 return element_type;
4168
4169 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004170 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004171}
4172
Greg Claytona1e5dc82015-08-11 22:53:00 +00004173CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004174ClangASTContext::GetCanonicalType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004175{
4176 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004177 return CompilerType (getASTContext(), GetCanonicalQualType(type));
4178 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004179}
4180
4181static clang::QualType
4182GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
4183{
4184 if (qual_type->isPointerType())
4185 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
4186 else
4187 qual_type = qual_type.getUnqualifiedType();
4188 qual_type.removeLocalConst();
4189 qual_type.removeLocalRestrict();
4190 qual_type.removeLocalVolatile();
4191 return qual_type;
4192}
4193
Greg Claytona1e5dc82015-08-11 22:53:00 +00004194CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004195ClangASTContext::GetFullyUnqualifiedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004196{
4197 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004198 return CompilerType(getASTContext(), GetFullyUnqualifiedType_Impl(getASTContext(), GetQualType(type)));
4199 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004200}
4201
4202
4203int
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004204ClangASTContext::GetFunctionArgumentCount (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004205{
4206 if (type)
4207 {
4208 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
4209 if (func)
4210 return func->getNumParams();
4211 }
4212 return -1;
4213}
4214
Greg Claytona1e5dc82015-08-11 22:53:00 +00004215CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004216ClangASTContext::GetFunctionArgumentTypeAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004217{
4218 if (type)
4219 {
4220 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
4221 if (func)
4222 {
4223 const uint32_t num_args = func->getNumParams();
4224 if (idx < num_args)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004225 return CompilerType(getASTContext(), func->getParamType(idx));
Greg Claytond8d4a572015-08-11 21:38:15 +00004226 }
4227 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004228 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004229}
4230
Greg Claytona1e5dc82015-08-11 22:53:00 +00004231CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004232ClangASTContext::GetFunctionReturnType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004233{
4234 if (type)
4235 {
4236 clang::QualType qual_type(GetCanonicalQualType(type));
4237 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
4238 if (func)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004239 return CompilerType(getASTContext(), func->getReturnType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004240 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004241 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004242}
4243
4244size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004245ClangASTContext::GetNumMemberFunctions (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004246{
4247 size_t num_functions = 0;
4248 if (type)
4249 {
4250 clang::QualType qual_type(GetCanonicalQualType(type));
4251 switch (qual_type->getTypeClass()) {
4252 case clang::Type::Record:
4253 if (GetCompleteQualType (getASTContext(), qual_type))
4254 {
4255 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4256 const clang::RecordDecl *record_decl = record_type->getDecl();
4257 assert(record_decl);
4258 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4259 if (cxx_record_decl)
4260 num_functions = std::distance(cxx_record_decl->method_begin(), cxx_record_decl->method_end());
4261 }
4262 break;
4263
4264 case clang::Type::ObjCObjectPointer:
4265 if (GetCompleteType(type))
4266 {
4267 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4268 if (objc_class_type)
4269 {
4270 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4271 if (class_interface_decl)
4272 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4273 }
4274 }
4275 break;
4276
4277 case clang::Type::ObjCObject:
4278 case clang::Type::ObjCInterface:
4279 if (GetCompleteType(type))
4280 {
4281 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4282 if (objc_class_type)
4283 {
4284 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4285 if (class_interface_decl)
4286 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4287 }
4288 }
4289 break;
4290
4291
4292 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004293 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004294
4295 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004296 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004297
4298 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004299 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004300
4301 default:
4302 break;
4303 }
4304 }
4305 return num_functions;
4306}
4307
4308TypeMemberFunctionImpl
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004309ClangASTContext::GetMemberFunctionAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004310{
Greg Claytonfe689042015-11-10 17:47:04 +00004311 std::string name;
Greg Claytond8d4a572015-08-11 21:38:15 +00004312 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
Greg Claytonfe689042015-11-10 17:47:04 +00004313 CompilerType clang_type;
4314 CompilerDecl clang_decl;
Greg Claytond8d4a572015-08-11 21:38:15 +00004315 if (type)
4316 {
4317 clang::QualType qual_type(GetCanonicalQualType(type));
4318 switch (qual_type->getTypeClass()) {
4319 case clang::Type::Record:
4320 if (GetCompleteQualType (getASTContext(), qual_type))
4321 {
4322 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4323 const clang::RecordDecl *record_decl = record_type->getDecl();
4324 assert(record_decl);
4325 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4326 if (cxx_record_decl)
4327 {
4328 auto method_iter = cxx_record_decl->method_begin();
4329 auto method_end = cxx_record_decl->method_end();
4330 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4331 {
4332 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004333 clang::CXXMethodDecl *cxx_method_decl = method_iter->getCanonicalDecl();
4334 if (cxx_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004335 {
Greg Claytonfe689042015-11-10 17:47:04 +00004336 name = cxx_method_decl->getDeclName().getAsString();
4337 if (cxx_method_decl->isStatic())
Greg Claytond8d4a572015-08-11 21:38:15 +00004338 kind = lldb::eMemberFunctionKindStaticMethod;
Greg Claytonfe689042015-11-10 17:47:04 +00004339 else if (llvm::isa<clang::CXXConstructorDecl>(cxx_method_decl))
Greg Claytond8d4a572015-08-11 21:38:15 +00004340 kind = lldb::eMemberFunctionKindConstructor;
Greg Claytonfe689042015-11-10 17:47:04 +00004341 else if (llvm::isa<clang::CXXDestructorDecl>(cxx_method_decl))
Greg Claytond8d4a572015-08-11 21:38:15 +00004342 kind = lldb::eMemberFunctionKindDestructor;
4343 else
4344 kind = lldb::eMemberFunctionKindInstanceMethod;
Greg Claytonfe689042015-11-10 17:47:04 +00004345 clang_type = CompilerType(this, cxx_method_decl->getType().getAsOpaquePtr());
4346 clang_decl = CompilerDecl(this, cxx_method_decl);
Greg Claytond8d4a572015-08-11 21:38:15 +00004347 }
4348 }
4349 }
4350 }
4351 break;
4352
4353 case clang::Type::ObjCObjectPointer:
4354 if (GetCompleteType(type))
4355 {
4356 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4357 if (objc_class_type)
4358 {
4359 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4360 if (class_interface_decl)
4361 {
4362 auto method_iter = class_interface_decl->meth_begin();
4363 auto method_end = class_interface_decl->meth_end();
4364 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4365 {
4366 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004367 clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
4368 if (objc_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004369 {
Greg Claytonfe689042015-11-10 17:47:04 +00004370 clang_decl = CompilerDecl(this, objc_method_decl);
4371 name = objc_method_decl->getSelector().getAsString();
4372 if (objc_method_decl->isClassMethod())
Greg Claytond8d4a572015-08-11 21:38:15 +00004373 kind = lldb::eMemberFunctionKindStaticMethod;
4374 else
4375 kind = lldb::eMemberFunctionKindInstanceMethod;
4376 }
4377 }
4378 }
4379 }
4380 }
4381 break;
4382
4383 case clang::Type::ObjCObject:
4384 case clang::Type::ObjCInterface:
4385 if (GetCompleteType(type))
4386 {
4387 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4388 if (objc_class_type)
4389 {
4390 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4391 if (class_interface_decl)
4392 {
4393 auto method_iter = class_interface_decl->meth_begin();
4394 auto method_end = class_interface_decl->meth_end();
4395 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4396 {
4397 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004398 clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
4399 if (objc_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004400 {
Greg Claytonfe689042015-11-10 17:47:04 +00004401 clang_decl = CompilerDecl(this, objc_method_decl);
4402 name = objc_method_decl->getSelector().getAsString();
4403 if (objc_method_decl->isClassMethod())
Greg Claytond8d4a572015-08-11 21:38:15 +00004404 kind = lldb::eMemberFunctionKindStaticMethod;
4405 else
4406 kind = lldb::eMemberFunctionKindInstanceMethod;
4407 }
4408 }
4409 }
4410 }
4411 }
4412 break;
4413
4414 case clang::Type::Typedef:
4415 return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx);
4416
4417 case clang::Type::Elaborated:
4418 return GetMemberFunctionAtIndex(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx);
4419
4420 case clang::Type::Paren:
4421 return GetMemberFunctionAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx);
4422
4423 default:
4424 break;
4425 }
4426 }
4427
4428 if (kind == eMemberFunctionKindUnknown)
4429 return TypeMemberFunctionImpl();
Greg Claytonfe689042015-11-10 17:47:04 +00004430 else
4431 return TypeMemberFunctionImpl(clang_type, clang_decl, name, kind);
Greg Claytond8d4a572015-08-11 21:38:15 +00004432}
4433
Greg Claytona1e5dc82015-08-11 22:53:00 +00004434CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004435ClangASTContext::GetNonReferenceType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004436{
4437 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004438 return CompilerType(getASTContext(), GetQualType(type).getNonReferenceType());
4439 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004440}
4441
Greg Claytona1e5dc82015-08-11 22:53:00 +00004442CompilerType
4443ClangASTContext::CreateTypedefType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00004444 const char *typedef_name,
Greg Clayton99558cc42015-08-24 23:46:31 +00004445 const CompilerDeclContext &compiler_decl_ctx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004446{
4447 if (type && typedef_name && typedef_name[0])
4448 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004449 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004450 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004451 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004452 clang::ASTContext* clang_ast = ast->getASTContext();
4453 clang::QualType qual_type (GetQualType(type));
Greg Clayton99558cc42015-08-24 23:46:31 +00004454
4455 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004456 if (decl_ctx == nullptr)
4457 decl_ctx = ast->getASTContext()->getTranslationUnitDecl();
Greg Clayton99558cc42015-08-24 23:46:31 +00004458
Greg Claytond8d4a572015-08-11 21:38:15 +00004459 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4460 decl_ctx,
4461 clang::SourceLocation(),
4462 clang::SourceLocation(),
4463 &clang_ast->Idents.get(typedef_name),
4464 clang_ast->getTrivialTypeSourceInfo(qual_type));
4465
4466 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4467
4468 // Get a uniqued clang::QualType for the typedef decl type
Greg Claytona1e5dc82015-08-11 22:53:00 +00004469 return CompilerType (clang_ast, clang_ast->getTypedefType (decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00004470 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004471 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004472
4473}
4474
Greg Claytona1e5dc82015-08-11 22:53:00 +00004475CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004476ClangASTContext::GetPointeeType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004477{
4478 if (type)
4479 {
4480 clang::QualType qual_type(GetQualType(type));
Greg Claytona1e5dc82015-08-11 22:53:00 +00004481 return CompilerType (getASTContext(), qual_type.getTypePtr()->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004482 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004483 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004484}
4485
Greg Claytona1e5dc82015-08-11 22:53:00 +00004486CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004487ClangASTContext::GetPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004488{
4489 if (type)
4490 {
4491 clang::QualType qual_type (GetQualType(type));
4492
4493 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4494 switch (type_class)
4495 {
4496 case clang::Type::ObjCObject:
4497 case clang::Type::ObjCInterface:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004498 return CompilerType(getASTContext(), getASTContext()->getObjCObjectPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004499
4500 default:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004501 return CompilerType(getASTContext(), getASTContext()->getPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004502 }
4503 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004504 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004505}
4506
Greg Clayton56939cb2015-09-17 22:23:34 +00004507
4508CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004509ClangASTContext::GetLValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004510{
4511 if (type)
4512 return CompilerType(this, getASTContext()->getLValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4513 else
4514 return CompilerType();
4515}
4516
4517CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004518ClangASTContext::GetRValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004519{
4520 if (type)
4521 return CompilerType(this, getASTContext()->getRValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4522 else
4523 return CompilerType();
4524}
4525
4526CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004527ClangASTContext::AddConstModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004528{
4529 if (type)
4530 {
4531 clang::QualType result(GetQualType(type));
4532 result.addConst();
4533 return CompilerType (this, result.getAsOpaquePtr());
4534 }
4535 return CompilerType();
4536}
4537
4538CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004539ClangASTContext::AddVolatileModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004540{
4541 if (type)
4542 {
4543 clang::QualType result(GetQualType(type));
4544 result.addVolatile();
4545 return CompilerType (this, result.getAsOpaquePtr());
4546 }
4547 return CompilerType();
4548
4549}
4550
4551CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004552ClangASTContext::AddRestrictModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004553{
4554 if (type)
4555 {
4556 clang::QualType result(GetQualType(type));
4557 result.addRestrict();
4558 return CompilerType (this, result.getAsOpaquePtr());
4559 }
4560 return CompilerType();
4561
4562}
4563
4564CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004565ClangASTContext::CreateTypedef (lldb::opaque_compiler_type_t type, const char *typedef_name, const CompilerDeclContext &compiler_decl_ctx)
Greg Clayton56939cb2015-09-17 22:23:34 +00004566{
4567 if (type)
4568 {
4569 clang::ASTContext* clang_ast = getASTContext();
4570 clang::QualType qual_type (GetQualType(type));
4571
4572 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
4573 if (decl_ctx == nullptr)
4574 decl_ctx = getASTContext()->getTranslationUnitDecl();
4575
4576 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4577 decl_ctx,
4578 clang::SourceLocation(),
4579 clang::SourceLocation(),
4580 &clang_ast->Idents.get(typedef_name),
4581 clang_ast->getTrivialTypeSourceInfo(qual_type));
4582
4583 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4584
4585 // Get a uniqued clang::QualType for the typedef decl type
4586 return CompilerType (this, clang_ast->getTypedefType (decl).getAsOpaquePtr());
4587
4588 }
4589 return CompilerType();
4590
4591}
4592
Greg Claytona1e5dc82015-08-11 22:53:00 +00004593CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004594ClangASTContext::GetTypedefedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004595{
4596 if (type)
4597 {
4598 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
4599 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004600 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004601 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004602 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004603}
4604
Greg Claytona1e5dc82015-08-11 22:53:00 +00004605CompilerType
4606ClangASTContext::RemoveFastQualifiers (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004607{
Ryan Brown57bee1e2015-09-14 22:45:11 +00004608 if (IsClangType(type))
Greg Claytond8d4a572015-08-11 21:38:15 +00004609 {
4610 clang::QualType qual_type(GetQualType(type));
4611 qual_type.getQualifiers().removeFastQualifiers();
Greg Claytona1e5dc82015-08-11 22:53:00 +00004612 return CompilerType (type.GetTypeSystem(), qual_type.getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004613 }
4614 return type;
4615}
4616
4617
4618//----------------------------------------------------------------------
4619// Create related types using the current type's AST
4620//----------------------------------------------------------------------
4621
Greg Claytona1e5dc82015-08-11 22:53:00 +00004622CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00004623ClangASTContext::GetBasicTypeFromAST (lldb::BasicType basic_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004624{
Greg Clayton99558cc42015-08-24 23:46:31 +00004625 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004626}
4627//----------------------------------------------------------------------
4628// Exploring the type
4629//----------------------------------------------------------------------
4630
4631uint64_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004632ClangASTContext::GetBitSize (lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope)
Greg Claytond8d4a572015-08-11 21:38:15 +00004633{
4634 if (GetCompleteType (type))
4635 {
4636 clang::QualType qual_type(GetCanonicalQualType(type));
4637 switch (qual_type->getTypeClass())
4638 {
4639 case clang::Type::ObjCInterface:
4640 case clang::Type::ObjCObject:
4641 {
4642 ExecutionContext exe_ctx (exe_scope);
4643 Process *process = exe_ctx.GetProcessPtr();
4644 if (process)
4645 {
4646 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
4647 if (objc_runtime)
4648 {
4649 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00004650 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00004651 return bit_size;
4652 }
4653 }
4654 else
4655 {
4656 static bool g_printed = false;
4657 if (!g_printed)
4658 {
4659 StreamString s;
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00004660 DumpTypeDescription(type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00004661
4662 llvm::outs() << "warning: trying to determine the size of type ";
4663 llvm::outs() << s.GetString() << "\n";
4664 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
4665 llvm::outs() << "backtrace:\n";
4666 llvm::sys::PrintStackTrace(llvm::outs());
4667 llvm::outs() << "\n";
4668 g_printed = true;
4669 }
4670 }
4671 }
4672 // fallthrough
4673 default:
4674 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
4675 if (bit_size == 0)
4676 {
4677 if (qual_type->isIncompleteArrayType())
4678 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
4679 }
4680 if (qual_type->isObjCObjectOrInterfaceType())
4681 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
4682 return bit_size;
4683 }
4684 }
4685 return 0;
4686}
4687
4688size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004689ClangASTContext::GetTypeBitAlign (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004690{
4691 if (GetCompleteType(type))
4692 return getASTContext()->getTypeAlign(GetQualType(type));
4693 return 0;
4694}
4695
4696
4697lldb::Encoding
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004698ClangASTContext::GetEncoding (lldb::opaque_compiler_type_t type, uint64_t &count)
Greg Claytond8d4a572015-08-11 21:38:15 +00004699{
4700 if (!type)
4701 return lldb::eEncodingInvalid;
4702
4703 count = 1;
4704 clang::QualType qual_type(GetCanonicalQualType(type));
4705
4706 switch (qual_type->getTypeClass())
4707 {
4708 case clang::Type::UnaryTransform:
4709 break;
4710
4711 case clang::Type::FunctionNoProto:
4712 case clang::Type::FunctionProto:
4713 break;
4714
4715 case clang::Type::IncompleteArray:
4716 case clang::Type::VariableArray:
4717 break;
4718
4719 case clang::Type::ConstantArray:
4720 break;
4721
4722 case clang::Type::ExtVector:
4723 case clang::Type::Vector:
4724 // TODO: Set this to more than one???
4725 break;
4726
4727 case clang::Type::Builtin:
4728 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4729 {
Greg Claytond8d4a572015-08-11 21:38:15 +00004730 case clang::BuiltinType::Void:
4731 break;
4732
4733 case clang::BuiltinType::Bool:
4734 case clang::BuiltinType::Char_S:
4735 case clang::BuiltinType::SChar:
4736 case clang::BuiltinType::WChar_S:
4737 case clang::BuiltinType::Char16:
4738 case clang::BuiltinType::Char32:
4739 case clang::BuiltinType::Short:
4740 case clang::BuiltinType::Int:
4741 case clang::BuiltinType::Long:
4742 case clang::BuiltinType::LongLong:
4743 case clang::BuiltinType::Int128: return lldb::eEncodingSint;
4744
4745 case clang::BuiltinType::Char_U:
4746 case clang::BuiltinType::UChar:
4747 case clang::BuiltinType::WChar_U:
4748 case clang::BuiltinType::UShort:
4749 case clang::BuiltinType::UInt:
4750 case clang::BuiltinType::ULong:
4751 case clang::BuiltinType::ULongLong:
4752 case clang::BuiltinType::UInt128: return lldb::eEncodingUint;
4753
Greg Claytondee40e72015-11-03 23:23:22 +00004754 case clang::BuiltinType::Half:
Greg Claytond8d4a572015-08-11 21:38:15 +00004755 case clang::BuiltinType::Float:
4756 case clang::BuiltinType::Double:
4757 case clang::BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
4758
4759 case clang::BuiltinType::ObjCClass:
4760 case clang::BuiltinType::ObjCId:
4761 case clang::BuiltinType::ObjCSel: return lldb::eEncodingUint;
4762
4763 case clang::BuiltinType::NullPtr: return lldb::eEncodingUint;
4764
4765 case clang::BuiltinType::Kind::ARCUnbridgedCast:
4766 case clang::BuiltinType::Kind::BoundMember:
4767 case clang::BuiltinType::Kind::BuiltinFn:
4768 case clang::BuiltinType::Kind::Dependent:
Ed Mastec6dd6512015-09-23 18:32:34 +00004769 case clang::BuiltinType::Kind::OCLClkEvent:
Greg Claytond8d4a572015-08-11 21:38:15 +00004770 case clang::BuiltinType::Kind::OCLEvent:
4771 case clang::BuiltinType::Kind::OCLImage1d:
4772 case clang::BuiltinType::Kind::OCLImage1dArray:
4773 case clang::BuiltinType::Kind::OCLImage1dBuffer:
4774 case clang::BuiltinType::Kind::OCLImage2d:
4775 case clang::BuiltinType::Kind::OCLImage2dArray:
Ed Mastec6dd6512015-09-23 18:32:34 +00004776 case clang::BuiltinType::Kind::OCLImage2dArrayDepth:
4777 case clang::BuiltinType::Kind::OCLImage2dArrayMSAA:
4778 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepth:
4779 case clang::BuiltinType::Kind::OCLImage2dDepth:
4780 case clang::BuiltinType::Kind::OCLImage2dMSAA:
4781 case clang::BuiltinType::Kind::OCLImage2dMSAADepth:
Greg Claytond8d4a572015-08-11 21:38:15 +00004782 case clang::BuiltinType::Kind::OCLImage3d:
Ed Mastec6dd6512015-09-23 18:32:34 +00004783 case clang::BuiltinType::Kind::OCLQueue:
4784 case clang::BuiltinType::Kind::OCLNDRange:
4785 case clang::BuiltinType::Kind::OCLReserveID:
Greg Claytond8d4a572015-08-11 21:38:15 +00004786 case clang::BuiltinType::Kind::OCLSampler:
Ed Mastec6dd6512015-09-23 18:32:34 +00004787 case clang::BuiltinType::Kind::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00004788 case clang::BuiltinType::Kind::Overload:
4789 case clang::BuiltinType::Kind::PseudoObject:
4790 case clang::BuiltinType::Kind::UnknownAny:
4791 break;
4792 }
4793 break;
4794 // All pointer types are represented as unsigned integer encodings.
4795 // We may nee to add a eEncodingPointer if we ever need to know the
4796 // difference
4797 case clang::Type::ObjCObjectPointer:
4798 case clang::Type::BlockPointer:
4799 case clang::Type::Pointer:
4800 case clang::Type::LValueReference:
4801 case clang::Type::RValueReference:
4802 case clang::Type::MemberPointer: return lldb::eEncodingUint;
4803 case clang::Type::Complex:
4804 {
4805 lldb::Encoding encoding = lldb::eEncodingIEEE754;
4806 if (qual_type->isComplexType())
4807 encoding = lldb::eEncodingIEEE754;
4808 else
4809 {
4810 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
4811 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004812 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004813 else
4814 encoding = lldb::eEncodingSint;
4815 }
4816 count = 2;
4817 return encoding;
4818 }
4819
4820 case clang::Type::ObjCInterface: break;
4821 case clang::Type::Record: break;
4822 case clang::Type::Enum: return lldb::eEncodingSint;
4823 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004824 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004825
4826 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004827 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004828
4829 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004830 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00004831
4832 case clang::Type::DependentSizedArray:
4833 case clang::Type::DependentSizedExtVector:
4834 case clang::Type::UnresolvedUsing:
4835 case clang::Type::Attributed:
4836 case clang::Type::TemplateTypeParm:
4837 case clang::Type::SubstTemplateTypeParm:
4838 case clang::Type::SubstTemplateTypeParmPack:
4839 case clang::Type::Auto:
4840 case clang::Type::InjectedClassName:
4841 case clang::Type::DependentName:
4842 case clang::Type::DependentTemplateSpecialization:
4843 case clang::Type::PackExpansion:
4844 case clang::Type::ObjCObject:
4845
4846 case clang::Type::TypeOfExpr:
4847 case clang::Type::TypeOf:
4848 case clang::Type::Decltype:
4849 case clang::Type::TemplateSpecialization:
4850 case clang::Type::Atomic:
4851 case clang::Type::Adjusted:
4852 break;
4853
4854 // pointer type decayed from an array or function type.
4855 case clang::Type::Decayed:
4856 break;
4857 }
4858 count = 0;
4859 return lldb::eEncodingInvalid;
4860}
4861
4862lldb::Format
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004863ClangASTContext::GetFormat (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004864{
4865 if (!type)
4866 return lldb::eFormatDefault;
4867
4868 clang::QualType qual_type(GetCanonicalQualType(type));
4869
4870 switch (qual_type->getTypeClass())
4871 {
4872 case clang::Type::UnaryTransform:
4873 break;
4874
4875 case clang::Type::FunctionNoProto:
4876 case clang::Type::FunctionProto:
4877 break;
4878
4879 case clang::Type::IncompleteArray:
4880 case clang::Type::VariableArray:
4881 break;
4882
4883 case clang::Type::ConstantArray:
4884 return lldb::eFormatVoid; // no value
4885
4886 case clang::Type::ExtVector:
4887 case clang::Type::Vector:
4888 break;
4889
4890 case clang::Type::Builtin:
4891 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4892 {
4893 //default: assert(0 && "Unknown builtin type!");
4894 case clang::BuiltinType::UnknownAny:
4895 case clang::BuiltinType::Void:
4896 case clang::BuiltinType::BoundMember:
4897 break;
4898
4899 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
4900 case clang::BuiltinType::Char_S:
4901 case clang::BuiltinType::SChar:
4902 case clang::BuiltinType::WChar_S:
4903 case clang::BuiltinType::Char_U:
4904 case clang::BuiltinType::UChar:
4905 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
4906 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
4907 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
4908 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
4909 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
4910 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
4911 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
4912 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
4913 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
4914 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
4915 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
4916 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
4917 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
Greg Claytondee40e72015-11-03 23:23:22 +00004918 case clang::BuiltinType::Half:
4919 case clang::BuiltinType::Float:
4920 case clang::BuiltinType::Double:
Greg Claytond8d4a572015-08-11 21:38:15 +00004921 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
Zachary Turnerdd07e002015-09-16 18:08:45 +00004922 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00004923 return lldb::eFormatHex;
4924 }
4925 break;
4926 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
4927 case clang::Type::BlockPointer: return lldb::eFormatHex;
4928 case clang::Type::Pointer: return lldb::eFormatHex;
4929 case clang::Type::LValueReference:
4930 case clang::Type::RValueReference: return lldb::eFormatHex;
4931 case clang::Type::MemberPointer: break;
4932 case clang::Type::Complex:
4933 {
4934 if (qual_type->isComplexType())
4935 return lldb::eFormatComplex;
4936 else
4937 return lldb::eFormatComplexInteger;
4938 }
4939 case clang::Type::ObjCInterface: break;
4940 case clang::Type::Record: break;
4941 case clang::Type::Enum: return lldb::eFormatEnum;
4942 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004943 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004944 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004945 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004946 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004947 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004948 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004949 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00004950 case clang::Type::DependentSizedArray:
4951 case clang::Type::DependentSizedExtVector:
4952 case clang::Type::UnresolvedUsing:
4953 case clang::Type::Attributed:
4954 case clang::Type::TemplateTypeParm:
4955 case clang::Type::SubstTemplateTypeParm:
4956 case clang::Type::SubstTemplateTypeParmPack:
4957 case clang::Type::InjectedClassName:
4958 case clang::Type::DependentName:
4959 case clang::Type::DependentTemplateSpecialization:
4960 case clang::Type::PackExpansion:
4961 case clang::Type::ObjCObject:
4962
4963 case clang::Type::TypeOfExpr:
4964 case clang::Type::TypeOf:
4965 case clang::Type::Decltype:
4966 case clang::Type::TemplateSpecialization:
4967 case clang::Type::Atomic:
4968 case clang::Type::Adjusted:
4969 break;
4970
4971 // pointer type decayed from an array or function type.
4972 case clang::Type::Decayed:
4973 break;
4974 }
4975 // We don't know hot to display this type...
4976 return lldb::eFormatBytes;
4977}
4978
4979static bool
4980ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
4981{
4982 while (class_interface_decl)
4983 {
4984 if (class_interface_decl->ivar_size() > 0)
4985 return true;
4986
4987 if (check_superclass)
4988 class_interface_decl = class_interface_decl->getSuperClass();
4989 else
4990 break;
4991 }
4992 return false;
4993}
4994
4995uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004996ClangASTContext::GetNumChildren (lldb::opaque_compiler_type_t type, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00004997{
4998 if (!type)
4999 return 0;
5000
5001 uint32_t num_children = 0;
5002 clang::QualType qual_type(GetQualType(type));
5003 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5004 switch (type_class)
5005 {
5006 case clang::Type::Builtin:
5007 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5008 {
5009 case clang::BuiltinType::ObjCId: // child is Class
5010 case clang::BuiltinType::ObjCClass: // child is Class
5011 num_children = 1;
5012 break;
5013
5014 default:
5015 break;
5016 }
5017 break;
5018
5019 case clang::Type::Complex: return 0;
5020
5021 case clang::Type::Record:
5022 if (GetCompleteQualType (getASTContext(), qual_type))
5023 {
5024 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5025 const clang::RecordDecl *record_decl = record_type->getDecl();
5026 assert(record_decl);
5027 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5028 if (cxx_record_decl)
5029 {
5030 if (omit_empty_base_classes)
5031 {
5032 // Check each base classes to see if it or any of its
5033 // base classes contain any fields. This can help
5034 // limit the noise in variable views by not having to
5035 // show base classes that contain no members.
5036 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5037 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5038 base_class != base_class_end;
5039 ++base_class)
5040 {
5041 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5042
5043 // Skip empty base classes
5044 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5045 continue;
5046
5047 num_children++;
5048 }
5049 }
5050 else
5051 {
5052 // Include all base classes
5053 num_children += cxx_record_decl->getNumBases();
5054 }
5055
5056 }
5057 clang::RecordDecl::field_iterator field, field_end;
5058 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5059 ++num_children;
5060 }
5061 break;
5062
5063 case clang::Type::ObjCObject:
5064 case clang::Type::ObjCInterface:
5065 if (GetCompleteQualType (getASTContext(), qual_type))
5066 {
5067 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5068 assert (objc_class_type);
5069 if (objc_class_type)
5070 {
5071 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5072
5073 if (class_interface_decl)
5074 {
5075
5076 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5077 if (superclass_interface_decl)
5078 {
5079 if (omit_empty_base_classes)
5080 {
5081 if (ObjCDeclHasIVars (superclass_interface_decl, true))
5082 ++num_children;
5083 }
5084 else
5085 ++num_children;
5086 }
5087
5088 num_children += class_interface_decl->ivar_size();
5089 }
5090 }
5091 }
5092 break;
5093
5094 case clang::Type::ObjCObjectPointer:
5095 {
5096 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
5097 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005098 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005099 // If this type points to a simple type, then it has 1 child
5100 if (num_pointee_children == 0)
5101 num_children = 1;
5102 else
5103 num_children = num_pointee_children;
5104 }
5105 break;
5106
5107 case clang::Type::Vector:
5108 case clang::Type::ExtVector:
5109 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
5110 break;
5111
5112 case clang::Type::ConstantArray:
5113 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
5114 break;
5115
5116 case clang::Type::Pointer:
5117 {
5118 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
5119 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00005120 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005121 if (num_pointee_children == 0)
5122 {
5123 // We have a pointer to a pointee type that claims it has no children.
5124 // We will want to look at
5125 num_children = GetNumPointeeChildren (pointee_type);
5126 }
5127 else
5128 num_children = num_pointee_children;
5129 }
5130 break;
5131
5132 case clang::Type::LValueReference:
5133 case clang::Type::RValueReference:
5134 {
5135 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
5136 clang::QualType pointee_type = reference_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005137 uint32_t num_pointee_children = CompilerType (getASTContext(), pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005138 // If this type points to a simple type, then it has 1 child
5139 if (num_pointee_children == 0)
5140 num_children = 1;
5141 else
5142 num_children = num_pointee_children;
5143 }
5144 break;
5145
5146
5147 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005148 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005149 break;
5150
5151 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005152 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005153 break;
5154
5155 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005156 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005157 break;
5158 default:
5159 break;
5160 }
5161 return num_children;
5162}
5163
Greg Clayton56939cb2015-09-17 22:23:34 +00005164CompilerType
5165ClangASTContext::GetBuiltinTypeByName (const ConstString &name)
5166{
5167 return GetBasicType (GetBasicTypeEnumeration (name));
5168}
5169
Greg Claytond8d4a572015-08-11 21:38:15 +00005170lldb::BasicType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005171ClangASTContext::GetBasicTypeEnumeration (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005172{
5173 if (type)
5174 {
5175 clang::QualType qual_type(GetQualType(type));
5176 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5177 if (type_class == clang::Type::Builtin)
5178 {
5179 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5180 {
5181 case clang::BuiltinType::Void: return eBasicTypeVoid;
5182 case clang::BuiltinType::Bool: return eBasicTypeBool;
5183 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
5184 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
5185 case clang::BuiltinType::Char16: return eBasicTypeChar16;
5186 case clang::BuiltinType::Char32: return eBasicTypeChar32;
5187 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
5188 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
5189 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
5190 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
5191 case clang::BuiltinType::Short: return eBasicTypeShort;
5192 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
5193 case clang::BuiltinType::Int: return eBasicTypeInt;
5194 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
5195 case clang::BuiltinType::Long: return eBasicTypeLong;
5196 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
5197 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
5198 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
5199 case clang::BuiltinType::Int128: return eBasicTypeInt128;
5200 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
5201
5202 case clang::BuiltinType::Half: return eBasicTypeHalf;
5203 case clang::BuiltinType::Float: return eBasicTypeFloat;
5204 case clang::BuiltinType::Double: return eBasicTypeDouble;
5205 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
5206
5207 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
5208 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
5209 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
5210 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005211 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00005212 return eBasicTypeOther;
5213 }
5214 }
5215 }
5216 return eBasicTypeInvalid;
5217}
5218
Greg Clayton99558cc42015-08-24 23:46:31 +00005219void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005220ClangASTContext::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 +00005221{
5222 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
5223 if (enum_type)
5224 {
5225 const clang::EnumDecl *enum_decl = enum_type->getDecl();
5226 if (enum_decl)
5227 {
5228 CompilerType integer_type(this, enum_decl->getIntegerType().getAsOpaquePtr());
5229
5230 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
5231 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
5232 {
5233 ConstString name(enum_pos->getNameAsString().c_str());
5234 if (!callback (integer_type, name, enum_pos->getInitVal()))
5235 break;
5236 }
5237 }
5238 }
5239}
5240
Greg Claytond8d4a572015-08-11 21:38:15 +00005241
5242#pragma mark Aggregate Types
5243
5244uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005245ClangASTContext::GetNumFields (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005246{
5247 if (!type)
5248 return 0;
5249
5250 uint32_t count = 0;
5251 clang::QualType qual_type(GetCanonicalQualType(type));
5252 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5253 switch (type_class)
5254 {
5255 case clang::Type::Record:
5256 if (GetCompleteType(type))
5257 {
5258 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
5259 if (record_type)
5260 {
5261 clang::RecordDecl *record_decl = record_type->getDecl();
5262 if (record_decl)
5263 {
5264 uint32_t field_idx = 0;
5265 clang::RecordDecl::field_iterator field, field_end;
5266 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5267 ++field_idx;
5268 count = field_idx;
5269 }
5270 }
5271 }
5272 break;
5273
5274 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005275 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005276 break;
5277
5278 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005279 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005280 break;
5281
5282 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005283 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005284 break;
5285
5286 case clang::Type::ObjCObjectPointer:
5287 if (GetCompleteType(type))
5288 {
5289 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5290 if (objc_class_type)
5291 {
5292 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
5293
5294 if (class_interface_decl)
5295 count = class_interface_decl->ivar_size();
5296 }
5297 }
5298 break;
5299
5300 case clang::Type::ObjCObject:
5301 case clang::Type::ObjCInterface:
5302 if (GetCompleteType(type))
5303 {
5304 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5305 if (objc_class_type)
5306 {
5307 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5308
5309 if (class_interface_decl)
5310 count = class_interface_decl->ivar_size();
5311 }
5312 }
5313 break;
5314
5315 default:
5316 break;
5317 }
5318 return count;
5319}
5320
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005321static lldb::opaque_compiler_type_t
Greg Claytond8d4a572015-08-11 21:38:15 +00005322GetObjCFieldAtIndex (clang::ASTContext *ast,
5323 clang::ObjCInterfaceDecl *class_interface_decl,
5324 size_t idx,
5325 std::string& name,
5326 uint64_t *bit_offset_ptr,
5327 uint32_t *bitfield_bit_size_ptr,
5328 bool *is_bitfield_ptr)
5329{
5330 if (class_interface_decl)
5331 {
5332 if (idx < (class_interface_decl->ivar_size()))
5333 {
5334 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5335 uint32_t ivar_idx = 0;
5336
5337 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
5338 {
5339 if (ivar_idx == idx)
5340 {
5341 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5342
5343 clang::QualType ivar_qual_type(ivar_decl->getType());
5344
5345 name.assign(ivar_decl->getNameAsString());
5346
5347 if (bit_offset_ptr)
5348 {
5349 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
5350 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
5351 }
5352
5353 const bool is_bitfield = ivar_pos->isBitField();
5354
5355 if (bitfield_bit_size_ptr)
5356 {
5357 *bitfield_bit_size_ptr = 0;
5358
5359 if (is_bitfield && ast)
5360 {
5361 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
5362 llvm::APSInt bitfield_apsint;
5363 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
5364 {
5365 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5366 }
5367 }
5368 }
5369 if (is_bitfield_ptr)
5370 *is_bitfield_ptr = is_bitfield;
5371
5372 return ivar_qual_type.getAsOpaquePtr();
5373 }
5374 }
5375 }
5376 }
5377 return nullptr;
5378}
5379
Greg Claytona1e5dc82015-08-11 22:53:00 +00005380CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005381ClangASTContext::GetFieldAtIndex (lldb::opaque_compiler_type_t type, size_t idx,
Greg Claytond8d4a572015-08-11 21:38:15 +00005382 std::string& name,
5383 uint64_t *bit_offset_ptr,
5384 uint32_t *bitfield_bit_size_ptr,
5385 bool *is_bitfield_ptr)
5386{
5387 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005388 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005389
5390 clang::QualType qual_type(GetCanonicalQualType(type));
5391 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5392 switch (type_class)
5393 {
5394 case clang::Type::Record:
5395 if (GetCompleteType(type))
5396 {
5397 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5398 const clang::RecordDecl *record_decl = record_type->getDecl();
5399 uint32_t field_idx = 0;
5400 clang::RecordDecl::field_iterator field, field_end;
5401 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
5402 {
5403 if (idx == field_idx)
5404 {
5405 // Print the member type if requested
5406 // Print the member name and equal sign
5407 name.assign(field->getNameAsString());
5408
5409 // Figure out the type byte size (field_type_info.first) and
5410 // alignment (field_type_info.second) from the AST context.
5411 if (bit_offset_ptr)
5412 {
5413 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5414 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5415 }
5416
5417 const bool is_bitfield = field->isBitField();
5418
5419 if (bitfield_bit_size_ptr)
5420 {
5421 *bitfield_bit_size_ptr = 0;
5422
5423 if (is_bitfield)
5424 {
5425 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5426 llvm::APSInt bitfield_apsint;
5427 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5428 {
5429 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5430 }
5431 }
5432 }
5433 if (is_bitfield_ptr)
5434 *is_bitfield_ptr = is_bitfield;
5435
Greg Claytona1e5dc82015-08-11 22:53:00 +00005436 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005437 }
5438 }
5439 }
5440 break;
5441
5442 case clang::Type::ObjCObjectPointer:
5443 if (GetCompleteType(type))
5444 {
5445 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5446 if (objc_class_type)
5447 {
5448 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005449 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 +00005450 }
5451 }
5452 break;
5453
5454 case clang::Type::ObjCObject:
5455 case clang::Type::ObjCInterface:
5456 if (GetCompleteType(type))
5457 {
5458 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5459 assert (objc_class_type);
5460 if (objc_class_type)
5461 {
5462 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005463 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 +00005464 }
5465 }
5466 break;
5467
5468
5469 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005470 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005471 GetFieldAtIndex (idx,
5472 name,
5473 bit_offset_ptr,
5474 bitfield_bit_size_ptr,
5475 is_bitfield_ptr);
5476
5477 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005478 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005479 GetFieldAtIndex (idx,
5480 name,
5481 bit_offset_ptr,
5482 bitfield_bit_size_ptr,
5483 is_bitfield_ptr);
5484
5485 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005486 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005487 GetFieldAtIndex (idx,
5488 name,
5489 bit_offset_ptr,
5490 bitfield_bit_size_ptr,
5491 is_bitfield_ptr);
5492
5493 default:
5494 break;
5495 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005496 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005497}
5498
Greg Clayton99558cc42015-08-24 23:46:31 +00005499uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005500ClangASTContext::GetNumDirectBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005501{
5502 uint32_t count = 0;
5503 clang::QualType qual_type(GetCanonicalQualType(type));
5504 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5505 switch (type_class)
5506 {
5507 case clang::Type::Record:
5508 if (GetCompleteType(type))
5509 {
5510 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5511 if (cxx_record_decl)
5512 count = cxx_record_decl->getNumBases();
5513 }
5514 break;
5515
5516 case clang::Type::ObjCObjectPointer:
5517 count = GetPointeeType(type).GetNumDirectBaseClasses();
5518 break;
5519
5520 case clang::Type::ObjCObject:
5521 if (GetCompleteType(type))
5522 {
5523 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5524 if (objc_class_type)
5525 {
5526 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5527
5528 if (class_interface_decl && class_interface_decl->getSuperClass())
5529 count = 1;
5530 }
5531 }
5532 break;
5533 case clang::Type::ObjCInterface:
5534 if (GetCompleteType(type))
5535 {
5536 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5537 if (objc_interface_type)
5538 {
5539 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5540
5541 if (class_interface_decl && class_interface_decl->getSuperClass())
5542 count = 1;
5543 }
5544 }
5545 break;
5546
5547
5548 case clang::Type::Typedef:
5549 count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5550 break;
5551
5552 case clang::Type::Elaborated:
5553 count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5554 break;
5555
5556 case clang::Type::Paren:
5557 return GetNumDirectBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5558
5559 default:
5560 break;
5561 }
5562 return count;
5563
5564}
5565
5566uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005567ClangASTContext::GetNumVirtualBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005568{
5569 uint32_t count = 0;
5570 clang::QualType qual_type(GetCanonicalQualType(type));
5571 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5572 switch (type_class)
5573 {
5574 case clang::Type::Record:
5575 if (GetCompleteType(type))
5576 {
5577 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5578 if (cxx_record_decl)
5579 count = cxx_record_decl->getNumVBases();
5580 }
5581 break;
5582
5583 case clang::Type::Typedef:
5584 count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
5585 break;
5586
5587 case clang::Type::Elaborated:
5588 count = GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
5589 break;
5590
5591 case clang::Type::Paren:
5592 count = GetNumVirtualBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
5593 break;
5594
5595 default:
5596 break;
5597 }
5598 return count;
5599
5600}
5601
5602CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005603ClangASTContext::GetDirectBaseClassAtIndex (lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00005604{
5605 clang::QualType qual_type(GetCanonicalQualType(type));
5606 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5607 switch (type_class)
5608 {
5609 case clang::Type::Record:
5610 if (GetCompleteType(type))
5611 {
5612 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5613 if (cxx_record_decl)
5614 {
5615 uint32_t curr_idx = 0;
5616 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5617 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5618 base_class != base_class_end;
5619 ++base_class, ++curr_idx)
5620 {
5621 if (curr_idx == idx)
5622 {
5623 if (bit_offset_ptr)
5624 {
5625 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5626 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5627 if (base_class->isVirtual())
5628 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5629 else
5630 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5631 }
5632 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5633 }
5634 }
5635 }
5636 }
5637 break;
5638
5639 case clang::Type::ObjCObjectPointer:
5640 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
5641
5642 case clang::Type::ObjCObject:
5643 if (idx == 0 && GetCompleteType(type))
5644 {
5645 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5646 if (objc_class_type)
5647 {
5648 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5649
5650 if (class_interface_decl)
5651 {
5652 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5653 if (superclass_interface_decl)
5654 {
5655 if (bit_offset_ptr)
5656 *bit_offset_ptr = 0;
5657 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5658 }
5659 }
5660 }
5661 }
5662 break;
5663 case clang::Type::ObjCInterface:
5664 if (idx == 0 && GetCompleteType(type))
5665 {
5666 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5667 if (objc_interface_type)
5668 {
5669 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
5670
5671 if (class_interface_decl)
5672 {
5673 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5674 if (superclass_interface_decl)
5675 {
5676 if (bit_offset_ptr)
5677 *bit_offset_ptr = 0;
5678 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
5679 }
5680 }
5681 }
5682 }
5683 break;
5684
5685
5686 case clang::Type::Typedef:
5687 return GetDirectBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5688
5689 case clang::Type::Elaborated:
5690 return GetDirectBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5691
5692 case clang::Type::Paren:
5693 return GetDirectBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5694
5695 default:
5696 break;
5697 }
5698 return CompilerType();
5699}
5700
5701CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005702ClangASTContext::GetVirtualBaseClassAtIndex (lldb::opaque_compiler_type_t type,
Greg Clayton99558cc42015-08-24 23:46:31 +00005703 size_t idx,
5704 uint32_t *bit_offset_ptr)
5705{
5706 clang::QualType qual_type(GetCanonicalQualType(type));
5707 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5708 switch (type_class)
5709 {
5710 case clang::Type::Record:
5711 if (GetCompleteType(type))
5712 {
5713 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5714 if (cxx_record_decl)
5715 {
5716 uint32_t curr_idx = 0;
5717 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5718 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
5719 base_class != base_class_end;
5720 ++base_class, ++curr_idx)
5721 {
5722 if (curr_idx == idx)
5723 {
5724 if (bit_offset_ptr)
5725 {
5726 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
5727 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5728 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5729
5730 }
5731 return CompilerType (this, base_class->getType().getAsOpaquePtr());
5732 }
5733 }
5734 }
5735 }
5736 break;
5737
5738 case clang::Type::Typedef:
5739 return GetVirtualBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
5740
5741 case clang::Type::Elaborated:
5742 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
5743
5744 case clang::Type::Paren:
5745 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
5746
5747 default:
5748 break;
5749 }
5750 return CompilerType();
5751
5752}
5753
Greg Claytond8d4a572015-08-11 21:38:15 +00005754// If a pointer to a pointee type (the clang_type arg) says that it has no
5755// children, then we either need to trust it, or override it and return a
5756// different result. For example, an "int *" has one child that is an integer,
5757// but a function pointer doesn't have any children. Likewise if a Record type
5758// claims it has no children, then there really is nothing to show.
5759uint32_t
5760ClangASTContext::GetNumPointeeChildren (clang::QualType type)
5761{
5762 if (type.isNull())
5763 return 0;
5764
5765 clang::QualType qual_type(type.getCanonicalType());
5766 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5767 switch (type_class)
5768 {
5769 case clang::Type::Builtin:
5770 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5771 {
5772 case clang::BuiltinType::UnknownAny:
5773 case clang::BuiltinType::Void:
5774 case clang::BuiltinType::NullPtr:
5775 case clang::BuiltinType::OCLEvent:
5776 case clang::BuiltinType::OCLImage1d:
5777 case clang::BuiltinType::OCLImage1dArray:
5778 case clang::BuiltinType::OCLImage1dBuffer:
5779 case clang::BuiltinType::OCLImage2d:
5780 case clang::BuiltinType::OCLImage2dArray:
5781 case clang::BuiltinType::OCLImage3d:
5782 case clang::BuiltinType::OCLSampler:
5783 return 0;
5784 case clang::BuiltinType::Bool:
5785 case clang::BuiltinType::Char_U:
5786 case clang::BuiltinType::UChar:
5787 case clang::BuiltinType::WChar_U:
5788 case clang::BuiltinType::Char16:
5789 case clang::BuiltinType::Char32:
5790 case clang::BuiltinType::UShort:
5791 case clang::BuiltinType::UInt:
5792 case clang::BuiltinType::ULong:
5793 case clang::BuiltinType::ULongLong:
5794 case clang::BuiltinType::UInt128:
5795 case clang::BuiltinType::Char_S:
5796 case clang::BuiltinType::SChar:
5797 case clang::BuiltinType::WChar_S:
5798 case clang::BuiltinType::Short:
5799 case clang::BuiltinType::Int:
5800 case clang::BuiltinType::Long:
5801 case clang::BuiltinType::LongLong:
5802 case clang::BuiltinType::Int128:
5803 case clang::BuiltinType::Float:
5804 case clang::BuiltinType::Double:
5805 case clang::BuiltinType::LongDouble:
5806 case clang::BuiltinType::Dependent:
5807 case clang::BuiltinType::Overload:
5808 case clang::BuiltinType::ObjCId:
5809 case clang::BuiltinType::ObjCClass:
5810 case clang::BuiltinType::ObjCSel:
5811 case clang::BuiltinType::BoundMember:
5812 case clang::BuiltinType::Half:
5813 case clang::BuiltinType::ARCUnbridgedCast:
5814 case clang::BuiltinType::PseudoObject:
5815 case clang::BuiltinType::BuiltinFn:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00005816 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00005817 return 1;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005818 default:
5819 return 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00005820 }
5821 break;
5822
5823 case clang::Type::Complex: return 1;
5824 case clang::Type::Pointer: return 1;
5825 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
5826 case clang::Type::LValueReference: return 1;
5827 case clang::Type::RValueReference: return 1;
5828 case clang::Type::MemberPointer: return 0;
5829 case clang::Type::ConstantArray: return 0;
5830 case clang::Type::IncompleteArray: return 0;
5831 case clang::Type::VariableArray: return 0;
5832 case clang::Type::DependentSizedArray: return 0;
5833 case clang::Type::DependentSizedExtVector: return 0;
5834 case clang::Type::Vector: return 0;
5835 case clang::Type::ExtVector: return 0;
5836 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
5837 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
5838 case clang::Type::UnresolvedUsing: return 0;
5839 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
5840 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
5841 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
5842 case clang::Type::TypeOfExpr: return 0;
5843 case clang::Type::TypeOf: return 0;
5844 case clang::Type::Decltype: return 0;
5845 case clang::Type::Record: return 0;
5846 case clang::Type::Enum: return 1;
5847 case clang::Type::TemplateTypeParm: return 1;
5848 case clang::Type::SubstTemplateTypeParm: return 1;
5849 case clang::Type::TemplateSpecialization: return 1;
5850 case clang::Type::InjectedClassName: return 0;
5851 case clang::Type::DependentName: return 1;
5852 case clang::Type::DependentTemplateSpecialization: return 1;
5853 case clang::Type::ObjCObject: return 0;
5854 case clang::Type::ObjCInterface: return 0;
5855 case clang::Type::ObjCObjectPointer: return 1;
5856 default:
5857 break;
5858 }
5859 return 0;
5860}
5861
5862
Greg Claytona1e5dc82015-08-11 22:53:00 +00005863CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005864ClangASTContext::GetChildCompilerTypeAtIndex (lldb::opaque_compiler_type_t type,
Bruce Mitchener4ad83342015-09-21 16:48:48 +00005865 ExecutionContext *exe_ctx,
5866 size_t idx,
5867 bool transparent_pointers,
5868 bool omit_empty_base_classes,
5869 bool ignore_array_bounds,
5870 std::string& child_name,
5871 uint32_t &child_byte_size,
5872 int32_t &child_byte_offset,
5873 uint32_t &child_bitfield_bit_size,
5874 uint32_t &child_bitfield_bit_offset,
5875 bool &child_is_base_class,
5876 bool &child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00005877 ValueObject *valobj,
5878 uint64_t &language_flags)
Greg Claytond8d4a572015-08-11 21:38:15 +00005879{
5880 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005881 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005882
5883 clang::QualType parent_qual_type(GetCanonicalQualType(type));
5884 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
5885 child_bitfield_bit_size = 0;
5886 child_bitfield_bit_offset = 0;
5887 child_is_base_class = false;
Enrico Granatadc62ffd2015-11-09 19:27:34 +00005888 language_flags = 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00005889
5890 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
5891 uint32_t bit_offset;
5892 switch (parent_type_class)
5893 {
5894 case clang::Type::Builtin:
5895 if (idx_is_valid)
5896 {
5897 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
5898 {
5899 case clang::BuiltinType::ObjCId:
5900 case clang::BuiltinType::ObjCClass:
5901 child_name = "isa";
5902 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005903 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00005904
5905 default:
5906 break;
5907 }
5908 }
5909 break;
5910
5911 case clang::Type::Record:
5912 if (idx_is_valid && GetCompleteType(type))
5913 {
5914 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
5915 const clang::RecordDecl *record_decl = record_type->getDecl();
5916 assert(record_decl);
5917 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5918 uint32_t child_idx = 0;
5919
5920 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5921 if (cxx_record_decl)
5922 {
5923 // We might have base classes to print out first
5924 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5925 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5926 base_class != base_class_end;
5927 ++base_class)
5928 {
5929 const clang::CXXRecordDecl *base_class_decl = nullptr;
5930
5931 // Skip empty base classes
5932 if (omit_empty_base_classes)
5933 {
5934 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5935 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5936 continue;
5937 }
5938
5939 if (idx == child_idx)
5940 {
5941 if (base_class_decl == nullptr)
5942 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5943
5944
5945 if (base_class->isVirtual())
5946 {
5947 bool handled = false;
5948 if (valobj)
5949 {
5950 Error err;
5951 AddressType addr_type = eAddressTypeInvalid;
5952 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
5953
5954 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
5955 {
5956
5957 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
5958 Process *process = exe_ctx.GetProcessPtr();
5959 if (process)
5960 {
5961 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
5962 if (vtable_ctx)
5963 {
5964 if (vtable_ctx->isMicrosoft())
5965 {
5966 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
5967
5968 if (vtable_ptr_addr)
5969 {
5970 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
5971
5972 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
5973 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
5974 {
5975 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
5976 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
5977 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
5978 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5979 if (base_offset != UINT32_MAX)
5980 {
5981 handled = true;
5982 bit_offset = base_offset * 8;
5983 }
5984 }
5985 }
5986 }
5987 else
5988 {
5989 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
5990 if (vtable_ptr_addr)
5991 {
5992 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
5993 if (vtable_ptr != LLDB_INVALID_ADDRESS)
5994 {
5995 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
5996 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
5997 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
5998 if (base_offset != UINT32_MAX)
5999 {
6000 handled = true;
6001 bit_offset = base_offset * 8;
6002 }
6003 }
6004 }
6005 }
6006 }
6007 }
6008 }
6009
6010 }
6011 if (!handled)
6012 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
6013 }
6014 else
6015 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
6016
6017 // Base classes should be a multiple of 8 bits in size
6018 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006019 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006020 child_name = base_class_clang_type.GetTypeName().AsCString("");
6021 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6022
6023 // Base classes bit sizes should be a multiple of 8 bits in size
6024 assert (base_class_clang_type_bit_size % 8 == 0);
6025 child_byte_size = base_class_clang_type_bit_size / 8;
6026 child_is_base_class = true;
6027 return base_class_clang_type;
6028 }
6029 // We don't increment the child index in the for loop since we might
6030 // be skipping empty base classes
6031 ++child_idx;
6032 }
6033 }
6034 // Make sure index is in range...
6035 uint32_t field_idx = 0;
6036 clang::RecordDecl::field_iterator field, field_end;
6037 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
6038 {
6039 if (idx == child_idx)
6040 {
6041 // Print the member type if requested
6042 // Print the member name and equal sign
6043 child_name.assign(field->getNameAsString().c_str());
6044
6045 // Figure out the type byte size (field_type_info.first) and
6046 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00006047 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006048 assert(field_idx < record_layout.getFieldCount());
6049 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6050
6051 // Figure out the field offset within the current struct/union/class type
6052 bit_offset = record_layout.getFieldOffset (field_idx);
6053 child_byte_offset = bit_offset / 8;
6054 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
6055 child_bitfield_bit_offset = bit_offset % 8;
6056
6057 return field_clang_type;
6058 }
6059 }
6060 }
6061 break;
6062
6063 case clang::Type::ObjCObject:
6064 case clang::Type::ObjCInterface:
6065 if (idx_is_valid && GetCompleteType(type))
6066 {
6067 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
6068 assert (objc_class_type);
6069 if (objc_class_type)
6070 {
6071 uint32_t child_idx = 0;
6072 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6073
6074 if (class_interface_decl)
6075 {
6076
6077 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
6078 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6079 if (superclass_interface_decl)
6080 {
6081 if (omit_empty_base_classes)
6082 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006083 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006084 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
6085 {
6086 if (idx == 0)
6087 {
6088 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
6089
6090
6091 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
6092
6093 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6094
6095 child_byte_size = ivar_type_info.Width / 8;
6096 child_byte_offset = 0;
6097 child_is_base_class = true;
6098
Greg Claytona1e5dc82015-08-11 22:53:00 +00006099 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006100 }
6101
6102 ++child_idx;
6103 }
6104 }
6105 else
6106 ++child_idx;
6107 }
6108
6109 const uint32_t superclass_idx = child_idx;
6110
6111 if (idx < (child_idx + class_interface_decl->ivar_size()))
6112 {
6113 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6114
6115 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
6116 {
6117 if (child_idx == idx)
6118 {
6119 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6120
6121 clang::QualType ivar_qual_type(ivar_decl->getType());
6122
6123 child_name.assign(ivar_decl->getNameAsString().c_str());
6124
6125 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6126
6127 child_byte_size = ivar_type_info.Width / 8;
6128
6129 // Figure out the field offset within the current struct/union/class type
6130 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
6131 // that doesn't account for the space taken up by unbacked properties, or from
6132 // the changing size of base classes that are newer than this class.
6133 // So if we have a process around that we can ask about this object, do so.
6134 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
6135 Process *process = nullptr;
6136 if (exe_ctx)
6137 process = exe_ctx->GetProcessPtr();
6138 if (process)
6139 {
6140 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
6141 if (objc_runtime != nullptr)
6142 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006143 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006144 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
6145 }
6146 }
6147
6148 // Setting this to UINT32_MAX to make sure we don't compute it twice...
6149 bit_offset = UINT32_MAX;
6150
6151 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
6152 {
6153 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6154 child_byte_offset = bit_offset / 8;
6155 }
6156
6157 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
6158 // of a bitfield within its containing object. So regardless of where we get the byte
6159 // offset from, we still need to get the bit offset for bitfields from the layout.
6160
6161 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
6162 {
6163 if (bit_offset == UINT32_MAX)
6164 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6165
6166 child_bitfield_bit_offset = bit_offset % 8;
6167 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006168 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006169 }
6170 ++child_idx;
6171 }
6172 }
6173 }
6174 }
6175 }
6176 break;
6177
6178 case clang::Type::ObjCObjectPointer:
6179 if (idx_is_valid)
6180 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006181 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006182
6183 if (transparent_pointers && pointee_clang_type.IsAggregateType())
6184 {
6185 child_is_deref_of_parent = false;
6186 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006187 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6188 idx,
6189 transparent_pointers,
6190 omit_empty_base_classes,
6191 ignore_array_bounds,
6192 child_name,
6193 child_byte_size,
6194 child_byte_offset,
6195 child_bitfield_bit_size,
6196 child_bitfield_bit_offset,
6197 child_is_base_class,
6198 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006199 valobj,
6200 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006201 }
6202 else
6203 {
6204 child_is_deref_of_parent = true;
6205 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6206 if (parent_name)
6207 {
6208 child_name.assign(1, '*');
6209 child_name += parent_name;
6210 }
6211
6212 // We have a pointer to an simple type
6213 if (idx == 0 && pointee_clang_type.GetCompleteType())
6214 {
6215 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6216 child_byte_offset = 0;
6217 return pointee_clang_type;
6218 }
6219 }
6220 }
6221 break;
6222
6223 case clang::Type::Vector:
6224 case clang::Type::ExtVector:
6225 if (idx_is_valid)
6226 {
6227 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
6228 if (array)
6229 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006230 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006231 if (element_type.GetCompleteType())
6232 {
6233 char element_name[64];
6234 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6235 child_name.assign(element_name);
6236 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6237 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6238 return element_type;
6239 }
6240 }
6241 }
6242 break;
6243
6244 case clang::Type::ConstantArray:
6245 case clang::Type::IncompleteArray:
6246 if (ignore_array_bounds || idx_is_valid)
6247 {
6248 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
6249 if (array)
6250 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006251 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006252 if (element_type.GetCompleteType())
6253 {
6254 char element_name[64];
6255 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6256 child_name.assign(element_name);
6257 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6258 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6259 return element_type;
6260 }
6261 }
6262 }
6263 break;
6264
6265
6266 case clang::Type::Pointer:
6267 if (idx_is_valid)
6268 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006269 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006270
6271 // Don't dereference "void *" pointers
6272 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00006273 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006274
6275 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6276 {
6277 child_is_deref_of_parent = false;
6278 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006279 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6280 idx,
6281 transparent_pointers,
6282 omit_empty_base_classes,
6283 ignore_array_bounds,
6284 child_name,
6285 child_byte_size,
6286 child_byte_offset,
6287 child_bitfield_bit_size,
6288 child_bitfield_bit_offset,
6289 child_is_base_class,
6290 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006291 valobj,
6292 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006293 }
6294 else
6295 {
6296 child_is_deref_of_parent = true;
6297
6298 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6299 if (parent_name)
6300 {
6301 child_name.assign(1, '*');
6302 child_name += parent_name;
6303 }
6304
6305 // We have a pointer to an simple type
6306 if (idx == 0)
6307 {
6308 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6309 child_byte_offset = 0;
6310 return pointee_clang_type;
6311 }
6312 }
6313 }
6314 break;
6315
6316 case clang::Type::LValueReference:
6317 case clang::Type::RValueReference:
6318 if (idx_is_valid)
6319 {
6320 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006321 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006322 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6323 {
6324 child_is_deref_of_parent = false;
6325 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006326 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6327 idx,
6328 transparent_pointers,
6329 omit_empty_base_classes,
6330 ignore_array_bounds,
6331 child_name,
6332 child_byte_size,
6333 child_byte_offset,
6334 child_bitfield_bit_size,
6335 child_bitfield_bit_offset,
6336 child_is_base_class,
6337 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006338 valobj,
6339 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006340 }
6341 else
6342 {
6343 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6344 if (parent_name)
6345 {
6346 child_name.assign(1, '&');
6347 child_name += parent_name;
6348 }
6349
6350 // We have a pointer to an simple type
6351 if (idx == 0)
6352 {
6353 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6354 child_byte_offset = 0;
6355 return pointee_clang_type;
6356 }
6357 }
6358 }
6359 break;
6360
6361 case clang::Type::Typedef:
6362 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006363 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006364 return typedefed_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6365 idx,
6366 transparent_pointers,
6367 omit_empty_base_classes,
6368 ignore_array_bounds,
6369 child_name,
6370 child_byte_size,
6371 child_byte_offset,
6372 child_bitfield_bit_size,
6373 child_bitfield_bit_offset,
6374 child_is_base_class,
6375 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006376 valobj,
6377 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006378 }
6379 break;
6380
6381 case clang::Type::Elaborated:
6382 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006383 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006384 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6385 idx,
6386 transparent_pointers,
6387 omit_empty_base_classes,
6388 ignore_array_bounds,
6389 child_name,
6390 child_byte_size,
6391 child_byte_offset,
6392 child_bitfield_bit_size,
6393 child_bitfield_bit_offset,
6394 child_is_base_class,
6395 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006396 valobj,
6397 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006398 }
6399
6400 case clang::Type::Paren:
6401 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006402 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006403 return paren_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6404 idx,
6405 transparent_pointers,
6406 omit_empty_base_classes,
6407 ignore_array_bounds,
6408 child_name,
6409 child_byte_size,
6410 child_byte_offset,
6411 child_bitfield_bit_size,
6412 child_bitfield_bit_offset,
6413 child_is_base_class,
6414 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006415 valobj,
6416 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006417 }
6418
6419
6420 default:
6421 break;
6422 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006423 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006424}
6425
6426static uint32_t
6427GetIndexForRecordBase
6428(
6429 const clang::RecordDecl *record_decl,
6430 const clang::CXXBaseSpecifier *base_spec,
6431 bool omit_empty_base_classes
6432 )
6433{
6434 uint32_t child_idx = 0;
6435
6436 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6437
6438 // const char *super_name = record_decl->getNameAsCString();
6439 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6440 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6441 //
6442 if (cxx_record_decl)
6443 {
6444 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6445 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6446 base_class != base_class_end;
6447 ++base_class)
6448 {
6449 if (omit_empty_base_classes)
6450 {
6451 if (BaseSpecifierIsEmpty (base_class))
6452 continue;
6453 }
6454
6455 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6456 // child_idx,
6457 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6458 //
6459 //
6460 if (base_class == base_spec)
6461 return child_idx;
6462 ++child_idx;
6463 }
6464 }
6465
6466 return UINT32_MAX;
6467}
6468
6469
6470static uint32_t
6471GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6472 clang::NamedDecl *canonical_decl,
6473 bool omit_empty_base_classes)
6474{
6475 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6476 omit_empty_base_classes);
6477
6478 clang::RecordDecl::field_iterator field, field_end;
6479 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6480 field != field_end;
6481 ++field, ++child_idx)
6482 {
6483 if (field->getCanonicalDecl() == canonical_decl)
6484 return child_idx;
6485 }
6486
6487 return UINT32_MAX;
6488}
6489
6490// Look for a child member (doesn't include base classes, but it does include
6491// their members) in the type hierarchy. Returns an index path into "clang_type"
6492// on how to reach the appropriate member.
6493//
6494// class A
6495// {
6496// public:
6497// int m_a;
6498// int m_b;
6499// };
6500//
6501// class B
6502// {
6503// };
6504//
6505// class C :
6506// public B,
6507// public A
6508// {
6509// };
6510//
6511// If we have a clang type that describes "class C", and we wanted to looked
6512// "m_b" in it:
6513//
6514// With omit_empty_base_classes == false we would get an integer array back with:
6515// { 1, 1 }
6516// The first index 1 is the child index for "class A" within class C
6517// The second index 1 is the child index for "m_b" within class A
6518//
6519// With omit_empty_base_classes == true we would get an integer array back with:
6520// { 0, 1 }
6521// 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)
6522// The second index 1 is the child index for "m_b" within class A
6523
6524size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006525ClangASTContext::GetIndexOfChildMemberWithName (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006526 bool omit_empty_base_classes,
6527 std::vector<uint32_t>& child_indexes)
6528{
6529 if (type && name && name[0])
6530 {
6531 clang::QualType qual_type(GetCanonicalQualType(type));
6532 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6533 switch (type_class)
6534 {
6535 case clang::Type::Record:
6536 if (GetCompleteType(type))
6537 {
6538 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6539 const clang::RecordDecl *record_decl = record_type->getDecl();
6540
6541 assert(record_decl);
6542 uint32_t child_idx = 0;
6543
6544 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6545
6546 // Try and find a field that matches NAME
6547 clang::RecordDecl::field_iterator field, field_end;
6548 llvm::StringRef name_sref(name);
6549 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6550 field != field_end;
6551 ++field, ++child_idx)
6552 {
6553 llvm::StringRef field_name = field->getName();
6554 if (field_name.empty())
6555 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006556 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006557 child_indexes.push_back(child_idx);
6558 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
6559 return child_indexes.size();
6560 child_indexes.pop_back();
6561
6562 }
6563 else if (field_name.equals (name_sref))
6564 {
6565 // We have to add on the number of base classes to this index!
6566 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
6567 return child_indexes.size();
6568 }
6569 }
6570
6571 if (cxx_record_decl)
6572 {
6573 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
6574
6575 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
6576
6577 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
6578 // Didn't find things easily, lets let clang do its thang...
6579 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
6580 clang::DeclarationName decl_name(&ident_ref);
6581
6582 clang::CXXBasePaths paths;
6583 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
6584 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
6585 },
6586 paths))
6587 {
6588 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
6589 for (path = paths.begin(); path != path_end; ++path)
6590 {
6591 const size_t num_path_elements = path->size();
6592 for (size_t e=0; e<num_path_elements; ++e)
6593 {
6594 clang::CXXBasePathElement elem = (*path)[e];
6595
6596 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
6597 if (child_idx == UINT32_MAX)
6598 {
6599 child_indexes.clear();
6600 return 0;
6601 }
6602 else
6603 {
6604 child_indexes.push_back (child_idx);
6605 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
6606 }
6607 }
6608 for (clang::NamedDecl *path_decl : path->Decls)
6609 {
6610 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
6611 if (child_idx == UINT32_MAX)
6612 {
6613 child_indexes.clear();
6614 return 0;
6615 }
6616 else
6617 {
6618 child_indexes.push_back (child_idx);
6619 }
6620 }
6621 }
6622 return child_indexes.size();
6623 }
6624 }
6625
6626 }
6627 break;
6628
6629 case clang::Type::ObjCObject:
6630 case clang::Type::ObjCInterface:
6631 if (GetCompleteType(type))
6632 {
6633 llvm::StringRef name_sref(name);
6634 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6635 assert (objc_class_type);
6636 if (objc_class_type)
6637 {
6638 uint32_t child_idx = 0;
6639 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6640
6641 if (class_interface_decl)
6642 {
6643 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6644 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6645
6646 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6647 {
6648 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6649
6650 if (ivar_decl->getName().equals (name_sref))
6651 {
6652 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6653 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6654 ++child_idx;
6655
6656 child_indexes.push_back (child_idx);
6657 return child_indexes.size();
6658 }
6659 }
6660
6661 if (superclass_interface_decl)
6662 {
6663 // The super class index is always zero for ObjC classes,
6664 // so we push it onto the child indexes in case we find
6665 // an ivar in our superclass...
6666 child_indexes.push_back (0);
6667
Greg Claytona1e5dc82015-08-11 22:53:00 +00006668 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006669 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
6670 omit_empty_base_classes,
6671 child_indexes))
6672 {
6673 // We did find an ivar in a superclass so just
6674 // return the results!
6675 return child_indexes.size();
6676 }
6677
6678 // We didn't find an ivar matching "name" in our
6679 // superclass, pop the superclass zero index that
6680 // we pushed on above.
6681 child_indexes.pop_back();
6682 }
6683 }
6684 }
6685 }
6686 break;
6687
6688 case clang::Type::ObjCObjectPointer:
6689 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006690 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006691 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
6692 omit_empty_base_classes,
6693 child_indexes);
6694 }
6695 break;
6696
6697
6698 case clang::Type::ConstantArray:
6699 {
6700 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6701 // const uint64_t element_count = array->getSize().getLimitedValue();
6702 //
6703 // if (idx < element_count)
6704 // {
6705 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6706 //
6707 // char element_name[32];
6708 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6709 //
6710 // child_name.assign(element_name);
6711 // assert(field_type_info.first % 8 == 0);
6712 // child_byte_size = field_type_info.first / 8;
6713 // child_byte_offset = idx * child_byte_size;
6714 // return array->getElementType().getAsOpaquePtr();
6715 // }
6716 }
6717 break;
6718
6719 // case clang::Type::MemberPointerType:
6720 // {
6721 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6722 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6723 //
6724 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6725 // {
6726 // return GetIndexOfChildWithName (ast,
6727 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6728 // name);
6729 // }
6730 // }
6731 // break;
6732 //
6733 case clang::Type::LValueReference:
6734 case clang::Type::RValueReference:
6735 {
6736 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
6737 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006738 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006739
6740 if (pointee_clang_type.IsAggregateType ())
6741 {
6742 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6743 omit_empty_base_classes,
6744 child_indexes);
6745 }
6746 }
6747 break;
6748
6749 case clang::Type::Pointer:
6750 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006751 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006752
6753 if (pointee_clang_type.IsAggregateType ())
6754 {
6755 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
6756 omit_empty_base_classes,
6757 child_indexes);
6758 }
6759 }
6760 break;
6761
6762 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006763 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006764 omit_empty_base_classes,
6765 child_indexes);
6766
6767 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006768 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006769 omit_empty_base_classes,
6770 child_indexes);
6771
6772 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006773 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Greg Claytond8d4a572015-08-11 21:38:15 +00006774 omit_empty_base_classes,
6775 child_indexes);
6776
6777 default:
6778 break;
6779 }
6780 }
6781 return 0;
6782}
6783
6784
6785// Get the index of the child of "clang_type" whose name matches. This function
6786// doesn't descend into the children, but only looks one level deep and name
6787// matches can include base class names.
6788
6789uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006790ClangASTContext::GetIndexOfChildWithName (lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00006791{
6792 if (type && name && name[0])
6793 {
6794 clang::QualType qual_type(GetCanonicalQualType(type));
6795
6796 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6797
6798 switch (type_class)
6799 {
6800 case clang::Type::Record:
6801 if (GetCompleteType(type))
6802 {
6803 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
6804 const clang::RecordDecl *record_decl = record_type->getDecl();
6805
6806 assert(record_decl);
6807 uint32_t child_idx = 0;
6808
6809 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6810
6811 if (cxx_record_decl)
6812 {
6813 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6814 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6815 base_class != base_class_end;
6816 ++base_class)
6817 {
6818 // Skip empty base classes
6819 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6820 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
6821 continue;
6822
Greg Claytona1e5dc82015-08-11 22:53:00 +00006823 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006824 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
6825 if (base_class_type_name.compare (name) == 0)
6826 return child_idx;
6827 ++child_idx;
6828 }
6829 }
6830
6831 // Try and find a field that matches NAME
6832 clang::RecordDecl::field_iterator field, field_end;
6833 llvm::StringRef name_sref(name);
6834 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6835 field != field_end;
6836 ++field, ++child_idx)
6837 {
6838 if (field->getName().equals (name_sref))
6839 return child_idx;
6840 }
6841
6842 }
6843 break;
6844
6845 case clang::Type::ObjCObject:
6846 case clang::Type::ObjCInterface:
6847 if (GetCompleteType(type))
6848 {
6849 llvm::StringRef name_sref(name);
6850 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
6851 assert (objc_class_type);
6852 if (objc_class_type)
6853 {
6854 uint32_t child_idx = 0;
6855 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6856
6857 if (class_interface_decl)
6858 {
6859 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6860 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6861
6862 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
6863 {
6864 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6865
6866 if (ivar_decl->getName().equals (name_sref))
6867 {
6868 if ((!omit_empty_base_classes && superclass_interface_decl) ||
6869 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
6870 ++child_idx;
6871
6872 return child_idx;
6873 }
6874 }
6875
6876 if (superclass_interface_decl)
6877 {
6878 if (superclass_interface_decl->getName().equals (name_sref))
6879 return 0;
6880 }
6881 }
6882 }
6883 }
6884 break;
6885
6886 case clang::Type::ObjCObjectPointer:
6887 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006888 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006889 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6890 }
6891 break;
6892
6893 case clang::Type::ConstantArray:
6894 {
6895 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
6896 // const uint64_t element_count = array->getSize().getLimitedValue();
6897 //
6898 // if (idx < element_count)
6899 // {
6900 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
6901 //
6902 // char element_name[32];
6903 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
6904 //
6905 // child_name.assign(element_name);
6906 // assert(field_type_info.first % 8 == 0);
6907 // child_byte_size = field_type_info.first / 8;
6908 // child_byte_offset = idx * child_byte_size;
6909 // return array->getElementType().getAsOpaquePtr();
6910 // }
6911 }
6912 break;
6913
6914 // case clang::Type::MemberPointerType:
6915 // {
6916 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
6917 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
6918 //
6919 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
6920 // {
6921 // return GetIndexOfChildWithName (ast,
6922 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
6923 // name);
6924 // }
6925 // }
6926 // break;
6927 //
6928 case clang::Type::LValueReference:
6929 case clang::Type::RValueReference:
6930 {
6931 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006932 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006933
6934 if (pointee_type.IsAggregateType ())
6935 {
6936 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6937 }
6938 }
6939 break;
6940
6941 case clang::Type::Pointer:
6942 {
6943 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006944 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006945
6946 if (pointee_type.IsAggregateType ())
6947 {
6948 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
6949 }
6950 else
6951 {
6952 // if (parent_name)
6953 // {
6954 // child_name.assign(1, '*');
6955 // child_name += parent_name;
6956 // }
6957 //
6958 // // We have a pointer to an simple type
6959 // if (idx == 0)
6960 // {
6961 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
6962 // assert(clang_type_info.first % 8 == 0);
6963 // child_byte_size = clang_type_info.first / 8;
6964 // child_byte_offset = 0;
6965 // return pointee_type.getAsOpaquePtr();
6966 // }
6967 }
6968 }
6969 break;
6970
6971 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006972 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006973
6974 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006975 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006976
6977 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00006978 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00006979
6980 default:
6981 break;
6982 }
6983 }
6984 return UINT32_MAX;
6985}
6986
6987
6988size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006989ClangASTContext::GetNumTemplateArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00006990{
6991 if (!type)
6992 return 0;
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006993
6994 clang::QualType qual_type (GetCanonicalQualType(type));
6995 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6996 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00006997 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00006998 case clang::Type::Record:
6999 if (GetCompleteType(type))
7000 {
7001 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7002 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007003 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007004 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7005 if (template_decl)
7006 return template_decl->getTemplateArgs().size();
Greg Claytond8d4a572015-08-11 21:38:15 +00007007 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007008 }
7009 break;
7010
7011 case clang::Type::Typedef:
7012 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
7013
7014 case clang::Type::Elaborated:
7015 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
7016
7017 case clang::Type::Paren:
7018 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
7019
7020 default:
7021 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007022 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007023
Greg Claytond8d4a572015-08-11 21:38:15 +00007024 return 0;
7025}
7026
Greg Claytona1e5dc82015-08-11 22:53:00 +00007027CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007028ClangASTContext::GetTemplateArgument (lldb::opaque_compiler_type_t type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00007029{
7030 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007031 return CompilerType();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007032
7033 clang::QualType qual_type (GetCanonicalQualType(type));
7034 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7035 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007036 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007037 case clang::Type::Record:
7038 if (GetCompleteType(type))
7039 {
7040 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7041 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007042 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007043 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7044 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
Greg Claytond8d4a572015-08-11 21:38:15 +00007045 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007046 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
7047 switch (template_arg.getKind())
Greg Claytond8d4a572015-08-11 21:38:15 +00007048 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007049 case clang::TemplateArgument::Null:
7050 kind = eTemplateArgumentKindNull;
7051 return CompilerType();
7052
7053 case clang::TemplateArgument::Type:
7054 kind = eTemplateArgumentKindType;
7055 return CompilerType(getASTContext(), template_arg.getAsType());
7056
7057 case clang::TemplateArgument::Declaration:
7058 kind = eTemplateArgumentKindDeclaration;
7059 return CompilerType();
7060
7061 case clang::TemplateArgument::Integral:
7062 kind = eTemplateArgumentKindIntegral;
7063 return CompilerType(getASTContext(), template_arg.getIntegralType());
7064
7065 case clang::TemplateArgument::Template:
7066 kind = eTemplateArgumentKindTemplate;
7067 return CompilerType();
7068
7069 case clang::TemplateArgument::TemplateExpansion:
7070 kind = eTemplateArgumentKindTemplateExpansion;
7071 return CompilerType();
7072
7073 case clang::TemplateArgument::Expression:
7074 kind = eTemplateArgumentKindExpression;
7075 return CompilerType();
7076
7077 case clang::TemplateArgument::Pack:
7078 kind = eTemplateArgumentKindPack;
7079 return CompilerType();
7080
7081 default:
7082 assert (!"Unhandled clang::TemplateArgument::ArgKind");
7083 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007084 }
7085 }
7086 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007087 }
7088 break;
7089
7090 case clang::Type::Typedef:
7091 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
7092
7093 case clang::Type::Elaborated:
7094 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
7095
7096 case clang::Type::Paren:
7097 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
7098
7099 default:
7100 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007101 }
7102 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00007103 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00007104}
7105
Enrico Granatac6bf2e22015-09-23 01:39:46 +00007106CompilerType
7107ClangASTContext::GetTypeForFormatters (void* type)
7108{
7109 if (type)
7110 return RemoveFastQualifiers(CompilerType(this, type));
7111 return CompilerType();
7112}
7113
Greg Claytond8d4a572015-08-11 21:38:15 +00007114static bool
7115IsOperator (const char *name, clang::OverloadedOperatorKind &op_kind)
7116{
7117 if (name == nullptr || name[0] == '\0')
7118 return false;
7119
7120#define OPERATOR_PREFIX "operator"
7121#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
7122
7123 const char *post_op_name = nullptr;
7124
7125 bool no_space = true;
7126
7127 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
7128 return false;
7129
7130 post_op_name = name + OPERATOR_PREFIX_LENGTH;
7131
7132 if (post_op_name[0] == ' ')
7133 {
7134 post_op_name++;
7135 no_space = false;
7136 }
7137
7138#undef OPERATOR_PREFIX
7139#undef OPERATOR_PREFIX_LENGTH
7140
7141 // This is an operator, set the overloaded operator kind to invalid
7142 // in case this is a conversion operator...
7143 op_kind = clang::NUM_OVERLOADED_OPERATORS;
7144
7145 switch (post_op_name[0])
7146 {
7147 default:
7148 if (no_space)
7149 return false;
7150 break;
7151 case 'n':
7152 if (no_space)
7153 return false;
7154 if (strcmp (post_op_name, "new") == 0)
7155 op_kind = clang::OO_New;
7156 else if (strcmp (post_op_name, "new[]") == 0)
7157 op_kind = clang::OO_Array_New;
7158 break;
7159
7160 case 'd':
7161 if (no_space)
7162 return false;
7163 if (strcmp (post_op_name, "delete") == 0)
7164 op_kind = clang::OO_Delete;
7165 else if (strcmp (post_op_name, "delete[]") == 0)
7166 op_kind = clang::OO_Array_Delete;
7167 break;
7168
7169 case '+':
7170 if (post_op_name[1] == '\0')
7171 op_kind = clang::OO_Plus;
7172 else if (post_op_name[2] == '\0')
7173 {
7174 if (post_op_name[1] == '=')
7175 op_kind = clang::OO_PlusEqual;
7176 else if (post_op_name[1] == '+')
7177 op_kind = clang::OO_PlusPlus;
7178 }
7179 break;
7180
7181 case '-':
7182 if (post_op_name[1] == '\0')
7183 op_kind = clang::OO_Minus;
7184 else if (post_op_name[2] == '\0')
7185 {
7186 switch (post_op_name[1])
7187 {
7188 case '=': op_kind = clang::OO_MinusEqual; break;
7189 case '-': op_kind = clang::OO_MinusMinus; break;
7190 case '>': op_kind = clang::OO_Arrow; break;
7191 }
7192 }
7193 else if (post_op_name[3] == '\0')
7194 {
7195 if (post_op_name[2] == '*')
7196 op_kind = clang::OO_ArrowStar; break;
7197 }
7198 break;
7199
7200 case '*':
7201 if (post_op_name[1] == '\0')
7202 op_kind = clang::OO_Star;
7203 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7204 op_kind = clang::OO_StarEqual;
7205 break;
7206
7207 case '/':
7208 if (post_op_name[1] == '\0')
7209 op_kind = clang::OO_Slash;
7210 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7211 op_kind = clang::OO_SlashEqual;
7212 break;
7213
7214 case '%':
7215 if (post_op_name[1] == '\0')
7216 op_kind = clang::OO_Percent;
7217 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7218 op_kind = clang::OO_PercentEqual;
7219 break;
7220
7221
7222 case '^':
7223 if (post_op_name[1] == '\0')
7224 op_kind = clang::OO_Caret;
7225 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7226 op_kind = clang::OO_CaretEqual;
7227 break;
7228
7229 case '&':
7230 if (post_op_name[1] == '\0')
7231 op_kind = clang::OO_Amp;
7232 else if (post_op_name[2] == '\0')
7233 {
7234 switch (post_op_name[1])
7235 {
7236 case '=': op_kind = clang::OO_AmpEqual; break;
7237 case '&': op_kind = clang::OO_AmpAmp; break;
7238 }
7239 }
7240 break;
7241
7242 case '|':
7243 if (post_op_name[1] == '\0')
7244 op_kind = clang::OO_Pipe;
7245 else if (post_op_name[2] == '\0')
7246 {
7247 switch (post_op_name[1])
7248 {
7249 case '=': op_kind = clang::OO_PipeEqual; break;
7250 case '|': op_kind = clang::OO_PipePipe; break;
7251 }
7252 }
7253 break;
7254
7255 case '~':
7256 if (post_op_name[1] == '\0')
7257 op_kind = clang::OO_Tilde;
7258 break;
7259
7260 case '!':
7261 if (post_op_name[1] == '\0')
7262 op_kind = clang::OO_Exclaim;
7263 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7264 op_kind = clang::OO_ExclaimEqual;
7265 break;
7266
7267 case '=':
7268 if (post_op_name[1] == '\0')
7269 op_kind = clang::OO_Equal;
7270 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
7271 op_kind = clang::OO_EqualEqual;
7272 break;
7273
7274 case '<':
7275 if (post_op_name[1] == '\0')
7276 op_kind = clang::OO_Less;
7277 else if (post_op_name[2] == '\0')
7278 {
7279 switch (post_op_name[1])
7280 {
7281 case '<': op_kind = clang::OO_LessLess; break;
7282 case '=': op_kind = clang::OO_LessEqual; break;
7283 }
7284 }
7285 else if (post_op_name[3] == '\0')
7286 {
7287 if (post_op_name[2] == '=')
7288 op_kind = clang::OO_LessLessEqual;
7289 }
7290 break;
7291
7292 case '>':
7293 if (post_op_name[1] == '\0')
7294 op_kind = clang::OO_Greater;
7295 else if (post_op_name[2] == '\0')
7296 {
7297 switch (post_op_name[1])
7298 {
7299 case '>': op_kind = clang::OO_GreaterGreater; break;
7300 case '=': op_kind = clang::OO_GreaterEqual; break;
7301 }
7302 }
7303 else if (post_op_name[1] == '>' &&
7304 post_op_name[2] == '=' &&
7305 post_op_name[3] == '\0')
7306 {
7307 op_kind = clang::OO_GreaterGreaterEqual;
7308 }
7309 break;
7310
7311 case ',':
7312 if (post_op_name[1] == '\0')
7313 op_kind = clang::OO_Comma;
7314 break;
7315
7316 case '(':
7317 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
7318 op_kind = clang::OO_Call;
7319 break;
7320
7321 case '[':
7322 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
7323 op_kind = clang::OO_Subscript;
7324 break;
7325 }
7326
7327 return true;
7328}
7329
7330clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007331ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007332{
7333 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
7334 if (enutype)
7335 return enutype->getDecl();
7336 return NULL;
7337}
7338
7339clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007340ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007341{
7342 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(GetCanonicalQualType(type));
7343 if (record_type)
7344 return record_type->getDecl();
7345 return nullptr;
7346}
7347
Greg Claytone6b36cd2015-12-08 01:02:08 +00007348clang::TagDecl *
7349ClangASTContext::GetAsTagDecl (const CompilerType& type)
7350{
7351 clang::QualType qual_type = GetCanonicalQualType(type);
7352 if (qual_type.isNull())
7353 return nullptr;
7354 else
7355 return qual_type->getAsTagDecl();
7356}
7357
Greg Claytond8d4a572015-08-11 21:38:15 +00007358clang::CXXRecordDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007359ClangASTContext::GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007360{
7361 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
7362}
7363
7364clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007365ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007366{
7367 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(GetCanonicalQualType(type));
7368 if (objc_class_type)
7369 return objc_class_type->getInterface();
7370 return nullptr;
7371}
7372
7373clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007374ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
7375 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007376 AccessType access,
7377 uint32_t bitfield_bit_size)
7378{
7379 if (!type.IsValid() || !field_clang_type.IsValid())
7380 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007381 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007382 if (!ast)
7383 return nullptr;
7384 clang::ASTContext* clang_ast = ast->getASTContext();
7385
7386 clang::FieldDecl *field = nullptr;
7387
7388 clang::Expr *bit_width = nullptr;
7389 if (bitfield_bit_size != 0)
7390 {
7391 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
7392 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
7393 }
7394
7395 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7396 if (record_decl)
7397 {
7398 field = clang::FieldDecl::Create (*clang_ast,
7399 record_decl,
7400 clang::SourceLocation(),
7401 clang::SourceLocation(),
7402 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7403 GetQualType(field_clang_type), // Field type
7404 nullptr, // TInfo *
7405 bit_width, // BitWidth
7406 false, // Mutable
7407 clang::ICIS_NoInit); // HasInit
7408
7409 if (!name)
7410 {
7411 // Determine whether this field corresponds to an anonymous
7412 // struct or union.
7413 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
7414 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
7415 if (!Rec->getDeclName()) {
7416 Rec->setAnonymousStructOrUnion(true);
7417 field->setImplicit();
7418
7419 }
7420 }
7421 }
7422
7423 if (field)
7424 {
7425 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7426
7427 record_decl->addDecl(field);
7428
7429#ifdef LLDB_CONFIGURATION_DEBUG
7430 VerifyDecl(field);
7431#endif
7432 }
7433 }
7434 else
7435 {
7436 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7437
7438 if (class_interface_decl)
7439 {
7440 const bool is_synthesized = false;
7441
7442 field_clang_type.GetCompleteType();
7443
7444 field = clang::ObjCIvarDecl::Create (*clang_ast,
7445 class_interface_decl,
7446 clang::SourceLocation(),
7447 clang::SourceLocation(),
7448 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7449 GetQualType(field_clang_type), // Field type
7450 nullptr, // TypeSourceInfo *
7451 ConvertAccessTypeToObjCIvarAccessControl (access),
7452 bit_width,
7453 is_synthesized);
7454
7455 if (field)
7456 {
7457 class_interface_decl->addDecl(field);
7458
7459#ifdef LLDB_CONFIGURATION_DEBUG
7460 VerifyDecl(field);
7461#endif
7462 }
7463 }
7464 }
7465 return field;
7466}
7467
7468void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007469ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007470{
Greg Claytonf73034f2015-09-08 18:15:05 +00007471 if (!type)
7472 return;
7473
7474 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007475 if (!ast)
7476 return;
7477
7478 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7479
7480 if (!record_decl)
7481 return;
7482
7483 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7484
7485 IndirectFieldVector indirect_fields;
7486 clang::RecordDecl::field_iterator field_pos;
7487 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7488 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7489 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7490 {
7491 if (field_pos->isAnonymousStructOrUnion())
7492 {
7493 clang::QualType field_qual_type = field_pos->getType();
7494
7495 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7496
7497 if (!field_record_type)
7498 continue;
7499
7500 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7501
7502 if (!field_record_decl)
7503 continue;
7504
7505 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7506 di != de;
7507 ++di)
7508 {
7509 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7510 {
7511 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7512 chain[0] = *field_pos;
7513 chain[1] = nested_field_decl;
7514 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7515 record_decl,
7516 clang::SourceLocation(),
7517 nested_field_decl->getIdentifier(),
7518 nested_field_decl->getType(),
7519 chain,
7520 2);
7521
7522 indirect_field->setImplicit();
7523
7524 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7525 nested_field_decl->getAccess()));
7526
7527 indirect_fields.push_back(indirect_field);
7528 }
7529 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7530 {
7531 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
7532 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7533 chain[0] = *field_pos;
7534
7535 int chain_index = 1;
7536 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7537 nce = nested_indirect_field_decl->chain_end();
7538 nci < nce;
7539 ++nci)
7540 {
7541 chain[chain_index] = *nci;
7542 chain_index++;
7543 }
7544
7545 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7546 record_decl,
7547 clang::SourceLocation(),
7548 nested_indirect_field_decl->getIdentifier(),
7549 nested_indirect_field_decl->getType(),
7550 chain,
7551 nested_chain_size + 1);
7552
7553 indirect_field->setImplicit();
7554
7555 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7556 nested_indirect_field_decl->getAccess()));
7557
7558 indirect_fields.push_back(indirect_field);
7559 }
7560 }
7561 }
7562 }
7563
7564 // Check the last field to see if it has an incomplete array type as its
7565 // last member and if it does, the tell the record decl about it
7566 if (last_field_pos != field_end_pos)
7567 {
7568 if (last_field_pos->getType()->isIncompleteArrayType())
7569 record_decl->hasFlexibleArrayMember();
7570 }
7571
7572 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7573 ifi < ife;
7574 ++ifi)
7575 {
7576 record_decl->addDecl(*ifi);
7577 }
7578}
7579
7580void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007581ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007582{
Greg Claytonf73034f2015-09-08 18:15:05 +00007583 if (type)
7584 {
7585 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7586 if (ast)
7587 {
7588 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007589
Greg Claytonf73034f2015-09-08 18:15:05 +00007590 if (!record_decl)
7591 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00007592
Greg Claytonf73034f2015-09-08 18:15:05 +00007593 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*ast->getASTContext()));
7594 }
7595 }
Greg Claytond8d4a572015-08-11 21:38:15 +00007596}
7597
7598clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007599ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7600 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007601 AccessType access)
7602{
7603 clang::VarDecl *var_decl = nullptr;
7604
7605 if (!type.IsValid() || !var_type.IsValid())
7606 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007607 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007608 if (!ast)
7609 return nullptr;
7610
7611 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7612 if (record_decl)
7613 {
7614 var_decl = clang::VarDecl::Create (*ast->getASTContext(), // ASTContext &
7615 record_decl, // DeclContext *
7616 clang::SourceLocation(), // clang::SourceLocation StartLoc
7617 clang::SourceLocation(), // clang::SourceLocation IdLoc
7618 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7619 GetQualType(var_type), // Variable clang::QualType
7620 nullptr, // TypeSourceInfo *
7621 clang::SC_Static); // StorageClass
7622 if (var_decl)
7623 {
7624 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7625 record_decl->addDecl(var_decl);
7626
7627#ifdef LLDB_CONFIGURATION_DEBUG
7628 VerifyDecl(var_decl);
7629#endif
7630 }
7631 }
7632 return var_decl;
7633}
7634
7635
7636clang::CXXMethodDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007637ClangASTContext::AddMethodToCXXRecordType (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007638 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007639 lldb::AccessType access,
7640 bool is_virtual,
7641 bool is_static,
7642 bool is_inline,
7643 bool is_explicit,
7644 bool is_attr_used,
7645 bool is_artificial)
7646{
7647 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7648 return nullptr;
7649
7650 clang::QualType record_qual_type(GetCanonicalQualType(type));
7651
7652 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7653
7654 if (cxx_record_decl == nullptr)
7655 return nullptr;
7656
7657 clang::QualType method_qual_type (GetQualType(method_clang_type));
7658
7659 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7660
7661 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7662
7663 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7664
7665 if (function_type == nullptr)
7666 return nullptr;
7667
7668 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7669
7670 if (!method_function_prototype)
7671 return nullptr;
7672
7673 unsigned int num_params = method_function_prototype->getNumParams();
7674
7675 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7676 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7677
7678 if (is_artificial)
7679 return nullptr; // skip everything artificial
7680
7681 if (name[0] == '~')
7682 {
7683 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7684 cxx_record_decl,
7685 clang::SourceLocation(),
7686 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7687 method_qual_type,
7688 nullptr,
7689 is_inline,
7690 is_artificial);
7691 cxx_method_decl = cxx_dtor_decl;
7692 }
7693 else if (decl_name == cxx_record_decl->getDeclName())
7694 {
7695 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
7696 cxx_record_decl,
7697 clang::SourceLocation(),
7698 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7699 method_qual_type,
7700 nullptr, // TypeSourceInfo *
7701 is_explicit,
7702 is_inline,
7703 is_artificial,
7704 false /*is_constexpr*/);
7705 cxx_method_decl = cxx_ctor_decl;
7706 }
7707 else
7708 {
7709 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
7710 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
7711
7712 if (IsOperator (name, op_kind))
7713 {
7714 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
7715 {
7716 // Check the number of operator parameters. Sometimes we have
7717 // seen bad DWARF that doesn't correctly describe operators and
7718 // if we try to create a method and add it to the class, clang
7719 // will assert and crash, so we need to make sure things are
7720 // acceptable.
7721 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
7722 return nullptr;
7723 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7724 cxx_record_decl,
7725 clang::SourceLocation(),
7726 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
7727 method_qual_type,
7728 nullptr, // TypeSourceInfo *
7729 SC,
7730 is_inline,
7731 false /*is_constexpr*/,
7732 clang::SourceLocation());
7733 }
7734 else if (num_params == 0)
7735 {
7736 // Conversion operators don't take params...
7737 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
7738 cxx_record_decl,
7739 clang::SourceLocation(),
7740 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
7741 method_qual_type,
7742 nullptr, // TypeSourceInfo *
7743 is_inline,
7744 is_explicit,
7745 false /*is_constexpr*/,
7746 clang::SourceLocation());
7747 }
7748 }
7749
7750 if (cxx_method_decl == nullptr)
7751 {
7752 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
7753 cxx_record_decl,
7754 clang::SourceLocation(),
7755 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
7756 method_qual_type,
7757 nullptr, // TypeSourceInfo *
7758 SC,
7759 is_inline,
7760 false /*is_constexpr*/,
7761 clang::SourceLocation());
7762 }
7763 }
7764
7765 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
7766
7767 cxx_method_decl->setAccess (access_specifier);
7768 cxx_method_decl->setVirtualAsWritten (is_virtual);
7769
7770 if (is_attr_used)
7771 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
7772
7773 // Populate the method decl with parameter decls
7774
7775 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
7776
7777 for (unsigned param_index = 0;
7778 param_index < num_params;
7779 ++param_index)
7780 {
7781 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
7782 cxx_method_decl,
7783 clang::SourceLocation(),
7784 clang::SourceLocation(),
7785 nullptr, // anonymous
7786 method_function_prototype->getParamType(param_index),
7787 nullptr,
7788 clang::SC_None,
7789 nullptr));
7790 }
7791
7792 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
7793
7794 cxx_record_decl->addDecl (cxx_method_decl);
7795
7796 // Sometimes the debug info will mention a constructor (default/copy/move),
7797 // destructor, or assignment operator (copy/move) but there won't be any
7798 // version of this in the code. So we check if the function was artificially
7799 // generated and if it is trivial and this lets the compiler/backend know
7800 // that it can inline the IR for these when it needs to and we can avoid a
7801 // "missing function" error when running expressions.
7802
7803 if (is_artificial)
7804 {
7805 if (cxx_ctor_decl &&
7806 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
7807 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
7808 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
7809 {
7810 cxx_ctor_decl->setDefaulted();
7811 cxx_ctor_decl->setTrivial(true);
7812 }
7813 else if (cxx_dtor_decl)
7814 {
7815 if (cxx_record_decl->hasTrivialDestructor())
7816 {
7817 cxx_dtor_decl->setDefaulted();
7818 cxx_dtor_decl->setTrivial(true);
7819 }
7820 }
7821 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
7822 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
7823 {
7824 cxx_method_decl->setDefaulted();
7825 cxx_method_decl->setTrivial(true);
7826 }
7827 }
7828
7829#ifdef LLDB_CONFIGURATION_DEBUG
7830 VerifyDecl(cxx_method_decl);
7831#endif
7832
7833 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
7834 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
7835 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
7836 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
7837 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
7838 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
7839 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
7840 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
7841 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
7842 return cxx_method_decl;
7843}
7844
7845
7846#pragma mark C++ Base Classes
7847
7848clang::CXXBaseSpecifier *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007849ClangASTContext::CreateBaseClassSpecifier (lldb::opaque_compiler_type_t type, AccessType access, bool is_virtual, bool base_of_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007850{
7851 if (type)
7852 return new clang::CXXBaseSpecifier (clang::SourceRange(),
7853 is_virtual,
7854 base_of_class,
7855 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
7856 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
7857 clang::SourceLocation());
7858 return nullptr;
7859}
7860
7861void
7862ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
7863{
7864 for (unsigned i=0; i<num_base_classes; ++i)
7865 {
7866 delete base_classes[i];
7867 base_classes[i] = nullptr;
7868 }
7869}
7870
7871bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007872ClangASTContext::SetBaseClassesForClassType (lldb::opaque_compiler_type_t type, clang::CXXBaseSpecifier const * const *base_classes,
Greg Claytond8d4a572015-08-11 21:38:15 +00007873 unsigned num_base_classes)
7874{
7875 if (type)
7876 {
7877 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
7878 if (cxx_record_decl)
7879 {
7880 cxx_record_decl->setBases(base_classes, num_base_classes);
7881 return true;
7882 }
7883 }
7884 return false;
7885}
7886
7887bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007888ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007889{
Greg Claytonf73034f2015-09-08 18:15:05 +00007890 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007891 if (!ast)
7892 return false;
7893 clang::ASTContext* clang_ast = ast->getASTContext();
7894
7895 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
7896 {
7897 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7898 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
7899 if (class_interface_decl && super_interface_decl)
7900 {
7901 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
7902 return true;
7903 }
7904 }
7905 return false;
7906}
7907
7908bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00007909ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007910 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007911 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007912 clang::ObjCIvarDecl *ivar_decl,
7913 const char *property_setter_name,
7914 const char *property_getter_name,
7915 uint32_t property_attributes,
7916 ClangASTMetadata *metadata)
7917{
7918 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
7919 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00007920 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007921 if (!ast)
7922 return false;
7923 clang::ASTContext* clang_ast = ast->getASTContext();
7924
7925 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
7926
7927 if (class_interface_decl)
7928 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007929 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00007930
7931 if (property_clang_type.IsValid())
7932 property_clang_type_to_access = property_clang_type;
7933 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007934 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007935
7936 if (class_interface_decl && property_clang_type_to_access.IsValid())
7937 {
7938 clang::TypeSourceInfo *prop_type_source;
7939 if (ivar_decl)
7940 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
7941 else
7942 prop_type_source = clang_ast->getTrivialTypeSourceInfo (GetQualType(property_clang_type));
7943
7944 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create (*clang_ast,
7945 class_interface_decl,
7946 clang::SourceLocation(), // Source Location
7947 &clang_ast->Idents.get(property_name),
7948 clang::SourceLocation(), //Source Location for AT
7949 clang::SourceLocation(), //Source location for (
7950 ivar_decl ? ivar_decl->getType() : ClangASTContext::GetQualType(property_clang_type),
7951 prop_type_source);
7952
7953 if (property_decl)
7954 {
7955 if (metadata)
7956 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
7957
7958 class_interface_decl->addDecl (property_decl);
7959
7960 clang::Selector setter_sel, getter_sel;
7961
7962 if (property_setter_name != nullptr)
7963 {
7964 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
7965 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
7966 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7967 }
7968 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
7969 {
7970 std::string setter_sel_string("set");
7971 setter_sel_string.push_back(::toupper(property_name[0]));
7972 setter_sel_string.append(&property_name[1]);
7973 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
7974 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
7975 }
7976 property_decl->setSetterName(setter_sel);
7977 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
7978
7979 if (property_getter_name != nullptr)
7980 {
7981 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
7982 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7983 }
7984 else
7985 {
7986 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
7987 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
7988 }
7989 property_decl->setGetterName(getter_sel);
7990 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
7991
7992 if (ivar_decl)
7993 property_decl->setPropertyIvarDecl (ivar_decl);
7994
7995 if (property_attributes & DW_APPLE_PROPERTY_readonly)
7996 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
7997 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
7998 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
7999 if (property_attributes & DW_APPLE_PROPERTY_assign)
8000 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
8001 if (property_attributes & DW_APPLE_PROPERTY_retain)
8002 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
8003 if (property_attributes & DW_APPLE_PROPERTY_copy)
8004 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
8005 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
8006 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
8007
8008 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
8009 {
8010 const bool isInstance = true;
8011 const bool isVariadic = false;
8012 const bool isSynthesized = false;
8013 const bool isImplicitlyDeclared = true;
8014 const bool isDefined = false;
8015 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8016 const bool HasRelatedResultType = false;
8017
8018 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create (*clang_ast,
8019 clang::SourceLocation(),
8020 clang::SourceLocation(),
8021 getter_sel,
8022 GetQualType(property_clang_type_to_access),
8023 nullptr,
8024 class_interface_decl,
8025 isInstance,
8026 isVariadic,
8027 isSynthesized,
8028 isImplicitlyDeclared,
8029 isDefined,
8030 impControl,
8031 HasRelatedResultType);
8032
8033 if (getter && metadata)
8034 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
8035
8036 if (getter)
8037 {
8038 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
8039
8040 class_interface_decl->addDecl(getter);
8041 }
8042 }
8043
8044 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
8045 {
8046 clang::QualType result_type = clang_ast->VoidTy;
8047
8048 const bool isInstance = true;
8049 const bool isVariadic = false;
8050 const bool isSynthesized = false;
8051 const bool isImplicitlyDeclared = true;
8052 const bool isDefined = false;
8053 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8054 const bool HasRelatedResultType = false;
8055
8056 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
8057 clang::SourceLocation(),
8058 clang::SourceLocation(),
8059 setter_sel,
8060 result_type,
8061 nullptr,
8062 class_interface_decl,
8063 isInstance,
8064 isVariadic,
8065 isSynthesized,
8066 isImplicitlyDeclared,
8067 isDefined,
8068 impControl,
8069 HasRelatedResultType);
8070
8071 if (setter && metadata)
8072 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
8073
8074 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
8075
8076 params.push_back (clang::ParmVarDecl::Create (*clang_ast,
8077 setter,
8078 clang::SourceLocation(),
8079 clang::SourceLocation(),
8080 nullptr, // anonymous
8081 GetQualType(property_clang_type_to_access),
8082 nullptr,
8083 clang::SC_Auto,
8084 nullptr));
8085
8086 if (setter)
8087 {
8088 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8089
8090 class_interface_decl->addDecl(setter);
8091 }
8092 }
8093
8094 return true;
8095 }
8096 }
8097 }
8098 return false;
8099}
8100
8101bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008102ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00008103{
8104 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8105 if (class_interface_decl)
8106 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
8107 return false;
8108}
8109
8110
8111clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00008112ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008113 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 +00008114 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008115 lldb::AccessType access,
8116 bool is_artificial)
8117{
8118 if (!type || !method_clang_type.IsValid())
8119 return nullptr;
8120
8121 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
8122
8123 if (class_interface_decl == nullptr)
8124 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00008125 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8126 if (lldb_ast == nullptr)
8127 return nullptr;
8128 clang::ASTContext *ast = lldb_ast->getASTContext();
8129
Greg Claytond8d4a572015-08-11 21:38:15 +00008130 const char *selector_start = ::strchr (name, ' ');
8131 if (selector_start == nullptr)
8132 return nullptr;
8133
8134 selector_start++;
8135 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
8136
8137 size_t len = 0;
8138 const char *start;
8139 //printf ("name = '%s'\n", name);
8140
8141 unsigned num_selectors_with_args = 0;
8142 for (start = selector_start;
8143 start && *start != '\0' && *start != ']';
8144 start += len)
8145 {
8146 len = ::strcspn(start, ":]");
8147 bool has_arg = (start[len] == ':');
8148 if (has_arg)
8149 ++num_selectors_with_args;
8150 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
8151 if (has_arg)
8152 len += 1;
8153 }
8154
8155
8156 if (selector_idents.size() == 0)
8157 return nullptr;
8158
8159 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
8160 selector_idents.data());
8161
8162 clang::QualType method_qual_type (GetQualType(method_clang_type));
8163
8164 // Populate the method decl with parameter decls
8165 const clang::Type *method_type(method_qual_type.getTypePtr());
8166
8167 if (method_type == nullptr)
8168 return nullptr;
8169
8170 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
8171
8172 if (!method_function_prototype)
8173 return nullptr;
8174
8175
8176 bool is_variadic = false;
8177 bool is_synthesized = false;
8178 bool is_defined = false;
8179 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
8180
8181 const unsigned num_args = method_function_prototype->getNumParams();
8182
8183 if (num_args != num_selectors_with_args)
8184 return nullptr; // some debug information is corrupt. We are not going to deal with it.
8185
8186 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create (*ast,
8187 clang::SourceLocation(), // beginLoc,
8188 clang::SourceLocation(), // endLoc,
8189 method_selector,
8190 method_function_prototype->getReturnType(),
8191 nullptr, // TypeSourceInfo *ResultTInfo,
8192 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(GetQualType(type)),
8193 name[0] == '-',
8194 is_variadic,
8195 is_synthesized,
8196 true, // is_implicitly_declared; we force this to true because we don't have source locations
8197 is_defined,
8198 imp_control,
8199 false /*has_related_result_type*/);
8200
8201
8202 if (objc_method_decl == nullptr)
8203 return nullptr;
8204
8205 if (num_args > 0)
8206 {
8207 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
8208
8209 for (unsigned param_index = 0; param_index < num_args; ++param_index)
8210 {
8211 params.push_back (clang::ParmVarDecl::Create (*ast,
8212 objc_method_decl,
8213 clang::SourceLocation(),
8214 clang::SourceLocation(),
8215 nullptr, // anonymous
8216 method_function_prototype->getParamType(param_index),
8217 nullptr,
8218 clang::SC_Auto,
8219 nullptr));
8220 }
8221
8222 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8223 }
8224
8225 class_interface_decl->addDecl (objc_method_decl);
8226
8227#ifdef LLDB_CONFIGURATION_DEBUG
8228 VerifyDecl(objc_method_decl);
8229#endif
8230
8231 return objc_method_decl;
8232}
8233
8234bool
Greg Claytone6b36cd2015-12-08 01:02:08 +00008235ClangASTContext::GetHasExternalStorage (const CompilerType &type)
8236{
8237 if (IsClangType(type))
8238 return false;
8239
8240 clang::QualType qual_type (GetCanonicalQualType(type));
8241
8242 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8243 switch (type_class)
8244 {
8245 case clang::Type::Record:
8246 {
8247 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8248 if (cxx_record_decl)
8249 return cxx_record_decl->hasExternalLexicalStorage () || cxx_record_decl->hasExternalVisibleStorage();
8250 }
8251 break;
8252
8253 case clang::Type::Enum:
8254 {
8255 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8256 if (enum_decl)
8257 return enum_decl->hasExternalLexicalStorage () || enum_decl->hasExternalVisibleStorage();
8258 }
8259 break;
8260
8261 case clang::Type::ObjCObject:
8262 case clang::Type::ObjCInterface:
8263 {
8264 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8265 assert (objc_class_type);
8266 if (objc_class_type)
8267 {
8268 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8269
8270 if (class_interface_decl)
8271 return class_interface_decl->hasExternalLexicalStorage () || class_interface_decl->hasExternalVisibleStorage ();
8272 }
8273 }
8274 break;
8275
8276 case clang::Type::Typedef:
8277 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()));
8278
8279 case clang::Type::Elaborated:
8280 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
8281
8282 case clang::Type::Paren:
8283 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
8284
8285 default:
8286 break;
8287 }
8288 return false;
8289}
8290
8291
8292bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008293ClangASTContext::SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool has_extern)
Greg Claytond8d4a572015-08-11 21:38:15 +00008294{
8295 if (!type)
8296 return false;
8297
8298 clang::QualType qual_type (GetCanonicalQualType(type));
8299
8300 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8301 switch (type_class)
8302 {
8303 case clang::Type::Record:
8304 {
8305 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8306 if (cxx_record_decl)
8307 {
8308 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
8309 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
8310 return true;
8311 }
8312 }
8313 break;
8314
8315 case clang::Type::Enum:
8316 {
8317 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8318 if (enum_decl)
8319 {
8320 enum_decl->setHasExternalLexicalStorage (has_extern);
8321 enum_decl->setHasExternalVisibleStorage (has_extern);
8322 return true;
8323 }
8324 }
8325 break;
8326
8327 case clang::Type::ObjCObject:
8328 case clang::Type::ObjCInterface:
8329 {
8330 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8331 assert (objc_class_type);
8332 if (objc_class_type)
8333 {
8334 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8335
8336 if (class_interface_decl)
8337 {
8338 class_interface_decl->setHasExternalLexicalStorage (has_extern);
8339 class_interface_decl->setHasExternalVisibleStorage (has_extern);
8340 return true;
8341 }
8342 }
8343 }
8344 break;
8345
8346 case clang::Type::Typedef:
8347 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
8348
8349 case clang::Type::Elaborated:
8350 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
8351
8352 case clang::Type::Paren:
8353 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
8354
8355 default:
8356 break;
8357 }
8358 return false;
8359}
8360
8361
Greg Claytone6b36cd2015-12-08 01:02:08 +00008362bool
8363ClangASTContext::CanImport (const CompilerType &type, lldb_private::ClangASTImporter &importer)
8364{
8365 if (IsClangType(type))
8366 {
8367 // TODO: remove external completion BOOL
8368 // CompleteAndFetchChildren should get the Decl out and check for the
8369
8370 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
8371
8372 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8373 switch (type_class)
8374 {
8375 case clang::Type::Record:
8376 {
8377 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8378 if (cxx_record_decl)
8379 {
8380 if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL))
8381 return true;
8382 }
8383 }
8384 break;
8385
8386 case clang::Type::Enum:
8387 {
8388 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8389 if (enum_decl)
8390 {
8391 if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL))
8392 return true;
8393 }
8394 }
8395 break;
8396
8397 case clang::Type::ObjCObject:
8398 case clang::Type::ObjCInterface:
8399 {
8400 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
8401 if (objc_class_type)
8402 {
8403 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8404 // We currently can't complete objective C types through the newly added ASTContext
8405 // because it only supports TagDecl objects right now...
8406 if (class_interface_decl)
8407 {
8408 if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL))
8409 return true;
8410 }
8411 }
8412 }
8413 break;
8414
8415
8416 case clang::Type::Typedef:
8417 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer);
8418
8419 case clang::Type::Elaborated:
8420 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer);
8421
8422 case clang::Type::Paren:
8423 return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer);
8424
8425 default:
8426 break;
8427 }
8428 }
8429 return false;
8430}
8431bool
8432ClangASTContext::Import (const CompilerType &type, lldb_private::ClangASTImporter &importer)
8433{
8434 if (IsClangType(type))
8435 {
8436 // TODO: remove external completion BOOL
8437 // CompleteAndFetchChildren should get the Decl out and check for the
8438
8439 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
8440
8441 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8442 switch (type_class)
8443 {
8444 case clang::Type::Record:
8445 {
8446 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8447 if (cxx_record_decl)
8448 {
8449 if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL))
8450 return importer.CompleteAndFetchChildren(qual_type);
8451 }
8452 }
8453 break;
8454
8455 case clang::Type::Enum:
8456 {
8457 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8458 if (enum_decl)
8459 {
8460 if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL))
8461 return importer.CompleteAndFetchChildren(qual_type);
8462 }
8463 }
8464 break;
8465
8466 case clang::Type::ObjCObject:
8467 case clang::Type::ObjCInterface:
8468 {
8469 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
8470 if (objc_class_type)
8471 {
8472 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8473 // We currently can't complete objective C types through the newly added ASTContext
8474 // because it only supports TagDecl objects right now...
8475 if (class_interface_decl)
8476 {
8477 if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL))
8478 return importer.CompleteAndFetchChildren(qual_type);
8479 }
8480 }
8481 }
8482 break;
8483
8484
8485 case clang::Type::Typedef:
8486 return Import (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer);
8487
8488 case clang::Type::Elaborated:
8489 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer);
8490
8491 case clang::Type::Paren:
8492 return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer);
8493
8494 default:
8495 break;
8496 }
8497 }
8498 return false;
8499}
8500
8501
Greg Claytond8d4a572015-08-11 21:38:15 +00008502#pragma mark TagDecl
8503
8504bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008505ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008506{
Greg Claytone6b36cd2015-12-08 01:02:08 +00008507 clang::QualType qual_type (ClangASTContext::GetQualType(type));
8508 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008509 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008510 const clang::TagType *tag_type = qual_type->getAs<clang::TagType>();
8511 if (tag_type)
Greg Clayton5dfc4a42015-12-02 00:43:32 +00008512 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008513 clang::TagDecl *tag_decl = tag_type->getDecl();
8514 if (tag_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00008515 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008516 tag_decl->startDefinition();
8517 return true;
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008518 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00008519 }
8520
8521 const clang::ObjCObjectType *object_type = qual_type->getAs<clang::ObjCObjectType>();
8522 if (object_type)
8523 {
8524 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
8525 if (interface_decl)
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008526 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008527 interface_decl->startDefinition();
8528 return true;
Greg Claytond8d4a572015-08-11 21:38:15 +00008529 }
8530 }
8531 }
8532 return false;
8533}
8534
8535bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008536ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008537{
Greg Claytone6b36cd2015-12-08 01:02:08 +00008538 clang::QualType qual_type (ClangASTContext::GetQualType(type));
8539 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008540 {
Greg Claytond8d4a572015-08-11 21:38:15 +00008541 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8542
8543 if (cxx_record_decl)
8544 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008545 if (!cxx_record_decl->isCompleteDefinition())
8546 cxx_record_decl->completeDefinition();
8547 cxx_record_decl->setHasLoadedFieldsFromExternalStorage(true);
8548 cxx_record_decl->setHasExternalLexicalStorage (false);
8549 cxx_record_decl->setHasExternalVisibleStorage (false);
Greg Claytond8d4a572015-08-11 21:38:15 +00008550 return true;
8551 }
8552
Greg Claytone6b36cd2015-12-08 01:02:08 +00008553 const clang::EnumType *enutype = qual_type->getAs<clang::EnumType>();
Greg Claytond8d4a572015-08-11 21:38:15 +00008554
8555 if (enutype)
8556 {
8557 clang::EnumDecl *enum_decl = enutype->getDecl();
8558
8559 if (enum_decl)
8560 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008561 if (!enum_decl->isCompleteDefinition())
Greg Claytond8d4a572015-08-11 21:38:15 +00008562 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008563 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8564 if (lldb_ast == nullptr)
8565 return false;
8566 clang::ASTContext *ast = lldb_ast->getASTContext();
8567
8568 /// TODO This really needs to be fixed.
8569
8570 unsigned NumPositiveBits = 1;
8571 unsigned NumNegativeBits = 0;
8572
8573 clang::QualType promotion_qual_type;
8574 // If the enum integer type is less than an integer in bit width,
8575 // then we must promote it to an integer size.
8576 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
8577 {
8578 if (enum_decl->getIntegerType()->isSignedIntegerType())
8579 promotion_qual_type = ast->IntTy;
8580 else
8581 promotion_qual_type = ast->UnsignedIntTy;
8582 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008583 else
Greg Claytone6b36cd2015-12-08 01:02:08 +00008584 promotion_qual_type = enum_decl->getIntegerType();
8585
8586 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Claytond8d4a572015-08-11 21:38:15 +00008587 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008588 return true;
8589 }
8590 }
8591 }
8592 return false;
8593}
8594
Greg Claytond8d4a572015-08-11 21:38:15 +00008595bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008596ClangASTContext::AddEnumerationValueToEnumerationType (lldb::opaque_compiler_type_t type,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008597 const CompilerType &enumerator_clang_type,
8598 const Declaration &decl,
8599 const char *name,
8600 int64_t enum_value,
8601 uint32_t enum_value_bit_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008602{
8603 if (type && enumerator_clang_type.IsValid() && name && name[0])
8604 {
8605 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8606
8607 bool is_signed = false;
8608 enumerator_clang_type.IsIntegerType (is_signed);
8609 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8610 if (clang_type)
8611 {
8612 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8613
8614 if (enutype)
8615 {
8616 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
8617 enum_llvm_apsint = enum_value;
8618 clang::EnumConstantDecl *enumerator_decl =
8619 clang::EnumConstantDecl::Create (*getASTContext(),
8620 enutype->getDecl(),
8621 clang::SourceLocation(),
8622 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
8623 GetQualType(enumerator_clang_type),
8624 nullptr,
8625 enum_llvm_apsint);
8626
8627 if (enumerator_decl)
8628 {
8629 enutype->getDecl()->addDecl(enumerator_decl);
8630
8631#ifdef LLDB_CONFIGURATION_DEBUG
8632 VerifyDecl(enumerator_decl);
8633#endif
8634
8635 return true;
8636 }
8637 }
8638 }
8639 }
8640 return false;
8641}
8642
Greg Claytona1e5dc82015-08-11 22:53:00 +00008643CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008644ClangASTContext::GetEnumerationIntegerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008645{
8646 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8647 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8648 if (clang_type)
8649 {
8650 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8651 if (enutype)
8652 {
8653 clang::EnumDecl *enum_decl = enutype->getDecl();
8654 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008655 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008656 }
8657 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008658 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008659}
8660
Greg Claytona1e5dc82015-08-11 22:53:00 +00008661CompilerType
8662ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008663{
8664 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8665 {
Greg Claytonf73034f2015-09-08 18:15:05 +00008666 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008667 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008668 return CompilerType();
8669 return CompilerType (ast->getASTContext(),
Greg Claytond8d4a572015-08-11 21:38:15 +00008670 ast->getASTContext()->getMemberPointerType (GetQualType(pointee_type),
8671 GetQualType(type).getTypePtr()));
8672 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008673 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008674}
8675
8676
8677size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008678ClangASTContext::ConvertStringToFloatValue (lldb::opaque_compiler_type_t type, const char *s, uint8_t *dst, size_t dst_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008679{
8680 if (type)
8681 {
8682 clang::QualType qual_type (GetCanonicalQualType(type));
8683 uint32_t count = 0;
8684 bool is_complex = false;
8685 if (IsFloatingPointType (type, count, is_complex))
8686 {
8687 // TODO: handle complex and vector types
8688 if (count != 1)
8689 return false;
8690
8691 llvm::StringRef s_sref(s);
8692 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8693
8694 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8695 const uint64_t byte_size = bit_size / 8;
8696 if (dst_size >= byte_size)
8697 {
8698 if (bit_size == sizeof(float)*8)
8699 {
8700 float float32 = ap_float.convertToFloat();
8701 ::memcpy (dst, &float32, byte_size);
8702 return byte_size;
8703 }
8704 else if (bit_size >= 64)
8705 {
8706 llvm::APInt ap_int(ap_float.bitcastToAPInt());
8707 ::memcpy (dst, ap_int.getRawData(), byte_size);
8708 return byte_size;
8709 }
8710 }
8711 }
8712 }
8713 return 0;
8714}
8715
8716
8717
8718//----------------------------------------------------------------------
8719// Dumping types
8720//----------------------------------------------------------------------
8721#define DEPTH_INCREMENT 2
8722
8723void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008724ClangASTContext::DumpValue (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00008725 Stream *s,
8726 lldb::Format format,
8727 const lldb_private::DataExtractor &data,
8728 lldb::offset_t data_byte_offset,
8729 size_t data_byte_size,
8730 uint32_t bitfield_bit_size,
8731 uint32_t bitfield_bit_offset,
8732 bool show_types,
8733 bool show_summary,
8734 bool verbose,
8735 uint32_t depth)
8736{
8737 if (!type)
8738 return;
8739
8740 clang::QualType qual_type(GetQualType(type));
8741 switch (qual_type->getTypeClass())
8742 {
8743 case clang::Type::Record:
8744 if (GetCompleteType(type))
8745 {
8746 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8747 const clang::RecordDecl *record_decl = record_type->getDecl();
8748 assert(record_decl);
8749 uint32_t field_bit_offset = 0;
8750 uint32_t field_byte_offset = 0;
8751 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8752 uint32_t child_idx = 0;
8753
8754 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8755 if (cxx_record_decl)
8756 {
8757 // We might have base classes to print out first
8758 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8759 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8760 base_class != base_class_end;
8761 ++base_class)
8762 {
8763 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8764
8765 // Skip empty base classes
8766 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8767 continue;
8768
8769 if (base_class->isVirtual())
8770 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8771 else
8772 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8773 field_byte_offset = field_bit_offset / 8;
8774 assert (field_bit_offset % 8 == 0);
8775 if (child_idx == 0)
8776 s->PutChar('{');
8777 else
8778 s->PutChar(',');
8779
8780 clang::QualType base_class_qual_type = base_class->getType();
8781 std::string base_class_type_name(base_class_qual_type.getAsString());
8782
8783 // Indent and print the base class type name
8784 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8785
8786 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8787
8788 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008789 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008790 base_clang_type.DumpValue (exe_ctx,
8791 s, // Stream to dump to
8792 base_clang_type.GetFormat(), // The format with which to display the member
8793 data, // Data buffer containing all bytes for this type
8794 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8795 base_class_type_info.Width / 8, // Size of this type in bytes
8796 0, // Bitfield bit size
8797 0, // Bitfield bit offset
8798 show_types, // Boolean indicating if we should show the variable types
8799 show_summary, // Boolean indicating if we should show a summary for the current type
8800 verbose, // Verbose output?
8801 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8802
8803 ++child_idx;
8804 }
8805 }
8806 uint32_t field_idx = 0;
8807 clang::RecordDecl::field_iterator field, field_end;
8808 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8809 {
8810 // Print the starting squiggly bracket (if this is the
8811 // first member) or comma (for member 2 and beyond) for
8812 // the struct/union/class member.
8813 if (child_idx == 0)
8814 s->PutChar('{');
8815 else
8816 s->PutChar(',');
8817
8818 // Indent
8819 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8820
8821 clang::QualType field_type = field->getType();
8822 // Print the member type if requested
8823 // Figure out the type byte size (field_type_info.first) and
8824 // alignment (field_type_info.second) from the AST context.
8825 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8826 assert(field_idx < record_layout.getFieldCount());
8827 // Figure out the field offset within the current struct/union/class type
8828 field_bit_offset = record_layout.getFieldOffset (field_idx);
8829 field_byte_offset = field_bit_offset / 8;
8830 uint32_t field_bitfield_bit_size = 0;
8831 uint32_t field_bitfield_bit_offset = 0;
8832 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8833 field_bitfield_bit_offset = field_bit_offset % 8;
8834
8835 if (show_types)
8836 {
8837 std::string field_type_name(field_type.getAsString());
8838 if (field_bitfield_bit_size > 0)
8839 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
8840 else
8841 s->Printf("(%s) ", field_type_name.c_str());
8842 }
8843 // Print the member name and equal sign
8844 s->Printf("%s = ", field->getNameAsString().c_str());
8845
8846
8847 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008848 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008849 field_clang_type.DumpValue (exe_ctx,
8850 s, // Stream to dump to
8851 field_clang_type.GetFormat(), // The format with which to display the member
8852 data, // Data buffer containing all bytes for this type
8853 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8854 field_type_info.Width / 8, // Size of this type in bytes
8855 field_bitfield_bit_size, // Bitfield bit size
8856 field_bitfield_bit_offset, // Bitfield bit offset
8857 show_types, // Boolean indicating if we should show the variable types
8858 show_summary, // Boolean indicating if we should show a summary for the current type
8859 verbose, // Verbose output?
8860 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8861 }
8862
8863 // Indent the trailing squiggly bracket
8864 if (child_idx > 0)
8865 s->Printf("\n%*s}", depth, "");
8866 }
8867 return;
8868
8869 case clang::Type::Enum:
8870 if (GetCompleteType(type))
8871 {
8872 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
8873 const clang::EnumDecl *enum_decl = enutype->getDecl();
8874 assert(enum_decl);
8875 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
8876 lldb::offset_t offset = data_byte_offset;
8877 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
8878 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
8879 {
8880 if (enum_pos->getInitVal() == enum_value)
8881 {
8882 s->Printf("%s", enum_pos->getNameAsString().c_str());
8883 return;
8884 }
8885 }
8886 // If we have gotten here we didn't get find the enumerator in the
8887 // enum decl, so just print the integer.
8888 s->Printf("%" PRIi64, enum_value);
8889 }
8890 return;
8891
8892 case clang::Type::ConstantArray:
8893 {
8894 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
8895 bool is_array_of_characters = false;
8896 clang::QualType element_qual_type = array->getElementType();
8897
8898 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
8899 if (canonical_type)
8900 is_array_of_characters = canonical_type->isCharType();
8901
8902 const uint64_t element_count = array->getSize().getLimitedValue();
8903
8904 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
8905
8906 uint32_t element_idx = 0;
8907 uint32_t element_offset = 0;
8908 uint64_t element_byte_size = field_type_info.Width / 8;
8909 uint32_t element_stride = element_byte_size;
8910
8911 if (is_array_of_characters)
8912 {
8913 s->PutChar('"');
8914 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
8915 s->PutChar('"');
8916 return;
8917 }
8918 else
8919 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008920 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008921 lldb::Format element_format = element_clang_type.GetFormat();
8922
8923 for (element_idx = 0; element_idx < element_count; ++element_idx)
8924 {
8925 // Print the starting squiggly bracket (if this is the
8926 // first member) or comman (for member 2 and beyong) for
8927 // the struct/union/class member.
8928 if (element_idx == 0)
8929 s->PutChar('{');
8930 else
8931 s->PutChar(',');
8932
8933 // Indent and print the index
8934 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
8935
8936 // Figure out the field offset within the current struct/union/class type
8937 element_offset = element_idx * element_stride;
8938
8939 // Dump the value of the member
8940 element_clang_type.DumpValue (exe_ctx,
8941 s, // Stream to dump to
8942 element_format, // The format with which to display the element
8943 data, // Data buffer containing all bytes for this type
8944 data_byte_offset + element_offset,// Offset into "data" where to grab value from
8945 element_byte_size, // Size of this type in bytes
8946 0, // Bitfield bit size
8947 0, // Bitfield bit offset
8948 show_types, // Boolean indicating if we should show the variable types
8949 show_summary, // Boolean indicating if we should show a summary for the current type
8950 verbose, // Verbose output?
8951 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8952 }
8953
8954 // Indent the trailing squiggly bracket
8955 if (element_idx > 0)
8956 s->Printf("\n%*s}", depth, "");
8957 }
8958 }
8959 return;
8960
8961 case clang::Type::Typedef:
8962 {
8963 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
8964
Greg Claytona1e5dc82015-08-11 22:53:00 +00008965 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008966 lldb::Format typedef_format = typedef_clang_type.GetFormat();
8967 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
8968 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
8969
8970 return typedef_clang_type.DumpValue (exe_ctx,
8971 s, // Stream to dump to
8972 typedef_format, // The format with which to display the element
8973 data, // Data buffer containing all bytes for this type
8974 data_byte_offset, // Offset into "data" where to grab value from
8975 typedef_byte_size, // Size of this type in bytes
8976 bitfield_bit_size, // Bitfield bit size
8977 bitfield_bit_offset,// Bitfield bit offset
8978 show_types, // Boolean indicating if we should show the variable types
8979 show_summary, // Boolean indicating if we should show a summary for the current type
8980 verbose, // Verbose output?
8981 depth); // Scope depth for any types that have children
8982 }
8983 break;
8984
8985 case clang::Type::Elaborated:
8986 {
8987 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00008988 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008989 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
8990 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
8991 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
8992
8993 return elaborated_clang_type.DumpValue (exe_ctx,
8994 s, // Stream to dump to
8995 elaborated_format, // The format with which to display the element
8996 data, // Data buffer containing all bytes for this type
8997 data_byte_offset, // Offset into "data" where to grab value from
8998 elaborated_byte_size, // Size of this type in bytes
8999 bitfield_bit_size, // Bitfield bit size
9000 bitfield_bit_offset,// Bitfield bit offset
9001 show_types, // Boolean indicating if we should show the variable types
9002 show_summary, // Boolean indicating if we should show a summary for the current type
9003 verbose, // Verbose output?
9004 depth); // Scope depth for any types that have children
9005 }
9006 break;
9007
9008 case clang::Type::Paren:
9009 {
9010 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009011 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009012
9013 lldb::Format desugar_format = desugar_clang_type.GetFormat();
9014 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
9015 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
9016
9017 return desugar_clang_type.DumpValue (exe_ctx,
9018 s, // Stream to dump to
9019 desugar_format, // The format with which to display the element
9020 data, // Data buffer containing all bytes for this type
9021 data_byte_offset, // Offset into "data" where to grab value from
9022 desugar_byte_size, // Size of this type in bytes
9023 bitfield_bit_size, // Bitfield bit size
9024 bitfield_bit_offset,// Bitfield bit offset
9025 show_types, // Boolean indicating if we should show the variable types
9026 show_summary, // Boolean indicating if we should show a summary for the current type
9027 verbose, // Verbose output?
9028 depth); // Scope depth for any types that have children
9029 }
9030 break;
9031
9032 default:
9033 // We are down to a scalar type that we just need to display.
9034 data.Dump(s,
9035 data_byte_offset,
9036 format,
9037 data_byte_size,
9038 1,
9039 UINT32_MAX,
9040 LLDB_INVALID_ADDRESS,
9041 bitfield_bit_size,
9042 bitfield_bit_offset);
9043
9044 if (show_summary)
9045 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
9046 break;
9047 }
9048}
9049
9050
9051
9052
9053bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009054ClangASTContext::DumpTypeValue (lldb::opaque_compiler_type_t type, Stream *s,
Greg Claytond8d4a572015-08-11 21:38:15 +00009055 lldb::Format format,
9056 const lldb_private::DataExtractor &data,
9057 lldb::offset_t byte_offset,
9058 size_t byte_size,
9059 uint32_t bitfield_bit_size,
9060 uint32_t bitfield_bit_offset,
9061 ExecutionContextScope *exe_scope)
9062{
9063 if (!type)
9064 return false;
9065 if (IsAggregateType(type))
9066 {
9067 return false;
9068 }
9069 else
9070 {
9071 clang::QualType qual_type(GetQualType(type));
9072
9073 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9074 switch (type_class)
9075 {
9076 case clang::Type::Typedef:
9077 {
9078 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009079 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009080 if (format == eFormatDefault)
9081 format = typedef_clang_type.GetFormat();
9082 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
9083 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
9084
9085 return typedef_clang_type.DumpTypeValue (s,
9086 format, // The format with which to display the element
9087 data, // Data buffer containing all bytes for this type
9088 byte_offset, // Offset into "data" where to grab value from
9089 typedef_byte_size, // Size of this type in bytes
9090 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
9091 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
9092 exe_scope);
9093 }
9094 break;
9095
9096 case clang::Type::Enum:
9097 // If our format is enum or default, show the enumeration value as
9098 // its enumeration string value, else just display it as requested.
9099 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
9100 {
9101 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
9102 const clang::EnumDecl *enum_decl = enutype->getDecl();
9103 assert(enum_decl);
9104 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
9105 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
9106 lldb::offset_t offset = byte_offset;
9107 if (is_signed)
9108 {
9109 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
9110 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9111 {
9112 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
9113 {
9114 s->PutCString (enum_pos->getNameAsString().c_str());
9115 return true;
9116 }
9117 }
9118 // If we have gotten here we didn't get find the enumerator in the
9119 // enum decl, so just print the integer.
9120 s->Printf("%" PRIi64, enum_svalue);
9121 }
9122 else
9123 {
9124 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
9125 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9126 {
9127 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
9128 {
9129 s->PutCString (enum_pos->getNameAsString().c_str());
9130 return true;
9131 }
9132 }
9133 // If we have gotten here we didn't get find the enumerator in the
9134 // enum decl, so just print the integer.
9135 s->Printf("%" PRIu64, enum_uvalue);
9136 }
9137 return true;
9138 }
9139 // format was not enum, just fall through and dump the value as requested....
9140
9141 default:
9142 // We are down to a scalar type that we just need to display.
9143 {
9144 uint32_t item_count = 1;
9145 // A few formats, we might need to modify our size and count for depending
9146 // on how we are trying to display the value...
9147 switch (format)
9148 {
9149 default:
9150 case eFormatBoolean:
9151 case eFormatBinary:
9152 case eFormatComplex:
9153 case eFormatCString: // NULL terminated C strings
9154 case eFormatDecimal:
9155 case eFormatEnum:
9156 case eFormatHex:
9157 case eFormatHexUppercase:
9158 case eFormatFloat:
9159 case eFormatOctal:
9160 case eFormatOSType:
9161 case eFormatUnsigned:
9162 case eFormatPointer:
9163 case eFormatVectorOfChar:
9164 case eFormatVectorOfSInt8:
9165 case eFormatVectorOfUInt8:
9166 case eFormatVectorOfSInt16:
9167 case eFormatVectorOfUInt16:
9168 case eFormatVectorOfSInt32:
9169 case eFormatVectorOfUInt32:
9170 case eFormatVectorOfSInt64:
9171 case eFormatVectorOfUInt64:
9172 case eFormatVectorOfFloat32:
9173 case eFormatVectorOfFloat64:
9174 case eFormatVectorOfUInt128:
9175 break;
9176
9177 case eFormatChar:
9178 case eFormatCharPrintable:
9179 case eFormatCharArray:
9180 case eFormatBytes:
9181 case eFormatBytesWithASCII:
9182 item_count = byte_size;
9183 byte_size = 1;
9184 break;
9185
9186 case eFormatUnicode16:
9187 item_count = byte_size / 2;
9188 byte_size = 2;
9189 break;
9190
9191 case eFormatUnicode32:
9192 item_count = byte_size / 4;
9193 byte_size = 4;
9194 break;
9195 }
9196 return data.Dump (s,
9197 byte_offset,
9198 format,
9199 byte_size,
9200 item_count,
9201 UINT32_MAX,
9202 LLDB_INVALID_ADDRESS,
9203 bitfield_bit_size,
9204 bitfield_bit_offset,
9205 exe_scope);
9206 }
9207 break;
9208 }
9209 }
9210 return 0;
9211}
9212
9213
9214
9215void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009216ClangASTContext::DumpSummary (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00009217 Stream *s,
9218 const lldb_private::DataExtractor &data,
9219 lldb::offset_t data_byte_offset,
9220 size_t data_byte_size)
9221{
9222 uint32_t length = 0;
9223 if (IsCStringType (type, length))
9224 {
9225 if (exe_ctx)
9226 {
9227 Process *process = exe_ctx->GetProcessPtr();
9228 if (process)
9229 {
9230 lldb::offset_t offset = data_byte_offset;
9231 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
9232 std::vector<uint8_t> buf;
9233 if (length > 0)
9234 buf.resize (length);
9235 else
9236 buf.resize (256);
9237
9238 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
9239 buf.back() = '\0';
9240 size_t bytes_read;
9241 size_t total_cstr_len = 0;
9242 Error error;
9243 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
9244 {
9245 const size_t len = strlen((const char *)&buf.front());
9246 if (len == 0)
9247 break;
9248 if (total_cstr_len == 0)
9249 s->PutCString (" \"");
9250 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
9251 total_cstr_len += len;
9252 if (len < buf.size())
9253 break;
9254 pointer_address += total_cstr_len;
9255 }
9256 if (total_cstr_len > 0)
9257 s->PutChar ('"');
9258 }
9259 }
9260 }
9261}
9262
9263void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009264ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00009265{
9266 StreamFile s (stdout, false);
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00009267 DumpTypeDescription (type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009268 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
9269 if (metadata)
9270 {
9271 metadata->Dump (&s);
9272 }
9273}
9274
9275void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009276ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type, Stream *s)
Greg Claytond8d4a572015-08-11 21:38:15 +00009277{
9278 if (type)
9279 {
9280 clang::QualType qual_type(GetQualType(type));
9281
9282 llvm::SmallVector<char, 1024> buf;
9283 llvm::raw_svector_ostream llvm_ostrm (buf);
9284
9285 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9286 switch (type_class)
9287 {
9288 case clang::Type::ObjCObject:
9289 case clang::Type::ObjCInterface:
9290 {
9291 GetCompleteType(type);
9292
9293 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
9294 assert (objc_class_type);
9295 if (objc_class_type)
9296 {
9297 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9298 if (class_interface_decl)
9299 {
9300 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
9301 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
9302 }
9303 }
9304 }
9305 break;
9306
9307 case clang::Type::Typedef:
9308 {
9309 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
9310 if (typedef_type)
9311 {
9312 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
9313 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
9314 if (!clang_typedef_name.empty())
9315 {
9316 s->PutCString ("typedef ");
9317 s->PutCString (clang_typedef_name.c_str());
9318 }
9319 }
9320 }
9321 break;
9322
9323 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009324 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009325 return;
9326
9327 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009328 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009329 return;
9330
9331 case clang::Type::Record:
9332 {
9333 GetCompleteType(type);
9334
9335 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
9336 const clang::RecordDecl *record_decl = record_type->getDecl();
9337 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
9338
9339 if (cxx_record_decl)
9340 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9341 else
9342 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9343 }
9344 break;
9345
9346 default:
9347 {
9348 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
9349 if (tag_type)
9350 {
9351 clang::TagDecl *tag_decl = tag_type->getDecl();
9352 if (tag_decl)
9353 tag_decl->print(llvm_ostrm, 0);
9354 }
9355 else
9356 {
9357 std::string clang_type_name(qual_type.getAsString());
9358 if (!clang_type_name.empty())
9359 s->PutCString (clang_type_name.c_str());
9360 }
9361 }
9362 }
9363
Greg Claytond8d4a572015-08-11 21:38:15 +00009364 if (buf.size() > 0)
9365 {
9366 s->Write (buf.data(), buf.size());
9367 }
9368 }
9369}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009370
Greg Claytone6b36cd2015-12-08 01:02:08 +00009371void
9372ClangASTContext::DumpTypeName (const CompilerType &type)
9373{
9374 if (IsClangType(type))
9375 {
9376 clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type)));
9377
9378 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9379 switch (type_class)
9380 {
9381 case clang::Type::Record:
9382 {
9383 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
9384 if (cxx_record_decl)
9385 printf("class %s", cxx_record_decl->getName().str().c_str());
9386 }
9387 break;
9388
9389 case clang::Type::Enum:
9390 {
9391 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
9392 if (enum_decl)
9393 {
9394 printf("enum %s", enum_decl->getName().str().c_str());
9395 }
9396 }
9397 break;
9398
9399 case clang::Type::ObjCObject:
9400 case clang::Type::ObjCInterface:
9401 {
9402 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
9403 if (objc_class_type)
9404 {
9405 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9406 // We currently can't complete objective C types through the newly added ASTContext
9407 // because it only supports TagDecl objects right now...
9408 if (class_interface_decl)
9409 printf("@class %s", class_interface_decl->getName().str().c_str());
9410 }
9411 }
9412 break;
9413
9414
9415 case clang::Type::Typedef:
9416 printf("typedef %s", llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getName().str().c_str());
9417 break;
9418
9419 case clang::Type::Elaborated:
9420 printf("elaborated ");
9421 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
9422
9423 case clang::Type::Paren:
9424 printf("paren ");
9425 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
9426
9427 default:
9428 printf("ClangASTContext::DumpTypeName() type_class = %u", type_class);
9429 break;
9430 }
9431 }
9432
9433}
9434
9435
9436
Greg Clayton8b4edba2015-08-14 20:02:05 +00009437clang::ClassTemplateDecl *
Greg Clayton6071e6f2015-08-26 22:57:51 +00009438ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009439 lldb::AccessType access_type,
9440 const char *parent_name,
9441 int tag_decl_kind,
9442 const ClangASTContext::TemplateParameterInfos &template_param_infos)
9443{
9444 if (template_param_infos.IsValid())
9445 {
9446 std::string template_basename(parent_name);
9447 template_basename.erase (template_basename.find('<'));
9448
9449 return CreateClassTemplateDecl (decl_ctx,
9450 access_type,
9451 template_basename.c_str(),
9452 tag_decl_kind,
9453 template_param_infos);
9454 }
9455 return NULL;
9456}
9457
Greg Clayton6dc8d582015-08-18 22:32:36 +00009458void
9459ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl)
9460{
9461 ClangASTContext *ast = (ClangASTContext *)baton;
9462 SymbolFile *sym_file = ast->GetSymbolFile();
9463 if (sym_file)
9464 {
9465 CompilerType clang_type = GetTypeForDecl (decl);
9466 if (clang_type)
9467 sym_file->CompleteType (clang_type);
9468 }
9469}
9470
9471void
9472ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
9473{
9474 ClangASTContext *ast = (ClangASTContext *)baton;
9475 SymbolFile *sym_file = ast->GetSymbolFile();
9476 if (sym_file)
9477 {
9478 CompilerType clang_type = GetTypeForDecl (decl);
9479 if (clang_type)
9480 sym_file->CompleteType (clang_type);
9481 }
9482}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009483
Greg Clayton261ac3f2015-08-28 01:01:03 +00009484
9485DWARFASTParser *
9486ClangASTContext::GetDWARFParser ()
9487{
9488 if (!m_dwarf_ast_parser_ap)
9489 m_dwarf_ast_parser_ap.reset(new DWARFASTParserClang(*this));
9490 return m_dwarf_ast_parser_ap.get();
9491}
9492
9493
Greg Clayton8b4edba2015-08-14 20:02:05 +00009494bool
Greg Clayton6dc8d582015-08-18 22:32:36 +00009495ClangASTContext::LayoutRecordType(void *baton,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009496 const clang::RecordDecl *record_decl,
9497 uint64_t &bit_size,
9498 uint64_t &alignment,
9499 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
9500 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
9501 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
9502{
Greg Clayton6dc8d582015-08-18 22:32:36 +00009503 ClangASTContext *ast = (ClangASTContext *)baton;
Greg Clayton261ac3f2015-08-28 01:01:03 +00009504 DWARFASTParserClang *dwarf_ast_parser = (DWARFASTParserClang *)ast->GetDWARFParser();
9505 return dwarf_ast_parser->LayoutRecordType(record_decl, bit_size, alignment, field_offsets, base_offsets, vbase_offsets);
Greg Clayton8b4edba2015-08-14 20:02:05 +00009506}
9507
Greg Clayton99558cc42015-08-24 23:46:31 +00009508//----------------------------------------------------------------------
Paul Hermand628cbb2015-09-15 23:44:17 +00009509// CompilerDecl override functions
9510//----------------------------------------------------------------------
9511lldb::VariableSP
9512ClangASTContext::DeclGetVariable (void *opaque_decl)
9513{
9514 if (llvm::dyn_cast<clang::VarDecl>((clang::Decl *)opaque_decl))
9515 {
9516 auto decl_search_it = m_decl_objects.find(opaque_decl);
9517 if (decl_search_it != m_decl_objects.end())
9518 return std::static_pointer_cast<Variable>(decl_search_it->second);
9519 }
9520 return VariableSP();
9521}
9522
9523void
9524ClangASTContext::DeclLinkToObject (void *opaque_decl, std::shared_ptr<void> object)
9525{
9526 if (m_decl_objects.find(opaque_decl) == m_decl_objects.end())
9527 m_decl_objects.insert(std::make_pair(opaque_decl, object));
9528}
9529
9530ConstString
9531ClangASTContext::DeclGetName (void *opaque_decl)
9532{
9533 if (opaque_decl)
9534 {
9535 clang::NamedDecl *nd = llvm::dyn_cast<NamedDecl>((clang::Decl*)opaque_decl);
9536 if (nd != nullptr)
Greg Claytonfe689042015-11-10 17:47:04 +00009537 return ConstString(nd->getDeclName().getAsString());
Paul Hermand628cbb2015-09-15 23:44:17 +00009538 }
9539 return ConstString();
9540}
9541
Greg Claytonfe689042015-11-10 17:47:04 +00009542ConstString
9543ClangASTContext::DeclGetMangledName (void *opaque_decl)
9544{
9545 if (opaque_decl)
9546 {
9547 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>((clang::Decl*)opaque_decl);
9548 if (nd != nullptr && !llvm::isa<clang::ObjCMethodDecl>(nd))
9549 {
9550 clang::MangleContext *mc = getMangleContext();
9551 if (mc && mc->shouldMangleCXXName(nd))
9552 {
9553 llvm::SmallVector<char, 1024> buf;
9554 llvm::raw_svector_ostream llvm_ostrm (buf);
9555 if (llvm::isa<clang::CXXConstructorDecl>(nd))
9556 {
9557 mc->mangleCXXCtor(llvm::dyn_cast<clang::CXXConstructorDecl>(nd), Ctor_Complete, llvm_ostrm);
9558 }
9559 else if (llvm::isa<clang::CXXDestructorDecl>(nd))
9560 {
9561 mc->mangleCXXDtor(llvm::dyn_cast<clang::CXXDestructorDecl>(nd), Dtor_Complete, llvm_ostrm);
9562 }
9563 else
9564 {
9565 mc->mangleName(nd, llvm_ostrm);
9566 }
9567 if (buf.size() > 0)
9568 return ConstString(buf.data(), buf.size());
9569 }
9570 }
9571 }
9572 return ConstString();
9573}
9574
9575CompilerDeclContext
9576ClangASTContext::DeclGetDeclContext (void *opaque_decl)
9577{
9578 if (opaque_decl)
9579 return CompilerDeclContext(this, ((clang::Decl*)opaque_decl)->getDeclContext());
9580 else
9581 return CompilerDeclContext();
9582}
9583
9584CompilerType
9585ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl)
9586{
9587 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9588 return CompilerType(this, func_decl->getReturnType().getAsOpaquePtr());
9589 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9590 return CompilerType(this, objc_method->getReturnType().getAsOpaquePtr());
9591 else
9592 return CompilerType();
9593}
9594
9595size_t
9596ClangASTContext::DeclGetFunctionNumArguments(void *opaque_decl)
9597{
9598 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9599 return func_decl->param_size();
9600 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9601 return objc_method->param_size();
9602 else
9603 return 0;
9604}
9605
9606CompilerType
9607ClangASTContext::DeclGetFunctionArgumentType (void *opaque_decl, size_t idx)
9608{
9609 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9610 {
9611 if (idx < func_decl->param_size())
9612 {
9613 ParmVarDecl *var_decl = func_decl->getParamDecl(idx);
9614 if (var_decl)
9615 return CompilerType(this, var_decl->getOriginalType().getAsOpaquePtr());
9616 }
9617 }
9618 else if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9619 {
9620 if (idx < objc_method->param_size())
9621 return CompilerType(this, objc_method->parameters()[idx]->getOriginalType().getAsOpaquePtr());
9622 }
9623 return CompilerType();
9624}
9625
Paul Hermand628cbb2015-09-15 23:44:17 +00009626//----------------------------------------------------------------------
Greg Clayton99558cc42015-08-24 23:46:31 +00009627// CompilerDeclContext functions
9628//----------------------------------------------------------------------
9629
Greg Claytondfc09622015-12-08 18:39:50 +00009630std::vector<CompilerDecl>
Paul Hermand628cbb2015-09-15 23:44:17 +00009631ClangASTContext::DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name)
9632{
Greg Claytondfc09622015-12-08 18:39:50 +00009633 std::vector<CompilerDecl> found_decls;
Paul Hermand628cbb2015-09-15 23:44:17 +00009634 if (opaque_decl_ctx)
9635 {
9636 DeclContext *root_decl_ctx = (DeclContext *)opaque_decl_ctx;
9637 std::set<DeclContext *> searched;
9638 std::multimap<DeclContext *, DeclContext *> search_queue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009639 SymbolFile *symbol_file = GetSymbolFile();
Paul Hermand628cbb2015-09-15 23:44:17 +00009640
9641 for (clang::DeclContext *decl_context = root_decl_ctx; decl_context != nullptr && found_decls.empty(); decl_context = decl_context->getParent())
9642 {
9643 search_queue.insert(std::make_pair(decl_context, decl_context));
9644
9645 for (auto it = search_queue.find(decl_context); it != search_queue.end(); it++)
9646 {
Eugene Leviantc1ba9fc2015-11-13 11:00:10 +00009647 if (!searched.insert(it->second).second)
9648 continue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009649 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9650
Paul Hermand628cbb2015-09-15 23:44:17 +00009651 for (clang::Decl *child : it->second->decls())
9652 {
Paul Hermanea188fc2015-09-16 18:48:30 +00009653 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
Paul Hermand628cbb2015-09-15 23:44:17 +00009654 {
9655 clang::DeclContext *from = ud->getCommonAncestor();
9656 if (searched.find(ud->getNominatedNamespace()) == searched.end())
9657 search_queue.insert(std::make_pair(from, ud->getNominatedNamespace()));
9658 }
9659 else if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9660 {
9661 for (clang::UsingShadowDecl *usd : ud->shadows())
9662 {
9663 clang::Decl *target = usd->getTargetDecl();
9664 if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target))
9665 {
9666 IdentifierInfo *ii = nd->getIdentifier();
9667 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009668 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermand628cbb2015-09-15 23:44:17 +00009669 }
9670 }
9671 }
Paul Hermanea188fc2015-09-16 18:48:30 +00009672 else if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(child))
9673 {
9674 IdentifierInfo *ii = nd->getIdentifier();
9675 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009676 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermanea188fc2015-09-16 18:48:30 +00009677 }
Paul Hermand628cbb2015-09-15 23:44:17 +00009678 }
9679 }
9680 }
9681 }
9682 return found_decls;
9683}
9684
Greg Clayton99558cc42015-08-24 23:46:31 +00009685bool
9686ClangASTContext::DeclContextIsStructUnionOrClass (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00009687{
Greg Clayton99558cc42015-08-24 23:46:31 +00009688 if (opaque_decl_ctx)
9689 return ((clang::DeclContext *)opaque_decl_ctx)->isRecord();
9690 else
9691 return false;
Greg Clayton8b4edba2015-08-14 20:02:05 +00009692}
9693
Greg Clayton99558cc42015-08-24 23:46:31 +00009694ConstString
9695ClangASTContext::DeclContextGetName (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +00009696{
Greg Clayton99558cc42015-08-24 23:46:31 +00009697 if (opaque_decl_ctx)
9698 {
9699 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
9700 if (named_decl)
9701 return ConstString(named_decl->getName());
9702 }
9703 return ConstString();
9704}
9705
9706bool
9707ClangASTContext::DeclContextIsClassMethod (void *opaque_decl_ctx,
9708 lldb::LanguageType *language_ptr,
9709 bool *is_instance_method_ptr,
9710 ConstString *language_object_name_ptr)
9711{
9712 if (opaque_decl_ctx)
9713 {
9714 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
9715 if (ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
9716 {
9717 if (is_instance_method_ptr)
9718 *is_instance_method_ptr = objc_method->isInstanceMethod();
9719 if (language_ptr)
9720 *language_ptr = eLanguageTypeObjC;
9721 if (language_object_name_ptr)
9722 language_object_name_ptr->SetCString("self");
9723 return true;
9724 }
9725 else if (CXXMethodDecl *cxx_method = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
9726 {
9727 if (is_instance_method_ptr)
9728 *is_instance_method_ptr = cxx_method->isInstance();
9729 if (language_ptr)
9730 *language_ptr = eLanguageTypeC_plus_plus;
9731 if (language_object_name_ptr)
9732 language_object_name_ptr->SetCString("this");
9733 return true;
9734 }
9735 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
9736 {
9737 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
9738 if (metadata && metadata->HasObjectPtr())
9739 {
9740 if (is_instance_method_ptr)
9741 *is_instance_method_ptr = true;
9742 if (language_ptr)
9743 *language_ptr = eLanguageTypeObjC;
9744 if (language_object_name_ptr)
9745 language_object_name_ptr->SetCString (metadata->GetObjectPtrName());
9746 return true;
9747 }
9748 }
9749 }
9750 return false;
9751}
9752
9753clang::DeclContext *
9754ClangASTContext::DeclContextGetAsDeclContext (const CompilerDeclContext &dc)
9755{
9756 if (dc.IsClang())
9757 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
9758 return nullptr;
9759}
9760
9761
9762ObjCMethodDecl *
9763ClangASTContext::DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc)
9764{
9765 if (dc.IsClang())
9766 return llvm::dyn_cast<clang::ObjCMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
9767 return nullptr;
9768}
9769
9770CXXMethodDecl *
9771ClangASTContext::DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc)
9772{
9773 if (dc.IsClang())
9774 return llvm::dyn_cast<clang::CXXMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
9775 return nullptr;
9776}
9777
9778clang::FunctionDecl *
9779ClangASTContext::DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc)
9780{
9781 if (dc.IsClang())
9782 return llvm::dyn_cast<clang::FunctionDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
9783 return nullptr;
9784}
9785
9786clang::NamespaceDecl *
9787ClangASTContext::DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc)
9788{
9789 if (dc.IsClang())
9790 return llvm::dyn_cast<clang::NamespaceDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
9791 return nullptr;
9792}
9793
9794ClangASTMetadata *
9795ClangASTContext::DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object)
9796{
9797 clang::ASTContext *ast = DeclContextGetClangASTContext (dc);
9798 if (ast)
9799 return ClangASTContext::GetMetadata (ast, object);
9800 return nullptr;
9801}
9802
9803clang::ASTContext *
9804ClangASTContext::DeclContextGetClangASTContext (const CompilerDeclContext &dc)
9805{
Greg Claytonf73034f2015-09-08 18:15:05 +00009806 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
9807 if (ast)
9808 return ast->getASTContext();
Greg Clayton99558cc42015-08-24 23:46:31 +00009809 return nullptr;
Greg Clayton8b4edba2015-08-14 20:02:05 +00009810}
9811
Jim Ingham151c0322015-09-15 21:13:50 +00009812ClangASTContextForExpressions::ClangASTContextForExpressions (Target &target) :
9813 ClangASTContext (target.GetArchitecture().GetTriple().getTriple().c_str()),
Sean Callanan8f1f9a12015-09-30 19:57:57 +00009814 m_target_wp(target.shared_from_this()),
9815 m_persistent_variables (new ClangPersistentVariables)
Jim Ingham151c0322015-09-15 21:13:50 +00009816{
9817}
9818
9819UserExpression *
9820ClangASTContextForExpressions::GetUserExpression (const char *expr,
9821 const char *expr_prefix,
9822 lldb::LanguageType language,
Jim Ingham19a63fc2015-11-03 02:11:24 +00009823 Expression::ResultType desired_type,
9824 const EvaluateExpressionOptions &options)
Jim Ingham151c0322015-09-15 21:13:50 +00009825{
9826 TargetSP target_sp = m_target_wp.lock();
9827 if (!target_sp)
9828 return nullptr;
9829
Jim Ingham19a63fc2015-11-03 02:11:24 +00009830 return new ClangUserExpression(*target_sp.get(), expr, expr_prefix, language, desired_type, options);
Jim Ingham151c0322015-09-15 21:13:50 +00009831}
9832
9833FunctionCaller *
9834ClangASTContextForExpressions::GetFunctionCaller (const CompilerType &return_type,
9835 const Address& function_address,
9836 const ValueList &arg_value_list,
9837 const char *name)
9838{
9839 TargetSP target_sp = m_target_wp.lock();
9840 if (!target_sp)
9841 return nullptr;
9842
9843 Process *process = target_sp->GetProcessSP().get();
9844 if (!process)
9845 return nullptr;
9846
9847 return new ClangFunctionCaller (*process, return_type, function_address, arg_value_list, name);
9848}
9849
9850UtilityFunction *
9851ClangASTContextForExpressions::GetUtilityFunction (const char *text,
9852 const char *name)
9853{
Sean Callanan8f1f9a12015-09-30 19:57:57 +00009854 TargetSP target_sp = m_target_wp.lock();
Jim Ingham151c0322015-09-15 21:13:50 +00009855 if (!target_sp)
9856 return nullptr;
9857
9858 return new ClangUtilityFunction(*target_sp.get(), text, name);
9859}
Sean Callanan8f1f9a12015-09-30 19:57:57 +00009860
9861PersistentExpressionState *
9862ClangASTContextForExpressions::GetPersistentExpressionState ()
9863{
9864 return m_persistent_variables.get();
9865}